- Какво е 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 означава телеметричен транспорт на опашката за съобщения, който е проектиран от IBM. Този протокол е прост и лек, който се използва за изпращане и получаване на съобщения през интернет и е предназначен за устройства, които използват ниска честотна лента. В днешно време този протокол често се използва в IoT устройствата за изпращане и получаване на данни от сензорите. Също така, в системите за домашна автоматизация, базирани на IoT, този протокол може лесно да се използва, без да се използва голяма част от интернет данните.
Малко са термините, които често се използват в MQTT:
- Абонирайте се и публикувайте
- Съобщение
- Тема
- Брокер
1. Абониране и публикуване: Абонамент означава да получите данните от друго устройство и да публикувате средства за изпращане на данните на друго устройство.
Когато device1 изпраща данните на device2, тогава той е известен като Publisher, а друг е Subscriber и обратно.
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
Изчакайте инсталацията да приключи. Сега, за да стартирате брокера при стартиране на малинов пи, напишете следната команда
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 "Здравей, свят!"
Ще получите Hello world! Съобщение в абонатния терминал.
Сега е време да контролираме и получаваме данните от друго устройство, в нашия случай използваме приложението за табло NodeMCU и MQTT .
- Първо ще контролираме светодиода чрез изпращане на команда с помощта на App, така че в този случай NodeMCU се държи като абонат, а App като издател.
- Тогава 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 .
#include
След това дефинирайте 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 "/ емисии / led");
Във функцията за настройка декларираме ПИН на NodeMCU, за който искате да получите изход. След това свържете NodeMCU с Wi-fi точка за достъп.
void setup () { Serial.begin (115200); забавяне (10); pinMode (LED, OUTPUT); Serial.println (F ("Demofruit MQTT демонстрация")); // Свързване към WiFi точка за достъп. Serial.println (); Serial.println (); Serial.print ("Свързване с"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); докато (WiFi.status ()! = WL_CONNECTED) { …. ... ... Настройте MQTT абонамент за led подаване mqtt.subscribe (& led1); }
В цикъл функция ще гарантираме, че връзката към MQTT сървъра е жива, използвайки MQTT_connect (); функция.
невалиден цикъл () { MQTT_connect ();
Сега се абонирайте за "led" емисия и вземете низа от MQTT брокер и конвертирайте този низ в число, използвайки atoi (); функционира и записва този номер на LED пин с помощта на digitalWrite (); функция.
Абонамент Adafruit_MQTT_Subscribe *; while ((абонамент = mqtt.readSubscription (20000))) { if (абонамент == & led1) { Serial.print (F ("Получих:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, 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 и т.н., което ще научим в следващия урок.