- Ce este MQTT?
- Instalarea Mosquitto MQTT Broker pe Raspberry Pi
- Testarea brokerului Raspberry Pi Mosquitto
- Diagrama circuitului
- Cod și explicație
MQTT este un protocol utilizat pentru a trimite și primi mesaje pe internet. Am folosit anterior acest protocol în Iot Electricity meter și Raspberry Pi Alexa pentru a publica datele pe internet. În acest tutorial vom afla mai multe despre MQTT și despre termenii aferenți acestuia. Aici vom folosi Raspberry Pi ca broker local MQTT și vom controla un LED conectat la NodeMCU ESP12E prin tabloul de bord al aplicației MQTT. Un senzor DHT11 este, de asemenea, conectat la NodeMCU, astfel încât să obținem citirea temperaturii și umidității pe tabloul de bord MQTT, utilizând din nou Raspberry Pi ca broker local MQTT.
Așadar, să începem prin a subestima MQTT și termenii aferenți acestuia.
Ce este MQTT?
MQTT înseamnă Message Queue Telemetry Transport, care este proiectat de IBM. Acest protocol este simplu și ușor, care este utilizat pentru a trimite și primi mesaje pe internet și este conceput pentru dispozitivele care au o lățime de bandă redusă. În prezent, acest protocol este frecvent utilizat în dispozitivele IoT pentru a trimite și primi datele senzorilor. De asemenea, în sistemele de automatizare a casei bazate pe IoT, acest protocol poate fi utilizat cu ușurință fără a utiliza o mare parte din datele de pe internet.
Există puțini termeni care sunt utilizați frecvent în MQTT:
- Abonați-vă și publicați
- Mesaj
- Subiect
- Agent
1. Abonare și publicare: Abonarea înseamnă să obțineți date de pe alt dispozitiv și publicați înseamnă să trimiteți datele către alt dispozitiv.
Când dispozitivul1 trimite datele către dispozitivul2, acesta este cunoscut sub numele de Publisher, iar altul este Abonat și invers.
2. Mesaj: Mesajele sunt informațiile pe care le trimitem și le primim. Poate fi o dată sau orice tip de comandă. De exemplu, dacă publicăm datele de temperatură în nor, aceste date de temperatură sunt cunoscute sub numele de Mesaj.
3. Subiect: Acesta este modul în care înregistrați interesul pentru mesajele primite sau modul în care specificați unde doriți să publicați mesajul. Subiectele sunt reprezentate cu șiruri separate printr-o bară directă. Datele sunt publicate pe subiecte folosind MQTT și apoi dispozitivul MQTT se abonează la subiect pentru a obține datele.
4. MQTT Broker: Acest lucru este responsabil pentru primirea tuturor mesajelor de la editori, filtrează mesajele și apoi publică mesajele către abonații care sunt interesați de ei.
Când acest broker este găzduit pe cloud, atunci acesta se numește cloud MQTT. Există multe servicii MQTT bazate pe cloud, cum ar fi Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure, etc.
Ne putem crea propriul broker MQTT folosind Raspberry Pi. Acesta va fi brokerul local MQTT, adică puteți trimite și primi datele din rețeaua dvs. locală numai de oriunde. Așadar, aici vom instala brokerul Mosquitto MQTT în Raspberry Pi pentru a-l face broker local MQTT și vom trimite datele de temperatură de la NodeMCU la aplicația de bord MQTT. De asemenea, vom controla un LED conectat la NodeMCU folosind brokerul.
Instalarea Mosquitto MQTT Broker pe Raspberry Pi
Deschideți terminalul din Raspberry pi și tastați următoarele comenzi pentru a instala brokerul
sudo apt update sudo apt install -y mosquitto mosquitto-clients
Așteptați finalizarea instalării. Acum, pentru a porni brokerul la pornirea raspberry pi, tastați următoarea comandă
sudo systemctl activa mosquitto.service
Gata, suntem pregătiți să lansăm brokerul nostru MQTT. Pentru a verifica dacă este instalat corect, introduceți următoarea comandă
mosquitto -v
Această comandă vă va oferi versiunea brokerului dvs. MQTT. Ar trebui să fie 1.4.x sau mai mare.
Testarea brokerului Raspberry Pi Mosquitto
1. Rulați brokerul Mosquitto în fundal folosind comanda de mai jos
mosquitto -d
2. Acum, vom subscrie un subiect în exampleTopic folosind următoarea comandă
mosquitto_sub -d -t exampleTopic
3. Acum, vom publica un mesaj în exampleTopic
mosquitto_pub -d -t exampleTopic -m "Hello world!"
Veți primi lumea Hello! Mesaj în terminalul abonatului.
Acum, este timpul să controlăm și să obținem datele de pe un alt dispozitiv, în cazul nostru, folosim aplicația tabloului de bord NodeMCU și MQTT .
- Mai întâi vom controla un LED trimițând comanda folosind aplicația, astfel încât în acest caz NodeMCU se comportă ca abonat și aplicația ca editor.
- Apoi ESP12E are și senzor DHT11 conectat la acesta și trimite această citire a temperaturii către aplicația Mobile MQTT, deci în acest caz mobilul va fi abonat și NodeMCU va fi editorul. Și pentru a transmite aceste mesaje pe subiectele respective, este utilizat brokerul Mosquitto MQTT.
Diagrama circuitului
Conectați circuitul așa cum se arată în diagramă. Aici DHT11 este utilizat pentru citirile de temperatură, dar poate fi utilizat și un senzor de temperatură LM35. Am folosit deja senzorul DHT11 în multe dintre proiectele noastre, inclusiv cu NodeMCU pentru a construi o stație meteo.
Să începem să scriem codul pentru ca NodeMCU să se aboneze și să publice datele.
Cod și explicație
Aici vom folosi șablonul de bibliotecă Adafruit MQTT și vom schimba lucrurile necesare din cod. Același cod poate fi folosit pentru a publica și abona datele la cloud Adafruit IO doar schimbând câteva lucruri.Pentru aceasta descărcați biblioteca Adafruit MQTT din Sketch -> Include Library -> Manage Libraries. Căutați Adafruit MQTT și instalați-l. După instalarea bibliotecii. Accesați exemple -> Adafruit mqtt library -> mqtt_esp8266
Apoi editați acest cod în funcție de adresa noastră IP Raspberry Pi și acreditările Wi-Fi.
Includeți toate bibliotecile pentru ESP8266WIFI și Adafruit MQTT .
#include
Apoi definiți SSID și parola pentru Wi-Fi, de la care doriți să vă conectați ESP-12e. Asigurați-vă că RPi și NodeMCU se conectează la aceeași rețea.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
Această secțiune definește serverul Adafruit, în acest caz adresa IP a Raspberry Pi și portul serverului.
#define AIO_SERVER "adresa IP a Pi-ului tău" #define AIO_SERVERPORT 1883
Câmpurile de mai jos vor rămâne goale, deoarece nu folosim cloud Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
Apoi creați o clasă ESP8266 WiFiClient pentru a vă conecta la serverul MQTT.
Client WiFiClient;
Configurați clasa de client MQTT trecând clientul WiFi și serverul MQTT și detaliile de conectare.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Configurați un flux numit „Temperatură” pentru publicarea temperaturii.
Adafruit_MQTT_Publish Temperature = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
Configurați un flux numit „led1” pentru abonarea la modificări.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
În funcția de configurare , declarăm codul PIN al NodeMCU pe care doriți să obțineți ieșire. Apoi, conectați NodeMCU la punctul de acces Wi-Fi.
void setup () { Serial.begin (115200); întârziere (10); pinMode (LED, OUTPUT); Serial.println (F ("Demo Adafruit MQTT")); // Conectați-vă la punctul de acces WiFi. Serial.println (); Serial.println (); Serial.print („Conectarea la”); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) { …. …. … Configurați abonamentul MQTT pentru fluxul LED. mqtt.subscribe (& led1); }
În funcția de buclă , ne vom asigura că conexiunea la serverul MQTT este activă utilizând MQTT_connect (); funcţie.
bucla void () { MQTT_connect ();
Acum, abonați feedul „led” și obțineți șirul de la brokerul MQTT și convertiți acest șir la număr folosind atoi (); funcționează și scrie acest număr pe pinul LED folosind digitalWrite (); funcţie.
Adafruit_MQTT_Subscribe * abonament; while ((abonament = mqtt.readSubscription (20000))) { if (abonament == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, led1_State); }
Acum, obțineți temperatura într-o variabilă și publicați această valoare utilizând funcția Temperature.publish (t) .
float t = dht.readTemperature (); … .. if (! Temperature.publish (t)) { Serial.println (F ("Failed")); } else { Serial.println (F ("OK!")); }
Codul complet cu un videoclip demonstrativ este dat la sfârșitul acestui tutorial. Încărcați codul pe placa NodeMCU și deschideți aplicația de bord MQTT pe care ați descărcat-o în Smartphone.
De asemenea, puteți controla Raspberry Pi GPIO de oriunde din lume folosind cloud MQTT precum Adafruit IO, MQTT.IO etc., pe care îl vom învăța în următorul tutorial.