- Что такое MQTT?
- Установка Mosquitto MQTT Broker на Raspberry Pi
- Тестирование Raspberry Pi Mosquitto Broker
- Принципиальная электрическая схема
- Код и объяснение
MQTT - это протокол, используемый для отправки и получения сообщений через Интернет. Ранее мы использовали этот протокол в Iot Electricity meter и Raspberry Pi Alexa для публикации данных в Интернете. В этом руководстве мы узнаем больше о MQTT и связанных с ним терминах. Здесь мы будем использовать Raspberry Pi в качестве локального брокера MQTT и управлять светодиодом, подключенным к NodeMCU ESP12E через панель инструментов приложения MQTT. Датчик DHT11 также подключен к NodeMCU, поэтому мы получаем показания температуры и влажности на панели управления MQTT, снова используя Raspberry Pi в качестве локального брокера MQTT.
Итак, давайте начнем с понимания MQTT и связанных с ним терминов.
Что такое MQTT?
MQTT расшифровывается как Message Queue Telemetry Transport, который разработан IBM. Это простой и легкий протокол, который используется для отправки и получения сообщений через Интернет и предназначен для устройств с низкой пропускной способностью. В настоящее время этот протокол часто используется в устройствах Интернета вещей для отправки и получения данных датчиков. Кроме того, в системах домашней автоматизации на основе Интернета вещей этот протокол можно легко использовать без использования большого количества интернет-данных.
В MQTT часто используются несколько терминов:
- Подпишитесь и опубликуйте
- Сообщение
- Тема
- Маклер
1. Подписка и публикация: подписка означает получение данных с другого устройства, а публикация означает отправку данных на другое устройство.
Когда устройство 1 отправляет данные устройству 2, оно называется издателем, а другое - подписчиком и наоборот.
2. Сообщение: сообщения - это информация, которую мы отправляем и получаем. Это могут быть данные или любой тип команды. Например, если мы публикуем данные о температуре в облаке, эти данные о температуре называются сообщением.
3. Тема: таким образом вы регистрируете интерес к входящим сообщениям или как указываете, где вы хотите опубликовать сообщение. Темы представлены строками, разделенными косой чертой. Данные по темам публикуются с помощью MQTT, а затем устройство MQTT подписывается на тему, чтобы получить данные.
4. MQTT Broker: Эта вещь отвечает за получение всех сообщений от издателей, фильтрует сообщения и затем публикует сообщения подписчикам, которые в них заинтересованы.
Когда этот брокер размещен в облаке, он называется облаком MQTT. Существует множество облачных сервисов MQTT, таких как Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure и т. Д. MQTT также можно использовать с популярным облаком Amazon AWS, что мы объяснили в руководстве «Приступая к работе с Amazon AWS».
Мы можем создать собственного брокера MQTT, используя Raspberry Pi. Это будет локальный брокер MQTT, то есть вы можете отправлять и получать данные в своей локальной сети только не откуда угодно. Итак, здесь мы установим брокер Mosquitto MQTT в Raspberry Pi, чтобы сделать его локальным брокером MQTT и отправлять данные о температуре из NodeMCU в приложение панели мониторинга MQTT. Также мы будем управлять светодиодом, подключенным к NodeMCU, с помощью брокера.
Установка Mosquitto MQTT Broker на Raspberry Pi
Откройте терминал в Raspberry pi и введите следующие команды для установки брокера
sudo apt update sudo apt install -y mosquitto mosquitto-clients
Дождитесь завершения установки. Теперь, чтобы запустить брокер при запуске raspberry pi, введите следующую команду
sudo systemctl включить mosquitto.service
Вот и все, мы готовы запустить нашего брокера MQTT. Чтобы убедиться, что он установлен правильно, введите следующую команду
москит -v
Эта команда предоставит вам версию вашего брокера MQTT. Это должно быть 1.4.x или выше.
Тестирование Raspberry Pi Mosquitto Broker
1. Запустите брокер Mosquitto в фоновом режиме, используя команду ниже.
москит -d
2. Теперь мы подпишемся на тему в exampleTopic, используя следующую команду
mosquitto_sub -d -t exampleTopic
3. Теперь мы опубликуем сообщение в exampleTopic.
mosquitto_pub -d -t exampleTopic -m «Привет, мир!»
Вы получите привет, мир! Сообщение в абонентском терминале.
Теперь пришло время контролировать и получать данные с другого устройства. В нашем случае мы используем приложение панели управления NodeMCU и MQTT .
- Сначала мы будем управлять светодиодом, отправив команду с помощью приложения, поэтому в этом случае NodeMCU будет вести себя как подписчик, а приложение - как издатель.
- Затем к ESP12E также подключен датчик DHT11, и он отправляет это показание температуры в приложение Mobile MQTT, поэтому в этом случае мобильный телефон будет подписчиком, а NodeMCU будет издателем. И для пересылки этих сообщений по соответствующим темам используется брокер Mosquitto MQTT.
Принципиальная электрическая схема
Подключите схему, как показано на схеме. Здесь для измерения температуры используется DHT11, но также можно использовать датчик температуры LM35. Мы уже использовали датчик DHT11 во многих наших проектах, в том числе с NodeMCU для создания метеостанции.
Давайте начнем писать код для NodeMCU, чтобы подписаться и опубликовать данные.
Код и объяснение
Здесь мы воспользуемся шаблоном библиотеки Adafruit MQTT и внесем необходимые изменения в код. Тот же код можно использовать для публикации и подписки данных в облаке Adafruit IO, просто изменив несколько вещей.Для этого загрузите библиотеку Adafruit MQTT из Sketch -> Включить библиотеку -> Управление библиотеками. Найдите Adafruit MQTT и установите его. После установки библиотеки. Перейдите к примерам -> Библиотека Adafruit mqtt -> mqtt_esp8266
Затем отредактируйте этот код в соответствии с нашим IP-адресом Raspberry Pi и учетными данными Wi-Fi.
Включите все библиотеки для ESP8266WIFI и Adafruit MQTT .
#включают
Затем определите SSID и пароль для вашего Wi-Fi, к которому вы хотите подключить ESP-12e. Убедитесь, что ваш RPi и NodeMCU подключены к одной сети.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
В этом разделе определяется сервер Adafruit, в данном случае IP-адрес вашего Raspberry Pi и порт сервера.
#define AIO_SERVER "IP-адрес вашего Pi" #define AIO_SERVERPORT 1883
Поля ниже останутся пустыми, потому что мы не используем облако Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
Затем создайте класс ESP8266 WiFiClient для подключения к серверу MQTT.
Клиент WiFiClient;
Настройте класс клиента MQTT, передав клиент WiFi и сервер MQTT, а также данные для входа.
Adafruit_MQTT_Client mqtt (& клиент, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Настройте канал «Температура» для публикации температуры.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
Настройте канал под названием "led1" для подписки на изменения.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
В функции настройки мы объявляем PIN-код NodeMCU, по которому вы хотите получить вывод. Затем подключите NodeMCU к точке доступа Wi-Fi.
void setup () { Serial.begin (115200); задержка (10); pinMode (светодиод, ВЫХОД); Serial.println (F («Демо Adafruit MQTT»)); // Подключаемся к точке доступа WiFi. Serial.println (); Serial.println (); Serial.print («Подключение к»); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) { …. …. … Настроить подписку MQTT для светодиодной ленты. mqtt.subscribe (& led1); }
В функции цикла мы гарантируем, что соединение с сервером MQTT живо, используя MQTT_connect (); функция.
недействительный цикл () { MQTT_connect ();
Теперь подпишитесь на фид led, получите строку от брокера MQTT и преобразуйте эту строку в число с помощью atoi (); функцию и запишите это число на вывод светодиода с помощью digitalWrite (); функция.
Adafruit_MQTT_Subscribe * подписка; while ((подписка = mqtt.readSubscription (20000))) { если (подписка == & led1) { Serial.print (F ("Получил:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (светодиод, led1_State); }
Теперь получите температуру в переменной и опубликуйте это значение с помощью функции Temperature.publish (t) .
float t = dht.readTemperature (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Failed")); } else { Serial.println (F ("ОК!")); }
Полный код с демонстрационным видео приведен в конце этого руководства. Загрузите код на плату NodeMCU и откройте приложение панели управления MQTT, которое вы загрузили на смартфон.
Вы также можете управлять Raspberry Pi GPIO из любой точки мира, используя облако MQTT, такое как Adafruit IO, MQTT.IO и т. Д., О чем мы узнаем в следующем руководстве.