Arduino:Примеры/GSMExamplesReceiveSMS: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
м (Замена текста — «<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" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#include <GSM.h>
#include <GSM.h>
</syntaxhighlight>
</syntaxhighlight>
Строка 29: Строка 29:
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В таком случае нам потребуется директива #define, с помощью которой мы определим этот '''PIN'''-код как константу. Если '''PIN'''-кода нет, оставляем это место пустым.
Функционал '''SIM'''-карты может быть заблокирован '''PIN'''-кодом. В таком случае нам потребуется директива #define, с помощью которой мы определим этот '''PIN'''-код как константу. Если '''PIN'''-кода нет, оставляем это место пустым.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
#define PINNUMBER ""
#define PINNUMBER ""
</syntaxhighlight>
</syntaxhighlight>
Строка 35: Строка 35:
Создаем экземпляры классов '''GSM''' и '''GSM_SMS'''.
Создаем экземпляры классов '''GSM''' и '''GSM_SMS'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
GSM gsmAccess;  
GSM gsmAccess;  
GSM_SMS sms;
GSM_SMS sms;
Строка 42: Строка 42:
Создаем массив типа char для номера, с которого будет прислано сообщение.
Создаем массив типа char для номера, с которого будет прислано сообщение.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
char remoteNumber[20];
char remoteNumber[20];
</syntaxhighlight>
</syntaxhighlight>
Строка 48: Строка 48:
В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, выводим на '''Serial Monitor''' сообщение о том, что скетч начал работать.
В секции setup() инициализируем последовательную передачу данных на компьютер. Запустив соединение, выводим на '''Serial Monitor''' сообщение о том, что скетч начал работать.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void setup(){
void setup(){
   Serial.begin(9600);  
   Serial.begin(9600);  
Строка 56: Строка 56:
Создаем локальную переменную, с помощью которой будем отслеживать статус соединения. Она нужна для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети.
Создаем локальную переменную, с помощью которой будем отслеживать статус соединения. Она нужна для того, чтобы скетч не начинал работать, пока '''SIM'''-карта не подключится к сети.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
boolean notConnected = true;
boolean notConnected = true;
</syntaxhighlight>
</syntaxhighlight>
Строка 62: Строка 62:
Подключаемся к сети с помощью функции gsmAccess.begin(), а PIN-код возьмем в качества аргумента. Далее помещаем функцию внутри цикла loop(), чтобы иметь возможность постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false.  Если подключиться не удалось, сообщаем об этом на '''Serial Monitor'''.
Подключаемся к сети с помощью функции gsmAccess.begin(), а PIN-код возьмем в качества аргумента. Далее помещаем функцию внутри цикла loop(), чтобы иметь возможность постоянно проверять статус соединения. Когда модем подключится, функция gsmAccess() вернет значение '''GSM_READY'''. Воспользуемся им как сигналом для того, чтобы придать переменной notConnected значение true или false.  Если подключиться не удалось, сообщаем об этом на '''Serial Monitor'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while(notConnected)
while(notConnected)
   {
   {
Строка 77: Строка 77:
Завершаем секцию setup() выводом двух сообщений на '''Serial Monitor''' – об успешной инициализации '''GSM''' и о том, что скетч ожидает входящие сообщения.  
Завершаем секцию setup() выводом двух сообщений на '''Serial Monitor''' – об успешной инициализации '''GSM''' и о том, что скетч ожидает входящие сообщения.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.println("GSM initialized.");
Serial.println("GSM initialized.");
   Serial.println("Waiting for messages");
   Serial.println("Waiting for messages");
Строка 87: Строка 87:
В секции loop() создаем переменную типа char для временного хранения символов из полученного '''SMS'''. Для проверки того, есть ли на '''SIM'''-карте какие-либо сообщения, воспользуемся функцией sms.available().
В секции loop() создаем переменную типа char для временного хранения символов из полученного '''SMS'''. Для проверки того, есть ли на '''SIM'''-карте какие-либо сообщения, воспользуемся функцией sms.available().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
void loop()  
void loop()  
{
{
Строка 97: Строка 97:
Если есть, '''«изымаем»''' номер отправителя при помощи вызова функции sms.remoteNumber(remoteNumber, 20). Аргумент remoteNumber – это массив типа char, который вы объявили в самом начале скетча, и он может содержать '''не более 20 символов'''. Отправляем этот номер на '''Serial Monitor'''.  
Если есть, '''«изымаем»''' номер отправителя при помощи вызова функции sms.remoteNumber(remoteNumber, 20). Аргумент remoteNumber – это массив типа char, который вы объявили в самом начале скетча, и он может содержать '''не более 20 символов'''. Отправляем этот номер на '''Serial Monitor'''.  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.println("Message received from:");
Serial.println("Message received from:");
     sms.remoteNumber(remoteNumber, 20);
     sms.remoteNumber(remoteNumber, 20);
Строка 107: Строка 107:
Код ниже, скорее, просто демонстрационный, поэтому ничего c '''SIM'''-карты не удалит, однако вместо «#» можно указать точный индекс либо просто «прочесать» массив в цикле for().
Код ниже, скорее, просто демонстрационный, поэтому ничего c '''SIM'''-карты не удалит, однако вместо «#» можно указать точный индекс либо просто «прочесать» массив в цикле for().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
if(sms.peek()=='#')
if(sms.peek()=='#')
     {
     {
Строка 117: Строка 117:
Чтобы прочитать сообщение, воспользуемся функцией sms.read(). С ее помощью мы запишем все символы сообщения в переменную c, а затем выведем считанные данные на '''Serial Monitor'''.
Чтобы прочитать сообщение, воспользуемся функцией sms.read(). С ее помощью мы запишем все символы сообщения в переменную c, а затем выведем считанные данные на '''Serial Monitor'''.


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
while(c=sms.read())
while(c=sms.read())
       Serial.print(c);
       Serial.print(c);
Строка 124: Строка 124:
Информируем пользователя о том, что сообщение готово и удаляем его из памяти при помощи функции sms.flush().
Информируем пользователя о том, что сообщение готово и удаляем его из памяти при помощи функции sms.flush().


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
Serial.println("\nEND OF MESSAGE");     
Serial.println("\nEND OF MESSAGE");     
     sms.flush();
     sms.flush();
Строка 133: Строка 133:
Добавляем короткую задержку и закрываем loop().  
Добавляем короткую задержку и закрываем loop().  


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
delay(1000);
delay(1000);
}
}
Строка 140: Строка 140:
Загрузив скетч, откройте '''Serial Monitor'''. При помощи телефона или другого подходящего устройства отправьте '''SMS''' на номер вашей '''SIM'''-карты. Когда сообщение будет получено, скетч выведет его на '''Serial Monitor.'''
Загрузив скетч, откройте '''Serial Monitor'''. При помощи телефона или другого подходящего устройства отправьте '''SMS''' на номер вашей '''SIM'''-карты. Когда сообщение будет получено, скетч выведет его на '''Serial Monitor.'''


<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS" enclose="div">
<syntaxhighlight lang="c" line="GESHI_NORMAL_LINE_NUMBERS|GESHI_FANCY_LINE_NUMBERS">
/*
/*
Получатель SMS
Получатель SMS

Версия от 12:32, 20 мая 2023

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


Получение SMS[1]

Этот скетч ждет SMS-сообщение, а затем выводит его на Serial Monitor. Вам потребуется плата Arduino с подключенным к ней модулем GSM Shield и SIM-картой.

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

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

Цепь

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

Код

Во-первых, импортируем библиотеку GSM.

#include <GSM.h>

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

#define PINNUMBER ""

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

GSM gsmAccess; 
GSM_SMS sms;

Создаем массив типа char для номера, с которого будет прислано сообщение.

char remoteNumber[20];

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

void setup(){
  Serial.begin(9600); 
  Serial.println("SMS Messages Receiver");

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

boolean notConnected = true;

Подключаемся к сети с помощью функции gsmAccess.begin(), а PIN-код возьмем в качества аргумента. Далее помещаем функцию внутри цикла loop(), чтобы иметь возможность постоянно проверять статус соединения. Когда модем подключится, функция 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);
    }
  }

Завершаем секцию setup() выводом двух сообщений на Serial Monitor – об успешной инициализации GSM и о том, что скетч ожидает входящие сообщения.

Serial.println("GSM initialized.");
  Serial.println("Waiting for messages");
}

Прием SMS-сообщений осуществляется модемом. SIM-карта имеет некоторую память для хранения входящих SMS. В зависимости от той или иной модели SIM-карты, она может уместить от 10 до 200 SMS-сообщений. Точную цифру можно узнать у своего мобильного оператора.

В секции loop() создаем переменную типа char для временного хранения символов из полученного SMS. Для проверки того, есть ли на SIM-карте какие-либо сообщения, воспользуемся функцией sms.available().

void loop() 
{
  char c;
  if (sms.available())
  {

Если есть, «изымаем» номер отправителя при помощи вызова функции sms.remoteNumber(remoteNumber, 20). Аргумент remoteNumber – это массив типа char, который вы объявили в самом начале скетча, и он может содержать не более 20 символов. Отправляем этот номер на Serial Monitor.

Serial.println("Message received from:");
    sms.remoteNumber(remoteNumber, 20);
    Serial.println(remoteNumber);

SMS-сообщения можно удалить, вызвав функцию sms.flush(). Кроме того, воспользуемся функцией sms.peek(), которая позволяет определить индекс символа в сообщении.

Код ниже, скорее, просто демонстрационный, поэтому ничего c SIM-карты не удалит, однако вместо «#» можно указать точный индекс либо просто «прочесать» массив в цикле for().

if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");
      sms.flush();
    }

Чтобы прочитать сообщение, воспользуемся функцией sms.read(). С ее помощью мы запишем все символы сообщения в переменную c, а затем выведем считанные данные на Serial Monitor.

while(c=sms.read())
      Serial.print(c);

Информируем пользователя о том, что сообщение готово и удаляем его из памяти при помощи функции sms.flush().

Serial.println("\nEND OF MESSAGE");    
    sms.flush();
    Serial.println("MESSAGE DELETED");
  }

Добавляем короткую задержку и закрываем loop().

delay(1000);
}

Загрузив скетч, откройте Serial Monitor. При помощи телефона или другого подходящего устройства отправьте SMS на номер вашей SIM-карты. Когда сообщение будет получено, скетч выведет его на Serial Monitor.

/*
Получатель SMS

Этот скетч для Arduino GSM Shield ждет входящих SMS-сообщений,
а затем отображает их на Serial Monitor.

Цепь:
* GSM Shield 

Создан 25 февраля 2012 Хавьером Зорзано (Javier Zorzano) / TD

Этот код не защищен авторским правом.
*/

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

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

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

char remoteNumber[20];  // массив, в котором будет храниться входящий номер

void setup() 
{
  // Инициализируем последовательную передачу данных:
  Serial.begin(9600); 

  Serial.println("SMS Messages Receiver");  //  "Получатель SMS-сообщений"

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

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

  Serial.println("GSM initialized");  //  "GSM инициализирован"
  Serial.println("Waiting for messages");  //  "Ожидание сообщений"
}

void loop() 
{
  char c;

  // Если есть какие-либо доступные SMS:  
  if (sms.available())
  {
    Serial.println("Message received from:");  //  "Сообщение получено от:"

    // «Изымаем» номер:
    sms.remoteNumber(remoteNumber, 20);
    Serial.println(remoteNumber);

    // Это лишь пример удаления сообщения.    
    // Сообщения, начинающиеся с «#», должны быть отклонены:
    if(sms.peek()=='#')
    {
      Serial.println("Discarded SMS");  //  "Сообщение отклонено"
      sms.flush();
    }

    // Считываем байты сообщения и выводим на Serial Monitor:
    while(c=sms.read())
      Serial.print(c);

    Serial.println("\nEND OF MESSAGE");  //  "\nКонец сообщения"

    // Удаляем сообщение из памяти модема:
    sms.flush();
    Serial.println("MESSAGE DELETED");  //  "Сообщение удалено"
  }

  delay(1000);

}

См.также

  1. GSM Constructor
  2. GSM.begin()
  3. GSM.shutdown()
  4. GSM_SMS Constructor
  5. beginSMS()
  6. ready()
  7. endSMS()
  8. available()
  9. remoteNumber()
  10. read()
  11. write()
  12. print()
  13. peek()
  14. flush()

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