Рубрики
Проекты на 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” чтобы включить или выключить светодиод.

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

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

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

Телепортируйте пожалуйста плат NodeMCU ESP8266 v.3 ко мне,а то как то с версии v.1 не получается сделать v.3

Хотелось бы вам помочь, но, к сожалению, я не волшебник

ЭТО СЛУЧАЙНО НЕ ОБНОВЛЕННОЕ РЕЛИКТОВОЕ ИЗЛУЧЕНИЕ ВСЕЛЕННОЙ.ИГОРЬ

Игорь, а вас не учили что капсом писать неприлично?

В мониторе порта Connecting to WiFi…
failed with status -2 и приложение MQTT CLIENT не отвечает

Так это проблема не с MQTT клиентом, у вас сетевое подключение настроено неправильно. forum.arduino.cc/t/mqtt-failed-with-state-2-on-esp8266/641589 — здесь решение этой проблемы обсуждается

сетевое подключение настроено неправильно.Что необходимо сделать?При нажатии кнопки RST на в мониторе порта Connecting to RT-WiFi-7D36

Здесь проблема не в схеме проекта, а в вашем роутере, обеспечивающем вам выход в сеть интернет. У вас все остальное что связано с интернетом, нормально работает? Может в настройках вашего роутера отключен, к примеру, порт TCP соединения, который необходим для работы представленного проекта

я же вам написал не морочте головы людям и мгновенно ЗАКРЫВАЙТЕ ЭТОТ САЙТ

А вы сможете открыть такой же сайт и лучше чем мой?

НЕРЕКОМЕНДУЮ ЭТОТ(проект).И К СОВЕТАМ admin new только ЮМОРОМ.

Мне жаль что этот проект вам не понравился. Но насчет моих советов мне уже многие сказали спасибо. Нельзя же знать абсолютно все, к каким то проектам я могу дать хорошие советы, а к каким то, к сожалению, только поверхностные

Так и в какой точке пространства находится mqtt сервер?Расстояние до него min и max?Игорь.

MQTT — это верхнеуровневый протокол, не он определяет дальность связи, а те ниже стоящие протоколы, поверх которых он работает. Если вы будете использовать его поверх RS-232, то дальность будет небольшая, а если поверх протокола IP (как в данном проекте), то дальность будет глобальная — везде, где есть сеть интернет

Я может быть старообрядец, но зачем использовать MQTT, если достаточно создать свой сайт и принимать, и отправлять команды на php? На ардуинке в этом случае достаточно семь строк кода.У меня так , например, лампа с Алисой работает… И вряд ли MQTT надежен…

Конечно, ваше решение имеет право на жизнь, но создание сайта для многих это не такое уж и простое занятие. К тому же протокол MQTT должен работать быстрее чем протоколы на основе http. Конечно, у MQTT есть свои недостатки и в некоторых случаях он не так универсален как хотелось бы, но все равно это невероятно популярный протокол в современном мире. Почти все статьи у меня на сайте, связанные с протоколом MQTT, набирают достаточно большое количество просмотров — это косвенно свидетельсвтует о его популярности.

А другие проекты для модуля ESP8266 у вас нормально компилируются? Корректно ли вы установили библиотеку для данного проекта? Какое сообщение об ошибке выдается?

Добрый день. Не совсем понял что вы хотите сделать. Может быть, вы хотите реализовать что-нибудь похожее на этот проект?

Да.Т.е войти в Глобальную сеть и передать проект из точки А в точку Б независмо от протяженности и расстояния.Земной шар или земля ~ 40000км. Проект содержит скетч Ардуино Webinterfase ,приложение WlED , мобильный телефон Galaks A5, Ноутбук HP и портативный Роутер HUAWEI- AD 67

Ну а чем вас тогда не устраивает приведенный проект с Google Firebase? Если Google Firebase вам не нравится, можно использовать другие аналогичные облачные сервисы

Google Firebase во всех этих примерах столько воды и неконтретики.Даже в Git не зарегистрируешься.А,что в других приложениях зарегистровться?.Короче целая проблема и с теми же паролями.Admin-neew вы со своими советами похоже только вампирите время и энергию,да и здоровье тоже.Игорь .

Ну нельзя же написать статьи, удовлетворяющие абсолютно всем запросам пользователей, этих запросов очень много. И те же статьи про Google Firebase многим пользователям понравились. Мне жаль что конкретно вам они не помогли

Тоже получаю failed with state-2.
Схема такая:
Подключается nodemcu ESP8266 к роутеру по WiFi. к роутеру подключен компьютер. на компьютере (localhost) запущен сервис mosquitto -v на порту 1883.
На роутере порт прокинул, в брэндмауэре разрешил входящие TCP соединения на 1883 порт.
А вопрос такой: почему вот здесь именно такое имя клиента используется «ESP8266»? Может быть у меня клиент по другому называется, и поэтому эта процедура возвращает false?
28   if (client.connect(«ESP8266»))

Судя по той информации, которая опубликована в сети по этому поводу, данная проблема чаще всего вызвана включенным фаерволом в вашей операционной системе. Посмотрите здесь — esp8266.ru/forum/threads/arduino-client-for-mqtt-oshibka-pri-podkljuchenii-2.814/?ysclid=lbo10yyfat431271666. Или вот это видео — youtube.com/watch?v=3oQDBnfXl-g

Решил проблему сменой брокера. (на локальной машине не заработало). Вообще спасибо за идею!

Да не за что. Успехов вам. К сожалению, когда добавил на сайт несколько сотен статей, постепенно начинаешь потихоньку забывать то, что было в ранних статьях. Но пользователи же, когда спрашивают что то в комментариях, думают что я так хорошо помню эту конкретную статью как будто добавил ее только вчера. А иногда сразу и не вспомнишь, приходится самому просматривать статью, освежать память

Что-то ничего не получается, адреса в приложении на телефоне и в скетче совпадают mqtt.eclipse.org:1883
09:05:32.795 -> Connecting to MQTT…
09:05:37.962 -> failed with state -2
а авторизация нигде не нужна?
что ещё я не так делаю?

Авторизация в этом проекте нужна только при подключении к сети WiFi, в приложении брокера мы авторизацию не настраивали. У вас смартфон и модуль ESP8266 в одной сети WiFi находятся? На каком моменте у вас происходит сбой связи — при подключении WiFi или уже непосредственно при работе протокола MQTT? Хотя судя по вашему сообщению скорее второе. И проверьте открыт ли у вас порт в операционной системе на входящие соединения

Я правильно понимаю, что под словами «Для того чтобы иметь возможность обмена данными с брокером его нужно сначала установить.» предполагается, что MQTT брокер уже установлен к примеру на Малинке? У меня стоит брокер Mosquitto на роутере Keenetic, этот проект будет работать с ним или нужна какая то другая библиотека, а не PubSubClient.h?

В данной статье роль MQTT брокера, с которым взаимодействует модуль ESP8266, выполняет приложение для смартфона. Теоретически можно использовать брокера, установленного на любом другом устройстве, если вы сможете настроить его логику работы такую же, как в представленной статье. Либо же немного придется изменить программу проекта

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

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

У Вас скорее всего порт в операционной системе на входящие соединения не открыт.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *