В этой статье мы рассмотрим протокол MQTT для обновления данных датчика на Thingspeak. Вы можете посмотреть демо-видео или инструкцию ниже.

Содержание

  1. Введение
  2. Протокол MQTT и платформа Thingspeak
  3. Соединение и программирования
  4. Заключение
  5. Дополнительные источники

1. Введение

В настоящее время протокол HTTP(s) используется для передачи информации в большинстве веб-приложений. Однако сегодняшнее технологическое развитие приносит больше различных приложений и устройств, где требуются малая задержка и низкое энергопотребление. Большинство этих устройств относятся к группам приложений Интернета вещей (ИВ). Начиная с первой версии в 1996 году и до сих пор протокол HTTP широко использовался в большинстве приложений, использующих веб-браузеры. Но, возможно, в этом нет необходимости с размером заголовков в HTTP-пакете, когда устройству ИВ требуется меньше ресурсов для отправки сообщения на удаленный сервер.

Чтобы уменьшить количество служебных пакетов и размер заголовков в протоколе HTTP, был разработан другой протокол под названием MQTT (Message Queuing Telemetry Transport), который позволяет устройствам обмениваться сообщениями друг с другом и потреблять меньше сетевых ресурсов.

2. Протокол MQTT и платформа Thingspeak

2.1. Протокол MQTT

MQTT — это протокол, основанный на модели Публикация/Подписка (Publish/Subscribe), разработанный для устройств с ограниченной мощностью и пропускной способностью для передачи по беспроводным сетям. Предполагается, что это простой протокол, работающий на TCP/IP sockets или WebSockets. Как и HTTP, протокол MQTT можно защитить с помощью протокола TLS/SSL. Модель Публикация/Подписка позволяет непрерывно доставлять сообщения другим клиентам без отправки частых запросов на сервер. В отличие от модели Запрос/Ответ по протоколу HTTP, клиентам, которые хотят получать информацию, необходимо Подписаться (Subscribe) на топик, чтобы следить за топиком на Брокере (Broker). На Hис. 1 изображен простая схема взаимодействия с устройствами по протоколу MQTT.

  • Брокер: это сервер или устройство, которое пересылает сообщения между устройствами на основе топиков, на которые устройство публикует (publish) или подписывается (subcribe) этот топик.
  • Издатель: это устройство, которое отправляет сообщение в отдельный топик. Предположим, что издатель NodeMCU будет отправлять данные о температуре и влажности в топик «/topic_weather».
  • Подписчик: это устройство, которое хочет получать сообщения от других устройств через Брокер. Если это устройство хочет отслеживать информациям о температуре и влажности от модуля NodeMCU, ему необходимо подписаться на топик «/topic_weather». После успешной регистрации, каждый раз когда NodeMCU отправляет новое сообщение, Брокер будет немедленно отправлять его на устройства, подписавшиеся на топик «/topic_weather».

Edit bieu do
Рисунок 1. Модель взаимодействия по протоколу MQTT

Кроме того, исходящие сообщения MQTT можно настроить так, чтобы они соответствовали требованиям QoS (качество обслуживания). Мы будем рассматривать больше о протоколе MQTT в отдельном посте.

2.2. Использование протокола MQTT c Thingspeak

ThingSpeak предоставляет URL-адрес Брокера по адресу mqtt3.thingspeak.com. Конфигурация для Клиента, который хочет подключиться по MQTT, может быть следующей:

Порт Тип подключения Шифрование
1883 TCP Нет
8883 TCP TLS/SSL
80 Websocket Нет
443 Wbsocket TLS/SSL

Есть 2 способа MQTT Publish для обновления данных на Channel Thingspeak.

Публикация MQTT Топик Полезная нагрузка
Публикация в многоразные поля одновремено channels/<channelID>/publish field1=<value1>&field2=<value2>
Публикация одного значения в одное поле channels/<channelID>/publish/fields/field<fieldNumber> <value>

В данной статье мы будем отправлять температуру и влажность в поле field1 и field2 одновременно. Чтобы подключиться к Thingspeak по протоколу MQTT, нам нужно создать MQTT-устройство. Шаги для инициализации устройства изображены следующим образом:

1. Согласно Рис. 2, мы выбираем Devices –> MQTT в меню сайта.

MQTT Devices
Рисунок 2. Создание устройства MQTT

2. Выбираем Add a new device для добавление нового устройства. Затем, нам нужно заполнить основные информации для нового устройство, и разрешить ему доступ к каналу (Channel), в котором мы хотим обновить данные (Рис. 3).

MQTT Devices
Рисунок 3. Настройка устройства MQTT

3. После нажатия кнопки Add Device мы получаем окно, в котором сообщается, что у нас есть учетные данные MQTT для публикации и подписки на Thingspeak. Здесь мы можем Скачать файл mqtt_secrets.h для программирования на Arduino (Рис. 4).

MQTT Devices
Рисунок 4. Учетные данные для устройства MQTT

3. Соединение и программирования

В данной статье, мы продолжаем работать с NodeMCU и DHT22. Датчик можно соединить с модулем по схеме на Рис. 5.

NodeMCU+DHT22
Рисунок 5. Схема соединения NodeMCU и DHT22

Далее, мы открываем среду программирования Arduino IDE для написания кода. Сначало, нам нужно перейти в раздел управления библиотеками через Tools –> Manage Libraries. Затем найдем библиотеку EspMQTTClient и установим ее и зависимые библиотеки (Рис. 6).

Library Manager
Рисунок 6. Установка библитеки EspMQTTClient

Вы можете найти пример кода Здесь

Или можно скопировать следующий код и вставить в Arduino IDE.

#include "EspMQTTClient.h"
#include "mqtt_secrets.h"
#include "DHT.h"

EspMQTTClient client(
  SECRET_WIFI_NAME,
  SECRET_WIFI_PASSWORD,
  "mqtt3.thingspeak.com",  // MQTT Broker server ip
  SECRET_MQTT_USERNAME,   // Can be omitted if not needed
  SECRET_MQTT_PASSWORD,   // Can be omitted if not needed
  SECRET_MQTT_CLIENT_ID      // Client name that uniquely identify your device
);

// DHT information
#define DHTPIN D2
#define DHTTYPE DHT22       // or set DHT11 type if you use DHT11
DHT dht(DHTPIN, DHTTYPE);

unsigned long lastTime = 0;
unsigned long delayTime = 20000; // set a period of sending data.

void setup() {
  Serial.begin(115200);

  // Begin DHT
  dht.begin();
}

void onConnectionEstablished() {
  Serial.println("MQTT Client is connected to Thingspeak!");
}

void publishData() {
  if (client.isConnected() && (millis() - lastTime > delayTime)) {
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
  
    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t)) {
      Serial.println(F("Failed to read from DHT sensor!"));
      return;
    }
    Serial.print(F("\nTemperature: "));
    Serial.print(t);
    Serial.print(F("°C "));
    Serial.print(F("Humidity: "));
    Serial.print(h);
    Serial.println(F("%  "));

    Serial.println(F("\nPublising data to Thingspeak"));
    
    String MY_TOPIC = "channels/" + String(CHANNEL_ID) + "/publish";  // build your topic: channels/<channelID>/publish
    String payload = "field1=" + String(t) + "&field2=" + String(h);
    client.publish(MY_TOPIC, payload);

    lastTime = millis();
  }
}

void loop() {
  client.loop();
  publishData();
} 

После сохранения файла Arduino на диске, нам нужно будет переместить файл mqtt_secretss.h в каталог, где находится только что сохраненный файл Arduino. Или вы также можете создать в проекте дополнительный файл (Рис. 7) и назвать его mqtt_secrets.h.

MQTT Devices
Рисунок 7. Создание дополнительного файла на Arduino

В файле mqtt_secrets.h нам будет нужно редактировать следующие информации.

#define SECRET_MQTT_USERNAME "YOUR_MQTT_USERNAME"  
#define SECRET_MQTT_CLIENT_ID "YOUR_MQTT_CLIENT_ID"  
#define SECRET_MQTT_PASSWORD "YOUR_MQTT_PASSWORD"
#define SECRET_WIFI_NAME "YOUR_WIFI_NAME"
#define SECRET_WIFI_PASSWORD "YOUR_WIFI_PASSWORD"
#define CHANNEL_ID "YOUR_CHANNEL_ID"

Давайте посмотрим на значение приведенных выше строк кода..

Сначала нам нужно включить библиотеки для использования WIFI, MQTT и датчика DHT.

#include "EspMQTTClient.h"
#include "mqtt_secrets.h"
#include "DHT.h"

Затем создаем экземпляр объекта client, который позволяет управлять подключениями, включая подключения WiFi, подключение по MQTT с использованием библиотеки ESPMQTTClient.h.

EspMQTTClient client(
  SECRET_WIFI_NAME,
  SECRET_WIFI_PASSWORD,
  "mqtt3.thingspeak.com",  // MQTT Broker server ip
  SECRET_MQTT_USERNAME,   // Can be omitted if not needed
  SECRET_MQTT_PASSWORD,   // Can be omitted if not needed
  SECRET_MQTT_CLIENT_ID      // Client name that uniquely identify your device
);

В дополнение к основным функциям у нас есть функция onConnectionEstablished(), которая вызывается после успешного подключения к Thingspeak.

void onConnectionEstablished() {
  Serial.println("MQTT Client is connected to Thingspeak!");
}

Далее есть функция publishData(), которая позволяет отправлять данные каждые 20 секунд.

void publishData() {
  if (client.isConnected() && (millis() - lastTime > delayTime)) {
    float h = dht.readHumidity();
    // Read temperature as Celsius (the default)
    float t = dht.readTemperature();
  
    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t)) {
      Serial.println(F("Failed to read from DHT sensor!"));
      return;
    }
    Serial.print(F("\nTemperature: "));
    Serial.print(t);
    Serial.print(F("°C "));
    Serial.print(F("Humidity: "));
    Serial.print(h);
    Serial.println(F("%  "));

    Serial.println(F("\nPublising data to Thingspeak"));
    
    String MY_TOPIC = "channels/" + String(CHANNEL_ID) + "/publish";  // build your topic: channels/<channelID>/publish
    String payload = "field1=" + String(t) + "&field2=" + String(h);
    client.publish(MY_TOPIC, payload);

    lastTime = millis();
  }
}

В функции loop() объект client вызывается с помощью loop(), чтобы всегда проверять состояния устройства, а функция publishData() вызывается для публикации измеренных данные о температуре и влажности в топик.

void loop() {
  client.loop();
  publishData();
}

После Загрузки программы в NodeMCU мы можем отслеживать некоторую информацию, распечатываемую на Serial Monitor. Наряду с этим данные также обновляются на Thingspeak (Рис. 8).

MQTT Devices
Рисунок 8. Окно мониоринга порта - Serial Monitor

4. Заключение

В этой статье мы рассмотрели прицип работы протокола MQTT и как обновлять поля данных на Channel на Thingspeak. Сегодня, протокол MQTT считается одним из популярных простых протоколов, используемых для устройств Интернета вещей. Мы также видим, что программирование для публикации данных также проще, чем при использовании протокола HTTP. Тем не менее, есть еще недостатки протокола MQTT, которые не были упомянуты в этой статье, но будут обобщены в другой статье.

5. Дополнительные источники