Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Arduino:Примеры/GSMExamplesGSMScanNetworks

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

Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


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

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

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

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

Цепь

GSMShield ArduinoUno.png

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

Код

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

  1. #include <GSM.h>

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

  1. #define PINNUMBER ""

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

  1. GSM gsmAccess;
  2. GSMScanner scannerNetworks;
  3. GSMModem modemTest;

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

  1. String IMEI = "";
  2. String errortext = "ERROR";

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

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

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

  1. boolean notConnected = true;

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

  1.  while(notConnected)
  2.   {
  3.     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
  4.       notConnected = false;
  5.     else
  6.     {
  7.       Serial.println("Not connected");
  8.       delay(1000);
  9.     }
  10.   }

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

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

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

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

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

  1. Serial.print("Current carrier: ");
  2.   Serial.println(scannerNetworks.getCurrentCarrier());
  3.  
  4.   Serial.print("Signal Strength: ");
  5.   Serial.print(scannerNetworks.getSignalStrength());
  6.   Serial.println(" [0-31]");

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

  1. /*
  2. Поиск сетей GSM
  3.  
  4. Этот пример «добывает» IMEI-номер SIM-карты, выводит его на Serial Monitor,
  5. а затем проверяет, подключена ли она к оператору.
  6. Если да, скетч показывает телефонный номер, привязанный к этой SIM-карте.
  7. Далее он сканирует окружающее сетевое пространство на предмет
  8. находящихся поблизости сетей и выводит на Serial Monitor мощность их сигнала.
  9.  
  10. Цепь:
  11. * GSM Shield, подключенный к Arduino
  12.  
  13. Создан 8 марта 2012 Томом Иго (Tom Igoe),
  14. реализован Хавьером Каразо (Javier Carazo),
  15. модифицирован 18 января 2013 Скоттом Фитцджеральдом (Scott Fitzgerald).
  16. */
  17.  
  18. // Библиотеки:
  19. #include <GSM.h>
  20.  
  21. // PIN-код:
  22. #define PINNUMBER ""
  23.  
  24. // Создаем экземпляры классов:
  25. GSM gsmAccess;     // включая параметр «true» для активации отладки
  26. GSMScanner scannerNetworks;
  27. GSMModem modemTest;
  28.  
  29. // Строка для IMEI-номера:
  30. String IMEI = "";
  31.  
  32. // Статусное сообщение для Serial Monitor:
  33. String errortext = "ERROR";  //  "Ошибка"
  34.  
  35. void setup()
  36. {
  37.   // Инициализируем последовательную передачу данных:
  38.   Serial.begin(9600);
  39.   Serial.println("GSM networks scanner");  //  "Поисковик сетей GSM"
  40.   scannerNetworks.begin();
  41.  
  42.   // Состояние соединения:
  43.   boolean notConnected = true;
  44.  
  45.   // Запускаем GSM shield.
  46.   // Если у вашей SIM_карты есть PIN-код, делаем его параметром функции begin():
  47.   while(notConnected)
  48.   {
  49.     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
  50.       notConnected = false;
  51.     else
  52.     {
  53.       Serial.println("Not connected");  //  "Подключиться не удалось"
  54.       delay(1000);
  55.     }
  56.   }
  57.  
  58.   // Пытаемся получить параметры модема
  59.   // (точнее IMEI, т.е. уникальный идентификатор модема):
  60.   Serial.print("Modem IMEI: ");  //  "IMEI-номер модема: "
  61.   IMEI = modemTest.getIMEI();
  62.   IMEI.replace("\n","");
  63.   if(IMEI != NULL)
  64.     Serial.println(IMEI);
  65.  
  66.   // Оператор, подключенный в данный момент:
  67.   Serial.print("Current carrier: ");  //  "Текущий оператор: "
  68.   Serial.println(scannerNetworks.getCurrentCarrier());
  69.  
  70.   // Эта функция возвращает мощность сигнала и BER.
  71.   // Диапазон мощности сигнала: 0-31, где 31 – это больше 51 dBm.
  72.   // BER – это количество ошибок в потоке данных (Bit Error Rate),
  73.   // диапазон: 0-7, 99 – «не определено».
  74.   Serial.print("Signal Strength: ");  //  "Мощность сигнала: "
  75.   Serial.print(scannerNetworks.getSignalStrength());
  76.   Serial.println(" [0-31]");
  77. }
  78.  
  79. void loop()
  80. {
  81.   // Сканируем имеющиеся сети, отображаем список сетей:
  82.   Serial.println("Scanning available networks. May take some seconds.");  //  "Сканирование доступных сетей. Может занять несколько секунд."
  83.  
  84.   Serial.println(scannerNetworks.readNetworks());
  85.  
  86.     // Оператор, подключенный в данный момент:
  87.   Serial.print("Current carrier: ");  //  "Текущий оператор: "
  88.   Serial.println(scannerNetworks.getCurrentCarrier());
  89.  
  90.   // Эта функция возвращает мощность сигнала и BER.
  91.   // Диапазон мощности сигнала: 0-31, где 31 – это больше 51 dBm.
  92.   // BER – это количество ошибок в потоке данных (Bit Error Rate),
  93.   // диапазон: 0-7, 99 – «не определено».
  94.   Serial.print("Signal Strength: ");  //  "Мощность сигнала: "
  95.   Serial.print(scannerNetworks.getSignalStrength());
  96.   Serial.println(" [0-31]");
  97.  
  98. }

См.также

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

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

  1. Arduino - GSM Scan Networks