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

Arduino:Примеры/GSMExamplesReceiveSMS

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

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

Контакты:

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


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

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

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

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

Цепь

GSMShield ArduinoUno.png

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

Код

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

  1. #include <GSM.h>

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

  1. #define PINNUMBER ""

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

  1. GSM gsmAccess;
  2. GSM_SMS sms;

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

  1. char remoteNumber[20];

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

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

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

  1. boolean notConnected = true;

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

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

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

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

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

  1. void loop()
  2. {
  3.   char c;
  4.   if (sms.available())
  5.   {

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

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

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

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

  1. if(sms.peek()=='#')
  2.     {
  3.       Serial.println("Discarded SMS");
  4.       sms.flush();
  5.     }

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

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

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

  1. Serial.println("\nEND OF MESSAGE");    
  2.     sms.flush();
  3.     Serial.println("MESSAGE DELETED");
  4.   }

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

  1. delay(1000);
  2. }

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

  1. /*
  2. Получатель SMS
  3.  
  4. Этот скетч для Arduino GSM Shield ждет входящих SMS-сообщений,
  5. а затем отображает их на Serial Monitor.
  6.  
  7. Цепь:
  8. * GSM Shield
  9.  
  10. Создан 25 февраля 2012 Хавьером Зорзано (Javier Zorzano) / TD
  11.  
  12. Этот код не защищен авторским правом.
  13. */
  14.  
  15. // Библиотеки:
  16. #include <GSM.h>
  17.  
  18. // PIN-код:
  19. #define PINNUMBER ""
  20.  
  21. // Создаем экземпляры классов:
  22. GSM gsmAccess; // включая параметр «true» для активации отладки
  23. GSM_SMS sms;
  24.  
  25. char remoteNumber[20];  // массив, в котором будет храниться входящий номер
  26.  
  27. void setup()
  28. {
  29.   // Инициализируем последовательную передачу данных:
  30.   Serial.begin(9600);
  31.  
  32.   Serial.println("SMS Messages Receiver");  //  "Получатель SMS-сообщений"
  33.  
  34.   // Состояние соединения:
  35.   boolean notConnected = true;
  36.  
  37.   // Запускаем GSM Shield.
  38.   // Если ваша SIM-карта заблокирована PIN-кодом,
  39.   // то укажите его параметром в функции gsmAccess.begin():
  40.   while(notConnected)
  41.   {
  42.     if(gsmAccess.begin(PINNUMBER)==GSM_READY)
  43.       notConnected = false;
  44.     else
  45.     {
  46.       Serial.println("Not connected");  //  "Подключиться не удалось"
  47.       delay(1000);
  48.     }
  49.   }
  50.  
  51.   Serial.println("GSM initialized");  //  "GSM инициализирован"
  52.   Serial.println("Waiting for messages");  //  "Ожидание сообщений"
  53. }
  54.  
  55. void loop()
  56. {
  57.   char c;
  58.  
  59.   // Если есть какие-либо доступные SMS:  
  60.   if (sms.available())
  61.   {
  62.     Serial.println("Message received from:");  //  "Сообщение получено от:"
  63.  
  64.     // «Изымаем» номер:
  65.     sms.remoteNumber(remoteNumber, 20);
  66.     Serial.println(remoteNumber);
  67.  
  68.     // Это лишь пример удаления сообщения.    
  69.     // Сообщения, начинающиеся с «#», должны быть отклонены:
  70.     if(sms.peek()=='#')
  71.     {
  72.       Serial.println("Discarded SMS");  //  "Сообщение отклонено"
  73.       sms.flush();
  74.     }
  75.  
  76.     // Считываем байты сообщения и выводим на Serial Monitor:
  77.     while(c=sms.read())
  78.       Serial.print(c);
  79.  
  80.     Serial.println("\nEND OF MESSAGE");  //  "\nКонец сообщения"
  81.  
  82.     // Удаляем сообщение из памяти модема:
  83.     sms.flush();
  84.     Serial.println("MESSAGE DELETED");  //  "Сообщение удалено"
  85.   }
  86.  
  87.   delay(1000);
  88.  
  89. }

См.также

  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()

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

  1. Arduie SMS