EP8266. Управление устройствами по MQTT протоколу
За последние несколько лет устройства Интернета вещей (IoT) стали неотъемлемой частью нашей повседневной жизни. От умных домов, умных ламп до умных приборов; создатели и разработчики используют эту технологию для создания сети подключенных устройств, которая делает нашу повседневную жизнь немного более захватывающей. Все это стало возможным благодаря простоте связи. Существует множество возможных способов обмена данными между устройствами, но в коммерческих продуктах и продуктах для хобби обычно используется один протокол - Message Queuing Telemetry Transport (MQTT).
В этом проекте мы будем использовать бесплатный и популярный брокер Eclipse MQTT и узнаем, как подключить устройство Интернета вещей (в нашем случае это модуль NodeMCU) к брокеру MQTT и передавать данные между брокером MQTT и NodeMCU.
Описание протокола MQTT
Прежде чем мы продолжим, лучше иметь четкое представление о протоколе MQTT (Message Queuing Telemetry Transport) . Это облегченный протокол обмена сообщениями, который использует метод публикации / подписки и транслирует сообщения между несколькими устройствами. Используя протокол MQTT, мы также можем отправлять / получать данные и управлять различными устройствами вывода, такими как считывание данных с датчиков и т. д. Он разработан поверх TCP, поэтому он быстрее, чем аналогичные протоколы, такие как HTTP. Помимо этого, он имеет много других преимуществ. Это его очень легкий вес, поэтому он не потребляет лишнюю память, он может работать с очень низкой пропускной способностью сети, кроме того, он имеет встроенный надежный протокол безопасности. Эти функции делают его подходящим для многих приложений.
Как работает MQTT?
Общая схема работы по протоколу MQTT представлена на рисунке ниже
Теперь разберем ее более подробно. Для начала разберемся с терминологией:
Клиент MQTT:
Клиент MQTT - это любое устройство (это может быть микроконтроллер или сервер), которое выполняет функции MQTT и взаимодействует с центральным сервером, который известен как “брокер”. Брокер обрабатывает обмен данными между подключенными клиентами.
Издатель MQTT:
Когда клиент хочет отправить какую-либо информацию, клиент известен как “Издатель”. Издатель будет публиковать информацию по определенной теме. “Тема” - это путь, по которому мы можем публиковать / подписывать сообщения. Затем брокер отправляет информацию, опубликованную пользователем, клиентам (также известным как подписчики), которые подписались на эту конкретную тему.
Подписчик MQTT:
Подписчик MQTT подписывается на разделы брокера MQTT для чтения сообщений, отправляемых брокером.
Как мы видим на схеме сенсор-клиент передает MQTT брокеру какие-либо данные. Для брокера она в данный момент является Издателем. Далее приложение-клиент подключается к брокеру и считывает эти данные. Оно является Подписчиком. Если же приложение будет отправлять какие-либо данные на сервер, то оно станет издателем, а устройство читающее эти данные - подписчиком. С этим, надеюсь, все понятно
Брокер Eclipse Mosquitto
Eclipse Mosquitto - это брокер MQTT с открытым исходным кодом, который отличается малым весом и подходит для использования на устройствах Интернета вещей для связи. Протокол MQTT обеспечивает упрощенный способ передачи информации с использованием модели публикации / подписки. Если вы хотите узнать больше об этой теме, вы можете посетить официальный веб-сайт mosquito.
Настройка брокера Eclipse Mosquitto:
Чтобы установить связь с брокером, нам нужно сначала настроить его. В этом проекте приложение для Android используется для публикации и подписки на информацию с помощью брокера. Следующие шаги дадут вам лучшее представление о процессе настройки.
Шаг 1:
Сначала загрузите любой mqtt клиент доступный в Google Play Store / App Store, и установите его. В этом проекте используется приложение с именем “MQTT client”, внешний вид которого представлен ниже.
Шаг 2:
Нажмите на знак “+”, чтобы просмотреть список дополнительных опций в приложении, где мы собираемся добавить нового брокера. При нажатии на кнопку появляется новый экран, как показано ниже.
Шаг 3:
После этого в обязательном поле необходимо заполнить данные о брокере. Сначала нажмите на переключатель “Enabled". В этом проекте используется брокер Eclipse MQTT. Параметры, которые необходимо заполнить, приведены ниже:
Nick Name: укажите имя, которое вы предпочитаете
Host: mqtt.eclipse.org
Port: 1883
Client ID: укажите любой идентификатор, какой захотите
Вышеуказанные данные должны быть заполнены в соответствующих полях. Все остальные поля не являются обязательными и могут быть оставлены пустыми. После успешного завершения нажмите кнопку Сохранить, чтобы сохранить данные брокера.
После завершения процесс настройки приложения Android завершен, и теперь мы можем перейти к аппаратной части.
Пример использования
Далее мы подробно разберем как использовать полученные знания
Необходимые компоненты
Полный список необходимых деталей описан ниже. .
- NodeMCU
- Светодиод
- Макетная плата
- Провода для подключения
- Кабель для программирования
Принципиальная схема
Принципиальная схема для примера приведена ниже:
Загрузка скетча в ESP8266 для установления связи с брокером
Простой скетч обеспечивает все необходимые коммуникации между брокером MQTT и ESP8266. В этом разделе мы подробно рассмотрим, как работает это работает.
Настройка Arduino IDE и загрузка скетча
Если вы загружаете код в NodeMCU в первый раз, вам необходимо сначала настроить Arduino IDE. Чтобы сделать это, просто следуйте простой инструкции, приведенной ниже.
Сначала откройте Arduino IDE, затем перейдите в меню Файл–> Настройки.
Затем скопируйте приведенный ниже URL-адрес и вставьте его в поле "Дополнительные ссылки для Менеджера плат" и нажмите "Ок".
Ссылка: https://arduino.esp8266.com/stable/package_esp8266com_index.json
Затем перейдите в меню Инструменты> Плата> Менеджер плат. В окне менеджера введите ESP8266 в поле поиска и нажмите enter. Затем выберите последнюю версию из выпадающего списка и нажмите "Установить".
Наконец, после завершения установки перейдите в меню Инструменты -> Плата -> и выберите NodeMCU 1.0 (модуль ESP-12E). Теперь вы можете программировать NodeMCU с помощью Arduino IDE.
Код программы
Поскольку мы завершили настройку Arduino IDE, теперь мы можем загрузить скетч в NodeMCU. Но сначала давайте разберемся как всё это работает
Во-первых, подключаем библиотеки “ESP8266WiFi.h” для использования ESP8266 и “PubSubClient.h” для MQTT.
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
Библиотеку ESP8266WiFi мы автоматически скачали на предыдущем шаге, а PubSubClient необходимо загрузить из репозитория GitHub.
Затем определите сетевые учетные данные, такие как ваше имя пользователя и пароль Wi-Fi. Замените учетные данные “admin” и “12345678” на свои.
const char* ssid = "admin";
const char* password = "12345678";
Затем создаются экземпляры для классов WiFiClient и PubSubClient, которые будут использоваться во всей программе.
WiFiClient espClient;
PubSubClient client(espClient);
В разделе setup() мы сначала вызываем WiFi.begin() , вызов этого метода приведет к подключению ESP к вашей точке доступа.
WiFi.begin(ssid, password);
Далее мы проверяем сетевое подключение с помощью метода WiFi.status(). После успешного подключения на последовательный монитор выводится сообщение с SSID подключенной сети.
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.print("Connected to WiFi :");
Serial.println(WiFi.SSID());
Теперь нам нужно указать адрес брокера. Для этого мы использовали метод setServer; этот метод принимает два аргумента, которые мы предопределили ранее. Теперь, если мы хотим получать сообщения с сервера, нам нужно создать функцию обратного вызова. Для этого мы используем метод setCallback (обратного вызова) .
client.setServer(mqtt_server, mqtt_port);
client.setCallback(MQTTcallback);
Для подключения используется функция connect (ClientID) . Здесь ClientID - это имя клиента, и оно должно быть уникальным. Если он подключен, на последовательном мониторе может отображаться сообщение об успешном завершении.
if (client.connect("ESP8266"))
{
Serial.println("connected");
}
else
{
Serial.print("failed with state ")
Serial.println(client.state());
delay(2000);
}
Далее вызывается client.subscribe() , встроенную функцию MQTT, которая используется для подписки на определенную тему. В даном примере используется “esp / test” в качестве имени темы для подписки.
client.subscribe("esp/test");
Теперь вызывается функция MQTTcallback, чтобы проверить, доступна ли какая-либо обновленная информация или нет. Если доступны новые данные, эта функция обрабатывает полученные данные и печатает сообщение в мониторе последовательного порта с исходным сообщением и названием темы, в которой получено сообщение.
client.subscribe("esp/test");
Затем преобразовывается сообщение в строку, чтобы ее можно было сравнить и проверить на наличие каких-либо действий. В этом примере светодиод включается / выключается с помощью команд MQTT, как показано в приведенном ниже коде.
for (int i = 0; i < length; i++)
{
message = message + (char)payload[i];
}
Serial.print(message);
if (message == "on")
{
digitalWrite(LED, HIGH);
}
Наконец, публикуется информация в теме. Используется функция client.publish(). В этом примере проверяется статус кнопки, если кнопка нажата, то публикуется сообщение в теме “esp / test1”, как показано ниже.
if(digitalRead(D1)==0))
{
client.publish("esp/test1", "Hello from ESP8266");
}
else;
client.loop();
Полный код программы представлен ниже
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#define LED D0
const char* ssid = "admin";
const char* password = "12345678";
const char* mqtt_server = "mqtt.eclipse.org";
const int mqtt_port = 1883;
WiFiClient espClient;
PubSubClient client(espClient);
void setup()
{
pinMode(LED, OUTPUT);
pinMode(D1,INPUT_PULLUP);
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.print("Connected to WiFi :");
Serial.println(WiFi.SSID());
client.setServer(mqtt_server, mqtt_port);
client.setCallback(MQTTcallback);
while (!client.connected())
{
Serial.println("Connecting to MQTT...");
if (client.connect("ESP8266"))
{
Serial.println("connected");
}
else
{
Serial.print("failed with state ");
Serial.println(client.state());
delay(2000);
}
}
client.subscribe("esp/test");
}
void MQTTcallback(char* topic, byte* payload, unsigned int length)
{
Serial.print("Message received in topic: ");
Serial.println(topic);
Serial.print("Message:");
String message;
for (int i = 0; i < length; i++)
{
message = message + (char)payload[i];
}
Serial.print(message);
if (message == "on")
{
digitalWrite(LED, HIGH);
}
else if (message == "off")
{
digitalWrite(LED, LOW);
}
Serial.println();
Serial.println("-----------------------");
}
void loop()
{
if(digitalRead(D1)==0)
{
client.publish("esp/test1", "Hello from ESP8266");
delay(1000);
}
else;
client.loop();
}
Тестирование программы
Для окончательного тестирования мы собираемся использовать приложение для Android, которое настроили ранее.
Откройте клиентское приложение MQTT и убедитесь, что ваш мобильный телефон имеет активное подключение к Интернету. Кроме того, точка доступа, к которой подключен NodeMCU, должна иметь активное подключение к Интернету. Как только все будет подключено, мы собираемся отправить строку “Hello from ESP8266” из модуля ESP, которая появится в приложении Android, и мы получим уведомление. Далее отправим строку из приложения для Android, которая включит светодиод, подключенный к плате ESP8266.
Шаг 1: (Подписка на тему):
Нажмите на сохраненный MQTT в приложении, который мы настроили ранее. Появится всплывающее окно, на котором будет предложено “Подписаться на тему”.Ранее мы настроили тему как “esp / test1”. Итак, в приложении для Android мы напишем “esp / test1”. Нажмите “Подписаться”, при этом появится экран, подобный приведенному ниже, где будет написано "Сообщение не получено" из конкретной темы.
Теперь нажмите кнопку "Connected", которая подключена к NodeMCU. Теперь, согласно нашему коду, в теме будет опубликовано сообщение “Hello from ESP8266”, и на экране появится уведомление с полученным сообщением, как показано ниже.
Шаг 2: Публикация в теме:
Теперь, чтобы опубликовать в теме, нажмите на кнопку приложения со СТРЕЛКОЙ ВВЕРХ, и откроется экран, как показано ниже.
Теперь в поле Темы напишите “esp / test”, а в поле сообщения напишите “on” или “off”, чтобы включить и выключить светодиод соответственно. Например, если в теме опубликовано значение “on”, то светодиод будет включен, а если в теме опубликовано значение "off", то светодиод будет выключен.