- Què és MQTT?
- Instal·lació de Mosquitto MQTT Broker a Raspberry Pi
- Prova del corredor Mosquitto de Raspberry Pi
- Esquema de connexions
- Codi i explicació
MQTT és un protocol utilitzat per enviar i rebre missatges per Internet. Anteriorment, hem utilitzat aquest protocol a Iot Electricity meter i Raspberry Pi Alexa per publicar les dades a Internet. En aquest tutorial coneixerem més sobre el MQTT i els termes relacionats amb ell. Aquí utilitzarem el Raspberry Pi com a broker local MQTT i controlarem un LED connectat a NodeMCU ESP12E mitjançant el tauler de l’aplicació MQTT. Un sensor DHT11 també està connectat a NodeMCU, de manera que obtenim la lectura de la temperatura i la humitat al tauler de control MQTT, fent servir de nou el Raspberry Pi com a intermediari local MQTT.
Comencem, doncs, per subestimar el MQTT i els termes que hi estan relacionats.
Què és MQTT?
MQTT significa Message Queue Telemetry Transport, dissenyat per IBM. Aquest protocol és senzill i lleuger que s’utilitza per enviar i rebre missatges a través d’Internet i està dissenyat per a dispositius amb poc ample de banda. Actualment, aquest protocol s’utilitza amb freqüència als dispositius IoT per enviar i rebre les dades dels sensors. A més, en sistemes domòtics basats en IoT, aquest protocol es pot utilitzar fàcilment sense utilitzar gran part de les dades d’Internet.
Hi ha pocs termes que s’utilitzen amb freqüència a MQTT:
- Subscriu-te i publica
- Missatge
- Tema
- Corredor
1. Subscriure i publicar: subscriure significa obtenir les dades d'un altre dispositiu i publicar significa enviar les dades a un altre dispositiu.

Quan dispositiu1 envia les dades a dispositiu2, es coneix com a editor i un altre és subscriptor i viceversa.
2. Missatge: els missatges són la informació que estem enviant i rebent. Pot ser una dada o qualsevol tipus d’ordre. Per exemple, si publiquem les dades de temperatura al núvol, aquestes dades de temperatura es coneixen com a Missatge.
3. Tema: és la forma en què registreu l'interès per als missatges entrants o com especifiqueu on voleu publicar el missatge. Els temes es representen amb cadenes separades per una barra inclinada cap endavant. Les dades es publiquen sobre els temes mitjançant MQTT i, a continuació, el dispositiu MQTT es subscriu al tema per obtenir-ne les dades.
4. MQTT Broker: aquesta cosa s’encarrega de rebre tots els missatges dels editors, filtrar-los i publicar-los als subscriptors que hi estiguin interessats.

Quan aquest agent està allotjat al núvol, s’anomena núvol MQTT. Hi ha molts serveis MQTT basats en el núvol, com ara Adafruit IO, MQTT.IO, IBM bluemix, Microsoft Azure, etc.
Podem crear el nostre propi broker MQTT amb Raspberry Pi. Aquest serà l’agent local MQTT, és a dir, només podeu enviar i rebre les dades de la vostra xarxa local des de qualsevol lloc. Així, doncs, aquí instal·larem l’agent Mosquitto MQTT a Raspberry Pi per convertir-lo en l’agent MQTT local i enviarem les dades de temperatura de l’aplicació del tauler de control de NodeMCU a MQTT. A més, controlarem un LED connectat a NodeMCU mitjançant el broker.
Instal·lació de Mosquitto MQTT Broker a Raspberry Pi
Obriu el terminal al vostre Raspberry pi i escriviu les ordres següents per instal·lar l’agent
actualització sudo apt sudo apt install -y mosquitto mosquitto-clients
Espereu a que finalitzi la instal·lació. Ara, per iniciar el broker a l’inici de raspberry pi, escriviu l’ordre següent
sudo systemctl habilita mosquitto.service
Ja està, estem preparats per llançar el nostre broker MQTT. Per comprovar que està instal·lat correctament, introduïu l'ordre següent
mosquitto -v
Aquesta ordre us proporcionarà la versió del vostre broker MQTT. Ha de ser 1.4.x o superior.
Prova del corredor Mosquitto de Raspberry Pi
1. Executeu l'agent Mosquitto en segon pla mitjançant l'ordre següent
mosquit -d
2. Ara, subscriurem un tema a exampleTopic mitjançant l'ordre següent
mosquitto_sub -d -t exempleTema
3. Ara publicarem algun missatge a exampleTopic
mosquitto_pub -d -t exampleTopic -m "Hola món!"
Rebràs el Hello world! Missatge al terminal de subscriptors.

Ara és el moment de controlar i obtenir les dades d’un altre dispositiu, en el nostre cas, utilitzem l’ aplicació de taulers NodeMCU i MQTT .
- Primer controlarem un LED enviant ordres mitjançant App, de manera que en aquest cas NodeMCU es comportarà com a subscriptor i App com a editor.
- Aleshores, ESP12E també hi té connectat un sensor DHT11 i envia aquesta lectura de temperatura a l’aplicació Mobile MQTT, de manera que en aquest cas el mòbil serà el subscriptor i NodeMCU l’editor. I per reenviar aquests missatges sobre els temes respectius, s’utilitza l’agent Mosquitto MQTT.
Esquema de connexions

Connecteu el circuit tal com es mostra a l'esquema. Aquí s’utilitza el DHT11 per a les lectures de temperatura, però també es pot utilitzar un sensor de temperatura LM35. Ja hem utilitzat el sensor DHT11 en molts dels nostres projectes, inclòs amb NodeMCU, per construir una estació meteorològica.
Comencem a escriure el codi perquè el NodeMCU es subscrigui i publiqui les dades.

Codi i explicació
Aquí utilitzarem la plantilla de la biblioteca Adafruit MQTT i canviarem les coses necessàries al codi. Es pot utilitzar el mateix codi per publicar i subscriure les dades a Adafruit IO cloud només canviant algunes coses.Per a aquesta descàrrega, la biblioteca Adafruit MQTT de Sketch -> Inclou biblioteca -> Gestiona les biblioteques. Cerqueu Adafruit MQTT i instal·leu-lo. Després d’instal·lar la biblioteca. Aneu a exemples -> Biblioteca Adafruit mqtt -> mqtt_esp8266

A continuació, editeu aquest codi segons la nostra adreça IP de Raspberry Pi i les credencials de Wi-Fi.
Incloeu totes les biblioteques per a ESP8266WIFI i Adafruit MQTT .
#incloure
A continuació, definiu el SSID i la contrasenya del vostre Wi-Fi, des del qual voleu connectar el vostre ESP-12e. Assegureu-vos que el vostre RPi i NodeMCU es connectin amb la mateixa xarxa.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
Aquesta secció defineix el servidor d'Adafruit, en aquest cas l'adreça IP del vostre port de servidor i Raspberry Pi.
#define AIO_SERVER "adreça IP del vostre Pi" #define AIO_SERVERPORT 1883
A continuació, els camps romandran buits perquè no fem servir el núvol Adafruit.
#define AIO_USERNAME "" #define AIO_KEY ""
A continuació, creeu una classe WiFiClient ESP8266 per connectar-vos al servidor MQTT.
Client WiFiClient;
Configureu la classe de client MQTT passant el client WiFi i el servidor MQTT i les dades d'inici de sessió.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Configureu un feed anomenat "Temperatura" per publicar la temperatura.
Adafruit_MQTT_Publish Temperatura = Adafruit_MQTT_Publish (& mqtt, AIO_USERNAME "/ feeds / temperature");
Configureu un canal d'informació anomenat "led1" per subscriure-us als canvis.
Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / led");
A la funció de configuració , declarem el PIN de NodeMCU en què voleu obtenir la sortida. A continuació, connecteu NodeMCU al punt d’accés Wi-Fi.
configuració nul·la () { Serial.begin (115200); retard (10); pinMode (LED, OUTPUT); Serial.println (F ("demostració d'Adafruit MQTT")); // Connecteu-vos al punt d’accés WiFi. Serial.println (); Serial.println (); Serial.print ("Connexió a"); Serial.println (WLAN_SSID); WiFi.begin (WLAN_SSID, WLAN_PASS); while (WiFi.status ()! = WL_CONNECTED) { …. …. ... Configureu la subscripció MQTT per al feed de leds. mqtt.subscribe (& led1); }
En funció de bucle , ens assegurarem que la connexió amb el servidor MQTT estigui activa mitjançant MQTT_connect (); funció.
bucle buit () { MQTT_connect ();
Ara, subscriviu-vos al feed 'led' i obteniu la cadena del broker MQTT i converteu aquesta cadena en número mitjançant atoi (); funcioni i escrigui aquest número al pin LED mitjançant digitalWrite (); funció.
Adafruit_MQTT_Subscribe * subscripció; while ((subscripció = mqtt.readSubscription (20000))) { if (subscripció == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.lastread); int led1_State = atoi ((char *) led1.lastread); digitalWrite (LED, led1_State); }
Ara, obteniu la temperatura en una variable i publiqueu aquest valor mitjançant la funció Temperature.publish (t) .
flotador t = dht.readTemperature (); ... .. if (! Temperature.publish (t)) { Serial.println (F ("Error")); } else { Serial.println (F ("OK!")); }
El codi complet amb un vídeo de demostració es dóna al final d’aquest tutorial. Pengeu el codi al tauler NodeMCU i obriu l'aplicació del tauler de control MQTT que heu descarregat al telèfon intel·ligent.
També podeu controlar Raspberry Pi GPIO des de qualsevol lloc del món mitjançant el núvol MQTT com Adafruit IO, MQTT.IO, etc., que aprendrem al proper tutorial.
