Arduino:Примеры/GSMExamplesGSMScanNetworks

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Сканирование сетей GSM[1]

Этот пример показывает IMEI-номер модема, потом проверяет, подключен ли он к оператору, а затем отображает мощность сигнала. Кроме того, он сканирует ближайшее сетевое пространство на наличие доступных сетей.

Необходимое оборудование

  • Плата Arduino;
  • Модуль Arduino + Telefonica GSM/GPRS Shield;
  • SIM-карта;

Цепь

GSMShield ArduinoUno.png

Изображение Arduino GSM Shield, установленного поверх Arduino Uno

Код

Сначала импортируем библиотеку GSM.

#include <GSM.h>

Функционал SIM-карты может быть заблокирован PIN-кодом, поэтому нам надо определить этот PIN-код в виде константы, для чего пригодится директива #define. Если PIN-кода нет, оставляем это место пустым.

#define PINNUMBER ""

Создаем экземпляры классов GSM, GSMScanner и GSMModem.

GSM gsmAccess;
GSMScanner scannerNetworks;
GSMModem modemTest;

Создаем переменную, в которой будет храниться IMEI-номер, а также статусное сообщение об ошибке, которое в случае необходимости будет выводиться на Serial Monitor.

String IMEI = "";
String errortext = "ERROR";

В секции setup() инициализируем последовательную передачу данных. Запустив соединение, отсылаем на Serial Monitor сообщение, оповещающее о начале работы скетча. Затем вызываем функцию scannerNetworks.begin(), чтобы перезагрузить модем.

void setup(){
  Serial.begin(9600); 
  Serial.println("GSM networks scanner");
  scannerNetworks.begin();

Создаем локальную переменную для отслеживания статуса соединения. Это нужно, чтобы скетч не начинал работать, пока SIM-карта не подключится к сети.

boolean notConnected = true;

Подключаемся к сети при помощи функции gmsAccess.begin(), где PIN-код будет в качестве аргумента. Помещаем ее в цикле while(), благодаря чему сможем постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение GSM_READY. Воспользуемся им как сигналом для того, чтобы задать переменной notConnected значение true или false. Если подключиться не удастся, сообщаем об этом через Serial Monitor.

 while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");
      delay(1000);
    }
  }

При помощи функции modemTest.getIMEI() получаем IMEI-номер модема, а затем выводим его на Serial Monitor.

Serial.print("Modem IMEI: ");
  IMEI = modemTest.getIMEI();
  IMEI.replace("\n","");
  if(IMEI != NULL)
    Serial.println(IMEI);

В секции loop() сканируем доступные сети, а затем выводим их на Serial Monitor. Это может занять некоторое время.

Serial.println("Scanning available networks. May take some seconds.");
  Serial.println(scannerNetworks.readNetworks());

Показываем на Serial Monitor оператора, который подключен в данный момент, а также мощность сигнала. Этот показатель будет варьироваться в диапазоне от 0 до 31, где «0» – это самый низкий, а «31» – самый высокий. Закрываем loop().

Serial.print("Current carrier: ");
  Serial.println(scannerNetworks.getCurrentCarrier());

  Serial.print("Signal Strength: ");
  Serial.print(scannerNetworks.getSignalStrength());
  Serial.println(" [0-31]");

Чтобы увидеть статус соединения, загрузите код, а затем откройте Serial Monitor.

/*
Поиск сетей GSM

Этот пример «добывает» IMEI-номер SIM-карты, выводит его на Serial Monitor,
а затем проверяет, подключена ли она к оператору. 
Если да, скетч показывает телефонный номер, привязанный к этой SIM-карте.
Далее он сканирует окружающее сетевое пространство на предмет 
находящихся поблизости сетей и выводит на Serial Monitor мощность их сигнала. 

Цепь:
* GSM Shield, подключенный к Arduino

Создан 8 марта 2012 Томом Иго (Tom Igoe),
реализован Хавьером Каразо (Javier Carazo),
модифицирован 18 января 2013 Скоттом Фитцджеральдом (Scott Fitzgerald).
*/

// Библиотеки:
#include <GSM.h>

// PIN-код:
#define PINNUMBER ""

// Создаем экземпляры классов:
GSM gsmAccess;     // включая параметр «true» для активации отладки
GSMScanner scannerNetworks;
GSMModem modemTest;

// Строка для IMEI-номера:
String IMEI = "";

// Статусное сообщение для Serial Monitor:
String errortext = "ERROR";  //  "Ошибка"

void setup()
{
  // Инициализируем последовательную передачу данных:
  Serial.begin(9600);
  Serial.println("GSM networks scanner");  //  "Поисковик сетей GSM"
  scannerNetworks.begin();

  // Состояние соединения:
  boolean notConnected = true;

  // Запускаем GSM shield.
  // Если у вашей SIM_карты есть PIN-код, делаем его параметром функции begin():
  while(notConnected)
  {
    if(gsmAccess.begin(PINNUMBER)==GSM_READY)
      notConnected = false;
    else
    {
      Serial.println("Not connected");  //  "Подключиться не удалось"
      delay(1000);
    }
  }

  // Пытаемся получить параметры модема
  // (точнее IMEI, т.е. уникальный идентификатор модема):
  Serial.print("Modem IMEI: ");  //  "IMEI-номер модема: "
  IMEI = modemTest.getIMEI();
  IMEI.replace("\n","");
  if(IMEI != NULL)
    Serial.println(IMEI);

  // Оператор, подключенный в данный момент:
  Serial.print("Current carrier: ");  //  "Текущий оператор: "
  Serial.println(scannerNetworks.getCurrentCarrier());

  // Эта функция возвращает мощность сигнала и BER.
  // Диапазон мощности сигнала: 0-31, где 31 – это больше 51 dBm.
  // BER – это количество ошибок в потоке данных (Bit Error Rate),
  // диапазон: 0-7, 99 – «не определено». 
  Serial.print("Signal Strength: ");  //  "Мощность сигнала: "
  Serial.print(scannerNetworks.getSignalStrength());
  Serial.println(" [0-31]");
}

void loop()
{
  // Сканируем имеющиеся сети, отображаем список сетей:
  Serial.println("Scanning available networks. May take some seconds.");  //  "Сканирование доступных сетей. Может занять несколько секунд."

  Serial.println(scannerNetworks.readNetworks());

    // Оператор, подключенный в данный момент: 
  Serial.print("Current carrier: ");  //  "Текущий оператор: "
  Serial.println(scannerNetworks.getCurrentCarrier());

  // Эта функция возвращает мощность сигнала и BER.
  // Диапазон мощности сигнала: 0-31, где 31 – это больше 51 dBm.
  // BER – это количество ошибок в потоке данных (Bit Error Rate),
  // диапазон: 0-7, 99 – «не определено». 
  Serial.print("Signal Strength: ");  //  "Мощность сигнала: "
  Serial.print(scannerNetworks.getSignalStrength());
  Serial.println(" [0-31]");

}

См.также

  1. GSMScanner
  2. begin()
  3. getCurrentCarrier()
  4. getSignalStrength()
  5. readNetworks()

Внешние ссылки