Arduino:Примеры/GSMExamplesGSMScanNetworks: различия между версиями
Myagkij (обсуждение | вклад) м (Замена текста — «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">» на «<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">») |
Нет описания правки |
||
Строка 23: | Строка 23: | ||
Сначала импортируем библиотеку '''GSM'''. | Сначала импортируем библиотеку '''GSM'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#include <GSM.h> | #include <GSM.h> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 29: | Строка 29: | ||
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом, поэтому нам надо определить этот '''PIN'''-код в виде константы, для чего пригодится директива #define. Если '''PIN'''-кода нет, оставляем это место пустым. | Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом, поэтому нам надо определить этот '''PIN'''-код в виде константы, для чего пригодится директива #define. Если '''PIN'''-кода нет, оставляем это место пустым. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
#define PINNUMBER "" | #define PINNUMBER "" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 35: | Строка 35: | ||
Создаем экземпляры классов '''GSM''', '''GSMScanner''' и '''GSMModem'''. | Создаем экземпляры классов '''GSM''', '''GSMScanner''' и '''GSMModem'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
GSM gsmAccess; | GSM gsmAccess; | ||
GSMScanner scannerNetworks; | GSMScanner scannerNetworks; | ||
Строка 43: | Строка 43: | ||
Создаем переменную, в которой будет храниться '''IMEI'''-номер, а также статусное сообщение об ошибке, которое в случае необходимости будет выводиться на '''Serial Monitor'''. | Создаем переменную, в которой будет храниться '''IMEI'''-номер, а также статусное сообщение об ошибке, которое в случае необходимости будет выводиться на '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
String IMEI = ""; | String IMEI = ""; | ||
String errortext = "ERROR"; | String errortext = "ERROR"; | ||
Строка 50: | Строка 50: | ||
В секции setup() инициализируем последовательную передачу данных. Запустив соединение, отсылаем на '''Serial Monitor''' сообщение, оповещающее о начале работы скетча. Затем вызываем функцию scannerNetworks.begin(), чтобы перезагрузить модем. | В секции setup() инициализируем последовательную передачу данных. Запустив соединение, отсылаем на '''Serial Monitor''' сообщение, оповещающее о начале работы скетча. Затем вызываем функцию scannerNetworks.begin(), чтобы перезагрузить модем. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
void setup(){ | void setup(){ | ||
Serial.begin(9600); | Serial.begin(9600); | ||
Строка 59: | Строка 59: | ||
Создаем локальную переменную для отслеживания статуса соединения. Это нужно, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети. | Создаем локальную переменную для отслеживания статуса соединения. Это нужно, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
boolean notConnected = true; | boolean notConnected = true; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 65: | Строка 65: | ||
Подключаемся к сети при помощи функции gmsAccess.begin(), где '''PIN'''-код будет в качестве аргумента. Помещаем ее в цикле while(), благодаря чему сможем постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы задать переменной notConnected значение true или false. Если подключиться не удастся, сообщаем об этом через '''Serial Monitor'''. | Подключаемся к сети при помощи функции gmsAccess.begin(), где '''PIN'''-код будет в качестве аргумента. Помещаем ее в цикле while(), благодаря чему сможем постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы задать переменной notConnected значение true или false. Если подключиться не удастся, сообщаем об этом через '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
while(notConnected) | while(notConnected) | ||
{ | { | ||
Строка 80: | Строка 80: | ||
При помощи функции modemTest.getIMEI() получаем '''IMEI'''-номер модема, а затем выводим его на '''Serial Monitor'''. | При помощи функции modemTest.getIMEI() получаем '''IMEI'''-номер модема, а затем выводим его на '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Serial.print("Modem IMEI: "); | Serial.print("Modem IMEI: "); | ||
IMEI = modemTest.getIMEI(); | IMEI = modemTest.getIMEI(); | ||
Строка 90: | Строка 90: | ||
В секции loop() сканируем доступные сети, а затем выводим их на '''Serial Monitor'''. Это может занять некоторое время. | В секции loop() сканируем доступные сети, а затем выводим их на '''Serial Monitor'''. Это может занять некоторое время. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Serial.println("Scanning available networks. May take some seconds."); | Serial.println("Scanning available networks. May take some seconds."); | ||
Serial.println(scannerNetworks.readNetworks()); | Serial.println(scannerNetworks.readNetworks()); | ||
Строка 97: | Строка 97: | ||
Показываем на '''Serial Monitor''' оператора, который подключен в данный момент, а также мощность сигнала. Этот показатель будет варьироваться в диапазоне '''от 0 до 31''', где '''«0»''' – это самый низкий, а '''«31»''' – самый высокий. Закрываем loop(). | Показываем на '''Serial Monitor''' оператора, который подключен в данный момент, а также мощность сигнала. Этот показатель будет варьироваться в диапазоне '''от 0 до 31''', где '''«0»''' – это самый низкий, а '''«31»''' – самый высокий. Закрываем loop(). | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
Serial.print("Current carrier: "); | Serial.print("Current carrier: "); | ||
Serial.println(scannerNetworks.getCurrentCarrier()); | Serial.println(scannerNetworks.getCurrentCarrier()); | ||
Строка 108: | Строка 108: | ||
Чтобы увидеть статус соединения, загрузите код, а затем откройте '''Serial Monitor'''. | Чтобы увидеть статус соединения, загрузите код, а затем откройте '''Serial Monitor'''. | ||
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS | <syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS"> | ||
/* | /* | ||
Поиск сетей GSM | Поиск сетей GSM |
Версия от 12:32, 20 мая 2023
Содержание | Знакомство с Arduino | Продукты | Основы | Справочник языка Arduino | Примеры | Библиотеки | Хакинг | Изменения | Сравнение языков Arduino и Processing |
Сканирование сетей GSM[1]
Этот пример показывает IMEI-номер модема, потом проверяет, подключен ли он к оператору, а затем отображает мощность сигнала. Кроме того, он сканирует ближайшее сетевое пространство на наличие доступных сетей.
Необходимое оборудование
- Плата Arduino;
- Модуль Arduino + Telefonica GSM/GPRS Shield;
- SIM-карта;
Цепь
Изображение 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]");
}
См.также
- GSMScanner
- begin()
- getCurrentCarrier()
- getSignalStrength()
- readNetworks()