Arduino:Примеры/GSMExamplesReceiveSMS

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

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


Получение 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()

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