- Що таке MQTT?
- Встановлення Mosquitto MQTT Broker на Raspberry Pi
- Тестування брокера комарів Raspberry Pi
- Кругова діаграма
- Код та пояснення
MQTT - це протокол, який використовується для надсилання та отримання повідомлень через Інтернет. Раніше ми використовували цей протокол у вимірювачах електроенергії Iot та Raspberry Pi Alexa для публікації даних в Інтернеті. У цьому підручнику ми дізнаємось більше про MQTT та терміни, пов’язані з ним. Тут ми будемо використовувати Raspberry Pi як локального посередника MQTT та керувати світлодіодом, підключеним до NodeMCU ESP12E через приладову панель програми MQTT. Датчик DHT11 також підключений до NodeMCU, тому ми отримуємо показники температури та вологості на інформаційній панелі MQTT, знову використовуючи Raspberry Pi як локального посередника MQTT.
Отже, почнемо з заниження MQTT та термінів, пов’язаних з ним.
Що таке MQTT?
MQTT означає скорочення повідомлень телеметрії транспорту, яке розроблено IBM. Цей простий і легкий протокол використовується для надсилання та отримання повідомлень через Інтернет і призначений для пристроїв із низькою пропускною здатністю. У наш час цей протокол часто використовується на пристроях IoT для надсилання та отримання даних датчиків. Крім того, в системах домашньої автоматизації на основі IoT цей протокол можна легко використовувати, не використовуючи велику кількість Інтернет-даних.
Є кілька термінів, які часто використовуються в MQTT:
- Підпишіться та публікуйте
- повідомлення
- Тема
- Брокер
1. Підписка та публікація: передплата означає отримання даних з іншого пристрою та публікація засобів надсилання даних на інший пристрій.
Коли device1 надсилає дані на device2, він відомий як Publisher, а інший - Subscriber і навпаки.
2. Повідомлення: Повідомлення - це інформація, яку ми надсилаємо та отримуємо. Це можуть бути дані або будь-який тип команди. Наприклад, якщо ми публікуємо дані про температуру в хмарі, то ці дані про температуру відомі як Повідомлення.
3. Тема: Це спосіб, яким ви реєструєте інтерес для вхідних повідомлень, або спосіб вказівки місця публікації повідомлення. Теми представлені рядками, розділеними косою рискою. Дані публікуються за темами за допомогою MQTT, а потім пристрій MQTT підписується на тему, щоб отримати дані.
4. Брокер MQTT: ця річ відповідає за отримання всіх повідомлень від видавців, фільтрує повідомлення, а потім публікує повідомлення передплатникам, які їх цікавлять.
Коли цей брокер розміщується в хмарі, він називається хмарою 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-клієнти
Дочекайтеся закінчення установки. Тепер, щоб запустити брокера при запуску Raspberry Pi, введіть наступну команду
sudo systemctl включити mosquitto.service
Ось і все, ми готові запустити наш брокер MQTT. Щоб перевірити, чи він правильно встановлений, введіть таку команду
комар -в
Ця команда надасть вам версію вашого брокера MQTT. Має бути 1.4.x або вище.
Тестування брокера комарів Raspberry Pi
1. Запустіть брокера Mosquitto у фоновому режимі, використовуючи команду нижче
москіт -д
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 із ескізу -> Включити бібліотеку -> Керувати бібліотеками. Шукайте 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 Температура = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ канали / температура");
Налаштуйте стрічку під назвою '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); поки (WiFi.status ()! = WL_CONNECTED) { …. ... ... Налаштування передплати на MQTT для світлодіодної стрічки. mqtt.subscribe (& led1); }
У функції циклу ми переконаємося, що з'єднання з сервером MQTT є активним, використовуючи MQTT_connect (); функція.
недійсний цикл () { MQTT_connect ();
Тепер підпишіться на «світлодіодний» канал і отримайте рядок від брокера MQTT і перетворіть цей рядок на число, використовуючи atoi (); функціонувати і записати цей номер на світлодіодний штифт за допомогою digitalWrite (); функція.
Передплата Adafruit_MQTT_Subscribe *; while ((subscription = mqtt.readSubscription (20000))) { if (subscription == & led1) { Serial.print (F ("Got:")); 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")); } ще { Serial.println (F ("Добре!")); }
Повний код із демонстраційним відео наведено в кінці цього посібника. Завантажте код на плату NodeMCU та відкрийте програму інформаційної панелі MQTT, яку ви завантажили у смартфон.
Ви також можете керувати Raspberry Pi GPIO з будь-якої точки світу, використовуючи хмару MQTT, таку як Adafruit IO, MQTT.IO тощо, про що ми дізнаємось у наступному уроці.