Установка Mosquitto MQTT брокера на Raspberry Pi для технологии IoT


MQTT – это протокол, который используется для передачи и приема сообщений в сети Интернет. Также он очень популярен в сфере интернета вещей (Internet of Things, IoT). В данной статье мы рассмотрим основные принципы протокола MQTT и будем использовать плату Raspberry Pi в качестве локального MQTT брокера (MQTT broker). С помощью данного брокера и панели инструментов приложения MQTT мы будем управлять светодиодом, подключенным к NodeMCU ESP12E. Также к NodeMCU будет подключен датчик температуры и влажности DHT11, данные с которого мы будем передавать MQTT брокеру, установленному на Raspberry Pi.

Внешний вид проекта установки Mosquitto MQTT брокера на плату Raspberry Pi

Основные принципы работы протокола MQTT

Протокол MQTT (Message Queue Telemetry Transport) был разработан компанией IBM и может применяться для передачи и приема сообщений в сети интернет. Протокол очень простой и "легкий" и может применяться устройствами, имеющими малую полосу пропускания, то есть подключенными к каналу связи с маленькой пропускной способностью. В настоящее время данный протокол широко используется в устройствах интернета вещей (IoT) для передачи и приема данных от различных датчиков. Достоинством данного протокола при его работе в сфере интернета вещей является то, что он требует сравнительно мало интернет трафика для своего функционирования.

В протоколе MQTT используются следующие основные термины:

  1. Subscribe and Publish (издатель-подписчик).
  2. Message (сообщение).
  3. Topic (тема).
  4. Broker (брокер).

1. Subscribe (подписка) и Publish (публикование): подписка означает получение данных от другого устройства, а публикование означает передачу данных другому устройству.

Принцип модели "издатель-подписчик"

Когда устройство 1 передает данные устройству 2, то устройство 1 называют издателем (Publisher), а устройство 2 – подписчиком (Subscriber).

2. Message (сообщение). Сообщения – это информация, которую мы передаем и получаем. Это могут быть или данные, или команда. Например, если мы передаем (publishing) данные температуры в облако, то эти данные температуры в протоколе MQTT называются сообщением (Message).

3. Topic (тема) – это способ указать ваши интересы для входящих или исходящих сообщений. Темы (топики) в протоколе MQTT представляются строками, разделенными знаком прямого слэша. Данные публикуются в соответствующих темах протокола MQTT и затем MQTT устройства подписываются на интересующие их темы чтобы получать данные.

4. MQTT Broker (брокер) – это устройство-координатор ответственно за прием всех сообщений от всех издателей (publishers), фильтрацию этих сообщений и передачу сообщений тем подписчикам (subscribers), которым эти сообщения интересны.

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

Когда хостингом MQTT брокера является облако (cloud), оно называется MQTT облаком. В современном мире существует уже достаточно много подобных "облачных" MQTT брокеров, таких как Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure и т.д.

Но мы можем сконструировать своего собственного MQTT брокера с использованием платы Raspberry Pi. Наш брокер будет локальным, то есть он сможет передавать и принимать сообщения только в нашей локальной сети. Таким образом, в этом проекте мы будем устанавливать Mosquitto MQTT брокера на плату Raspberry Pi чтобы превратить ее в локального MQTT брокера, с помощью которого мы будем управлять светодиодом, подключенным к NodeMCU (устройство управления многосторонней связью). Также мы будем передавать данные температуры и влажности от NodeMCU в панель инструментов MQTT приложения.

Установка Mosquitto MQTT брокера на Raspberry Pi

Откройте окно терминала на вашей плате Raspberry Pi и введите там следующие команды чтобы установить брокер:

Подождите пока закончится процесс установки. После этого для запуска брокера введите команду:

Это все, что нужно сделать для установки и запуска MQTT брокера на плату Raspberry Pi. Чтобы проверить корректность его установки введите команду:

В результате выполнения данной команды вам выдастся номер версии MQTT брокера. Он должен быть 1.4.x или выше.

Тестирование работы Mosquitto MQTT брокера на Raspberry Pi

1. Запустите Mosquitto брокера в фоновом режиме с помощью команды:

2. После этого подпишемся на тему с названием exampleTopic.

3. Далее опубликуем приветственное сообщение в теме exampleTopic.

После этого вы получите сообщение "Hello world" в терминале.

Внешний вид конструкции проекта

После этого можно управлять и получать данные с другого устройства, в нашем случае мы будем использовать NodeMCU и панель инструментов MQTT приложения (MQTT dashboard app - его нужно скачать на ваш смартфон из Play Market).

Вначале мы будем управлять светодиодом передавая команды из приложения, то есть NodeMCU будет выступать в качестве подписчика (subscriber), а приложения – в качестве издателя (publisher).

Также в нашем проекте к NodeMCU ESP12E подключен датчик DHT11, с которого считываются данные температуры и передаются приложению MQTT, то есть в данном случае приложение будет подписчиком, а NodeMCU – издателем. Для передачи этих сообщений в соответствующих темах (Topics) будет использоваться MQTT брокер.

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

Схема подключения светодиода и датчика DHT11 к NodeMCU ESP12E представлена на следующем рисунке.

Схема подключения светодиода и датчика DHT11 к NodeMCU ESP12E

Для измерения температуры мы использовали датчик DHT11, который мы ранее уже использовали во множестве проектов.

Для работы с проектом нам необходимо установить ряд библиотек.

Установка необходимых библиотек для проекта

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

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

Основой программы для нашего проекта будет библиотека Adafruit MQTT library. Также код нашей программы с небольшими внесенными в него изменениями можно будет использовать для опубликования и получения данных в облаке Adafruit IO.

Первым делом скачаем библиотеку Adafruit MQTT с помощью пункта меню Sketch -> Include Library -> Manage Libraries. В открывшемся окне выполните поиск библиотеки Adafruit MQTT и установите ее. После установки библиотеки откройте пример по адресу examples -> Adafruit mqtt library -> mqtt_esp8266.

Открытие примера работы с библиотекой Adafruit MQTT

В открывшемся коде примера измените следующие данные: IP адрес Raspberry Pi и данные для подключения к сети Wi-Fi.

Подключим все используемые библиотеки в программе:

Затем введем идентификатор (SSID) и пароль Wi-Fi сети, к которой вы будете подключаться с помощью ESP-12e. Убедитесь в том, что ваша плата Raspberry Pi и NodeMCU подключаются к одной и той же сети.

Далее введем данные сервера Adafruit: IP адрес вашей платы Raspberry Pi и порт сервера.

Следующие поля оставим пустые поскольку мы не используем облако Adafruit (Adafruit cloud).

Далее создадим класс ESP8266 WiFiClient чтобы подключаться к MQTT серверу.

Создадим объект MQTT с необходимыми параметрами: адрес сервера, порт сервера и данные для логина к серверу.

Создадим фид (feed) с названием 'Temperature' для опубликования данных температуры.

Создадим фид с названием 'led1' чтобы подписаться на изменения.

В функции setup мы объявим используемые контакты NodeMCU. Далее подключим NodeMCU к точке доступа Wi-fi.

В функции loop мы будем проверять "живо" ли соединение с MQTT сервером с помощью функции MQTT_connect().

Далее мы будем подписываться на фид ‘led’, получать строку с сообщением от MQTT брокера и преобразовывать эту строку в число с помощью функции atoi(). После этого мы будем подавать это число на контакт, к которому подключен светодиод, с помощью функции digitalWrite().

Далее мы будем считывать значение температуры в переменную и публиковать это значение с помощью функции Temperature.publish(t).

В конце статьи вы можете посмотреть видео, на котором подробно показана работа проекта. Для тестирования работы проекта загрузите код программы в NodeMCU и откройте MQTT dashboard app (панель инструментов приложения MQTT), которую вы ранее скачали на свой смартфон.

Также подобным образом вы можете управлять контактами ввода/вывода (GPIO) платы Raspberry Pi из любой точки Земли используя облачные сервисы MQTT, такие как Adafruit IO, MQTT.IO и т.д.

Исходный код программы

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

Также можете посмотреть еще одно видео (на английском языке), которое подробно объясняет процесс использования MQTT брокера в плате Raspberry Pi.

(Проголосуй первым!)
Загрузка...
4 289 просмотров

Комментарии

Установка Mosquitto MQTT брокера на Raspberry Pi для технологии IoT — 6 комментариев

    • Здесь 20000 - это время в миллисекундах, в течение которого мы будем "слушать" сообщения, приходящие от MQTT сервера

    • 1. Получается что 20 секунд программа "стоит" и ничего другого не может делать потому что занята "прослушкой"? А без этого никак? Ну то есть как организовать общение нескольких ESP8266, среди которых есть "мастера" (назовём его вторичный прибор) которым нужна информация для решения, а другие это контроллеры с датчиками (назовем их первичными приборами)? К примеру первички отравляют информацию брокеру с периодичностью 5 секунд, а вторичные запрашивают у брокера с периодичностью 20 секунд?
      2. MQTT subscription for led feed. - что это такое и почему заканчивается точкой?
      3. subscription = mqtt.readSubscription(20000) - возвращает истину в случае если появилась новая публикация по любой из наших подписок (если подписок несколько)?
      4. subscription я так понял int, а если необходимо обмениваться не целочисленными значениями или сообщениями?
      5. Пока использую Blynk, но хотел бы уйти от него. На роутере Keenetic установлен Mosquitto. Подойдут ли приведенные Вами библиотеки Adafruit или что то необходимо другое?
      И спасибо большое за то что отвечаете!

      • 1. Если программа примет сообщение гораздо быстрее чем за 20 секунд, то сразу же начнет исполняться тело цикла и в этом случае обработка сообщения завершится гораздо быстрее. Если же сообщение по какой то причине не принимается то да, программа будет ждать 20 секунд.
        2. Это просто комментарий к команде, которая идет после него. Просто в описании программы пропущен знак комментария (сейчас поправлю). В полном тексте программы значок комментария стоит и текст комментария переведен.
        3. Да, возвращает истину в случае если появилась новая публикация по любой из наших подписок, а потом в теле цикла мы с помощью условного оператора должны проверить сообщение по какой подписке у нас пришло. В нашем примере у нас используется всего одна подписка - led1.
        4. Изначально в представленном проекте мы получаем сообщение в виде строки, а потом преобразуем эту строку в число с помощью функции atoi(). Ну а в общем случае мы в этой строке можем передавать что угодно, не обязательно число.
        5. Тут не знаю, к сожалению. Никогда не работал с Mosquitto на роутерах.

  1. "Когда устройство 1 передает данные устройству 2", всё таки не устройству наверное, а брокеру?

    • Нет, в статье написано: когда устройство 1 передает данные устройству 2, то устройство 1 называют издателем (Publisher), а устройство 2 – подписчиком (Subscriber). Брокер является посредником между ними, то есть через него передаются эти данные, но не он получатель этих данных

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

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