Получение SMS через SMPP Exolve на ESP8266

Всем привет! У платформы МТС Exolve есть сообщество, которое часто делится полезными гайдами от прокачки серверов до создания своих приложений. Наиболее интересные и подробные продолжаем размещать в нашем хабе.

Напомним, ESP8266 — это популярный микроконтроллер с поддержкой Wi-Fi, который широко используется в проектах Интернета вещей (IoT). Одним из интересных применений ESP8266 является взаимодействие с телекоммуникационными платформами для получения и отправки SMS-сообщений через протокол SMPP (Short Message Peer-to-Peer).

В этом гайде пользователь объяснил, как с помощью микроконтроллера NodeMCU (ESP8266) и кнопки отправлять SMS через HTTP POST-запросы. В этой статье же статье будет гайд о том, как настроить и реализовать приём SMS-сообщений на ESP8266 через платформу Exolve и SMPP.

Подготовка к работе

Для реализации проекта понадобятся:

  1. ESP8266 — микроконтроллер с поддержкой Wi-Fi.

  2. Аккаунт на МТС Exolve — для получения данных доступа к SMPP-серверу (IP-адрес, порт, системный идентификатор и пароль).

  3. Базовые навыки работы с Arduino IDE и знание программирования на C++.

Настройка ESP8266 для работы с SMPP

Ниже код на языке C++, который демонстрирует подключение ESP8266 к SMPP-серверу и получение SMS-сообщений. Код также включает отправку SMS для тестирования подключения.

Подключение к Wi-Fi и SMPP-серверу

#include 

// Ваши настройки WiFi
const char* ssid = "YOUR_WIFI_SSID"; // Замените на SSID вашей Wi-Fi сети
const char* password = "YOUR_WIFI_PASSWORD"; // Замените на пароль от вашей Wi-Fi сети

// Адрес и порт вашего SMPP-сервера
const char* smppServer = "YOUR_SMPP_SERVER_IP"; // Замените на IP-адрес вашего SMPP-сервера
const int smppPort = YOUR_SMPP_SERVER_PORT; // Замените на порт вашего SMPP-сервера (обычно 2775)

WiFiClient client;

void setup() {
  Serial.begin(9600);
  delay(10);

  // Подключение к Wi-Fi сети
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Подключение к SMPP-серверу
  Serial.println("Connecting to SMPP server...");
  if (client.connect(smppServer, smppPort)) {
    Serial.println("Connected to SMPP server");
    // Отправка команды привязки (bind_receiver)
    sendBindReceiver("YOUR_SYSTEM_ID", "YOUR_SYSTEM_PASSWORD"); // Замените на ваш system_id и пароль для SMPP-сервера
  } else {
    Serial.println("Connection failed");
  }

  // Пример отправки SMS
  sendSMS("SOURCE_NUMBER", "DESTINATION_NUMBER", "Hello, this is a test message!"); // Замените номера и текст на свои данные
}

void loop() {
  // Проверяем, есть ли доступные данные
  if (client.available()) {
    uint8_t data[1024];
    int len = client.read(data, 1024);
    if (len > 0) {
      parsePDU(data, len);
    }
  }

  // Проверка подключения клиента
  if (!client.connected()) {
    Serial.println("Disconnected from SMPP server");
    client.stop();
    // Попробуйте переподключиться
    if (client.connect(smppServer, smppPort)) {
      Serial.println("Reconnected to SMPP server");
      sendBindReceiver("YOUR_SYSTEM_ID", "YOUR_SYSTEM_PASSWORD"); // Замените на ваш system_id и пароль для SMPP-сервера
    } else {
      Serial.println("Reconnection failed");
    }
  }

  // Небольшая задержка для стабильности работы
  delay(1000);
}

Реализация функций для работы с SMPP

Отправка команды привязки (bind_receiver).

Функция sendBindReceiver отвечает за отправку команды привязки (bind_receiver) к SMPP-серверу. Это необходимо для регистрации вашего устройства как приемника SMS.

void sendBindReceiver(const char* system_id, const char* password) {
  // Формирование и отправка команды bind_receiver
  byte pdu[23 + strlen(system_id) + strlen(password)];
  int pduLength = 0;

  // Заголовок PDU (длина, команда, статус, sequence_number)
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 23 + strlen(system_id) + strlen(password); // длина PDU
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x01; // bind_receiver
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00; // command_status
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x00;
  pdu[pduLength++] = 0x01; // sequence_number

  // system_id
  for (int i = 0; i < strlen(system_id); i++) {
    pdu[pduLength++] = system_id[i];
  }
  pdu[pduLength++] = 0x00;

  // password
  for (int i = 0; i < strlen(password); i++) {
    pdu[pduLength++] = password[i];
  }
  pdu[pduLength++] = 0x00;

  // system_type
  pdu[pduLength++] = 0x00;

  // interface_version
  pdu[pduLength++] = 0x34; // версия интерфейса

  // addr_ton
  pdu[pduLength++] = 0x00;

  // addr_npi
  pdu[pduLength++] = 0x00;

  // address_range
  pdu[pduLength++] = 0x00;

  // Отправка PDU
  client.write(pdu, pduLength);
  Serial.println("Sent bind_receiver");
}

Отправка SMS

Отправка SMS осуществляется с помощью функции sendSMS. Она формирует PDU для отправки SMS и передает его на SMPP-сервер. Отправка в этот раз пройдёт не через API запрос, как было раньше. И это работает столь же прекрасно на SMPP, даже быстрее.

void sendSMS(const char* sourceAddr, const char* destAddr, const char* message) {
  byte pdu[200]; // Размер PDU зависит от длины сообщения и других параметров
  int pduLength = 0;

  // Заголовок PDU (длина, команда, статус, sequence_number)
  pdu[pduLength++] = ...
  // ... продолжение формирования PDU
  
  // Отправка PDU
  client.write(pdu, pduLength);
  Serial.println("SMS sent");
}

Теперь копируете весь код, подставляете свои данные.

—---

Когда мы рассмотрели, как настроить ESP8266 для получения SMS через SMPP с использованием Exolve, перейдём к реальным примерам применения этой технологии.

Управление устройствами через SMS-сообщения открывает новые автоматизации в различных сферах — от умного дома до промышленных систем. Рассмотрим, как можно использовать ESP8266 для удалённого управления устройствами через SMS, а также приведем примеры.

Управление устройствами через SMS

Одно из важнейших применений микроконтроллера ESP8266 — удаленное управление устройствами через SMS. Такой подход полезен в ситуациях, когда нет доступа к интернету или он ограничен, но есть стабильное покрытие сотовой сети. Использование ESP8266 в сочетании с SMS-командами позволяет эффективно управлять умным домом, сельскохозяйственными системами, промышленным оборудованием и даже автомобильными системами.

Примеры применения

Управление умным домом

Представьте, что вы находитесь в дороге до дома и хотите заранее включить отопление или кондиционер перед своим возвращением. Для этого отправляете SMS с командой, например: включить отопление. ESP8266, получив сообщение, выполнит соответствующее действие. Для реализации системы можно использовать реле, подключенное к ESP8266, которое будет управлять отоплением или системой кондиционирования.

Подобных примеров достаточно, например, на Newbiely и Random Nerd Tutorials.

Источник
Источник

Мониторинг и управление сельскохозяйственными системами

ESP8266 можно применять в сельском хозяйстве для мониторинга параметров окружающей среды, таких как влажность почвы. Если система обнаруживает, что уровень влажности почвы ниже нормы, она отправляет SMS-оповещение поливочной системе, например: включить полив. ESP8266 получит сообщение и активирует полив, без необходимости постоянного подключения к интернету.

Промышленное оборудование

В промышленных условиях ESP8266 может использоваться для мониторинга состояния оборудования. Например, если датчик фиксирует перегрев двигателя, система отправит SMS-сообщение с предупреждением. Система управления, получив уведомление, может отправить сообщение для остановки двигателя или изменения его режима работы. Такой механизм позволяет оперативно реагировать на потенциальные неисправности, минимизируя простои и предотвращая серьезные поломки.

В качестве заключительного слова, использование ESP8266 для получения и отправки SMS через SMPP открывает широкие возможности для создания умных устройств, работающих даже в условиях отсутствия интернета. Этот подход применим в различных сферах — от умного дома до промышленной автоматизации и других областей.

© Habrahabr.ru