Рубрики
Проекты на ESP8266

Подключение NodeMCU ESP8266 к MQTT брокеру с помощью Arduino IDE

Технологии интернета вещей (Internet of Things, IoT) с каждым годом все более прочно входят в нашу жизнь, позволяя устройствам объединяться в единую глобальную сеть передачи данных. В настоящее время одним из самых популярных протоколов обмена данными между устройствами является протокол MQTT (Message Queuing Telemetry Transport – телеметрический транспорт с очередями сообщений). В данной статье мы рассмотрим подключение и осуществление взаимодействия между платой NodeMCU ESP8266 и популярным брокером Eclipse, работающим по протоколу MQTT.

Ранее на нашем сайте мы рассматривали следующие проекты с использованием протокола MQTT:

Принцип работа протокола MQTT

MQTT – это «легкий» (малозатратный) протокол передачи сообщений, использующий модель издатель/подписчик (publish/subscribe) и позволяющий осуществлять передачу сообщений между множественными устройствами. Также с помощью протокола MQTT можно передавать/принимать данные и управлять различными устройствами, например, считывать информацию с датчиков. Он разработан с учетом протокола TCP, поэтому он работает существенно быстрее чем протоколы подобные HTTP. К его достоинствам можно отнести крайне низкие требования к ресурсам, малый объемом используемой памяти устройств и встроенный устойчивый (робастный) протокол обеспечения безопасности. Благодаря этим достоинствам протокол MQTT получил широкое распространение в современном мире.

Структурная схема работы протокола MQTT показана на следующем рисунке.

Кратко рассмотрим основные функции «участников» протокола MQTT.

MQTT клиент (Client)

MQTT клиент – это любое устройство (к примеру, микроконтроллер или сервер), которое выполняет функции MQTT и взаимодействует с центральным сервером, который в данном случае называют брокером (“broker”). Брокер занимается обработкой процессов обмена данными между подключенными устройствами.

MQTT издатель (Publisher)

Клиенты, которые осуществляют передачу данных (например, датчики) называются издателями (publisher). Издатели публикуют свою информацию в определенной теме. Тема (topic) – это путь, по которому осуществляет публикация сообщений и подписка на них. После того как издатели опубликовали свою информацию в определенных темах, брокер осуществляет передачу этой информации (сообщений) подписчикам (клиентам), которые подписались на получение информации по этим темам.

MQTT подписчик (Subscriber)

MQTT подписчик подписывается на темы MQTT брокера чтобы получать сообщения из этих тем, передаваемые брокером.

Брокер Eclipse Mosquitto

Eclipse Mosquitto – это легковесный MQTT брокер с открытым исходным кодом, удобный для применения в различных проектах интернета вещей. Протокол MQTT обеспечивает низко затратную передачу информации в соответствии с моделью издатель/подписчик. Более подробно про принципы работы данного брокера вы можете прочитать на его официальном веб-сайте.

Установка брокера Eclipse Mosquitto

Для того чтобы иметь возможность обмена данными с брокером его нужно сначала установить. В данном проекте мы будем использовать приложение Android для публикации и подписки информации от брокера. Для установки данного брокера выполните следующую последовательность шагов.

Шаг 1. Сначала скачайте приложение “MQTT client”, доступное в магазине Google Play Store/App Store и установите его. Главный экран данного приложения выглядит следующим образом.

Шаг 2. В приложении нажмите на знак “+” чтобы получить доступ к дополнительным опциям в приложении, в данном случае мы будем добавлять нового брокера (new broker). После добавления нового брокера в приложении вы на экране смартфона должны увидеть следующий экран.

Шаг 3. Далее нам необходимо настроить работу брокера. Сначала выверите опцию “Enabled”. После этого заполните следующие поля.

Nick Name: заполните по своему желанию.
Host: mqtt.eclipse.org
Port: 1883
Client ID: введите ID по своему усмотрению.

После успешного заполнения этих полей нажмите на кнопку save чтобы сохранить настройки брокера.

На этом процесс настройки приложения будет завершен.

Необходимые компоненты

  1. NodeMCU ESP8266 (купить на AliExpress).
  2. Светодиод (купить на AliExpress).
  3. Макетная плата.
  4. Кнопка.
  5. Соединительные провода.
  6. Кабель для программирования.

Схема проекта

Схема MQTT клиента на основе платы NodeMCU ESP8266 представлена на следующем рисунке.

Объяснение программы для NodeMCU ESP8266

В коде нашей программы мы будем осуществлять взаимосвязь между MQTT брокером и платой для NodeMCU ESP8266.

Если вы будете загружать программу в NodeMCU ESP8266 в первый раз, то сначала вам нужно будет установить Arduino IDE. После ее установки откройте в ней пункт меню File–>Preferences–>Settings.

Далее скопируйте ниже приведенный URL и вставьте его в поле the ‘Additional Board Manager URL’, после чего нажмите ‘Ok’.

URL: https://arduino.esp8266.com/stable/package_esp8266com_index.json

Затем откройте пункт меню Tools > Board > Boards Manager. В этом окне наберите в строке поиска ESP8266 и нажмите enter. После этого выберите самую последнюю версию из отображенного списка и нажмите install (установить).

Затем, когда процесс установки необходимых компонентов будет завершен, выберите в Arduino IDE пункт меню Tools ->Board -> и в нем выберите NodeMCU 1.0 (ESP-12E Module). После этого вы сможете программировать вашу плату NodeMCU ESP8266 с помощью Arduino IDE.

Теперь мы можем приступать к написанию кода нашей программы. Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе подключим используемые библиотеки: “ESP8266WiFi.h” для использования модуля ESP8266 и “PubSubClient.h” для работы с протоколом MQTT.

Библиотека для работы с модулем ESP8266 встроена в Arduino IDE, а библиотеку PubSubClient необходимо скачать с репозитория GitHub.

Далее в коде программы укажите имя и пароль для своей сети Wi-Fi. В нашем случае это “admin” и “12345678”.

Далее нам необходимо сконфигурировать сервер MQTT. В нашем проекте мы используем сервер Eclipse MQTT, поэтому адресом сервера у нас является “mqtt.eclipse.org”. Но вместо Eclipse вы можете использовать и других брокеров, например, Mosquitto, Adafruit. Тогда для них в программе нужно будет соответствующим образом изменить адрес сервера и номер порта.

Далее создадим объекты классов WiFiClient и PubSubClient.

Далее, в функции setup(), мы будем вызывать функцию WiFi.begin() чтобы подключить наш модуль ESP8266 к точке доступа WiFi.

Затем мы проверим успешность соединения с сетью WiFi с помощью функции WiFi.status(). После успешного соединения мы напечатаем соответствующее сообщение в окне монитора последовательной связи.

После этого нам необходимо создать (инициализировать) брокера. Для этого мы будем использовать функцию setServer, в ней два аргумента, которые мы определили ранее. Теперь, если вы хотите получать сообщения с сервера, то необходимо использовать функцию setCallback(callback).

После этого мы будем использовать функцию client.connect(«ESP8266») чтобы соединиться с клиентом ESP8266.

Затем мы будем использовать встроенную в протокол MQTT функцию client.subscribe(), которая используется для подписки на определенную тему. В нашем проекте мы в качестве имени подписчика использовали “esp/test”.

Далее мы будем вызывать функцию MQTTcallback чтобы проверить есть ли для нас какая либо обновленная информация или нет. Если новые данные доступны, эта функция обрабатывает принимаемые данные и печатает сообщение в окне монитора последовательной связи, в котором будут указаны текст сообщения и имя темы (topic name), из которого это сообщение было принято.

После этого мы преобразуем данное сообщение в строку, чтобы его можно было сравнить с заранее определенными сообщениями и на основании результатов сравнения выполнить определенные действия. В данном проекте мы будем включать/выключать (ON/OFF) светодиод с помощью MQTT команд.

Далее, мы будем публиковать сообщение в теме – для этого мы будем использовать функцию client.publish(). В нашем проекте мы будем проверять состояние кнопки, если кнопка нажата, то сообщение будет публиковаться в теме “esp/test1”.

Тестирование работы проекта

Для тестирования работы нашего проекта мы будем использовать Android приложение, которое мы установили ранее.

Откройте приложение MQTT и убедитесь в том, что ваш смартфон имеет соединению с сетью Интернет. Точка доступа WiFi, к которой подключается наша NodeMCU, также должна иметь соединение с сетью Интернет. Когда все соединения установлены, мы должны передать строку “Hello from ESP8266” с нашего модуля ESP8266, которая должна отобразиться в Android, после этого мы должны получить подтверждение приема. Затем мы будем передавать из Android приложения строку, которая будет включать светодиод, подключенный к NodeMCU.

Шаг 1. Подписка на тему.

Нажмите на сохраненную опцию MQTT в приложении, которую мы настроили ранее. После этого у вас на экране должно появиться всплывающее окно, в котором будет кнопка “Subscribe to a Topic”. В программе мы дали теме название “esp/test1”. Поэтому и в Android приложении нам необходимо написать “esp/test1”.

Нажмите на Subscribe (подписаться), после чего вы увидите экран, показанный на рисунке ниже. На нем будет написано что не принято никакого сообщения (“No message received”) из темы, на которую вы подписаны.

После этого нажмите на кнопку, которая подключена к NodeMCU в нашем проекте. После этого сообщение “Hello from ESP8266” будет опубликовано в нашей теме и на экране вы увидите извещение о том, что сообщение было принято.

Шаг 2. Публикация сообщения в теме.

Для этого нажмите на кнопку вверх (UP ARROW button) в Android приложении, после чего вы увидите следующий экран.

После этого в поле ввода названия темы напишите “esp/test”, а в поле ввода текста сообщения — “on” или “off” чтобы включить или выключить светодиод.

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

2 ответа к “Подключение NodeMCU ESP8266 к MQTT брокеру с помощью Arduino IDE”

Добрый день. Возникла проблемма. Скопировал скетч в ARDUINO IDE.Загружал программу и в NodemCu V3 и в Wemos D1 mini. Монитор порта пишет что соединение с брокером MQTT установлено Connecting to MQTT..
failed with state 2
Причину не знаю. Программирование только начал изучать.В скетч вставил мои данные сети и пароль. Возможно что то неправильно с регистрацией в MQTT client. Все делал пошагово как в статье. Если есть ответ прошу написать. Спасибо

Добрый вечер. У вас совпадают адрес сервера и номер порта для подключения к брокеру MQTT в программе (скетче) и в приложении? Также можно еще попробовать другое приложение брокера MQTT

Добавить комментарий

Ваш адрес email не будет опубликован.