- Kas yra MQTT?
- „Mosquitto MQTT Broker“ įdiegimas į „Raspberry Pi“
- „Raspberry Pi Mosquitto Broker“ testavimas
- Grandinės schema
- Kodas ir paaiškinimas
MQTT yra protokolas, naudojamas pranešimams siųsti ir gauti internetu. Anksčiau mes naudojome šį protokolą „Iot Electricity meter“ ir „Raspberry Pi Alexa“, kad skelbtume duomenis internete. Šioje pamokoje sužinosime daugiau apie MQTT ir su ja susijusius terminus. Čia mes naudosime „ Raspberry Pi“ kaip vietinį MQTT brokerį ir valdysime LED, prijungtą prie „NodeMCU ESP12E“ per „MQTT“ programos prietaisų skydelį. DHT11 jutiklis taip pat prijungtas prie „NodeMCU“, kad gautume temperatūros ir drėgmės rodmenis MQTT prietaisų skydelyje, vėl naudodami „Raspberry Pi“ kaip vietinį MQTT brokerį.
Taigi pradėkime nuo supratimo apie MQTT ir su juo susijusius terminus.
Kas yra MQTT?
„MQTT“ reiškia IBM sukurtą „ Message Queue Telemetry Transport“. Šis protokolas yra paprastas ir lengvas, naudojamas pranešimams siųsti ir gauti internetu, ir jis skirtas prietaisams, kurie naudoja mažai pralaidumo. Šiais laikais daiktų interneto įrenginiuose šis protokolas dažnai naudojamas siųsti ir gauti jutiklių duomenis. Be to, IoT pagrįstose namų automatikos sistemose šį protokolą galima lengvai naudoti nenaudojant daugybės interneto duomenų.
Yra keletas terminų, kurie dažnai naudojami MQTT:
- Prenumeruoti ir paskelbti
- Pranešimas
- Tema
- Brokeris
1. Prenumeruoti ir paskelbti: Prenumeruoti reiškia gauti duomenis iš kito įrenginio, o paskelbti - siųsti duomenis į kitą įrenginį.
Kai „device1“ siunčia duomenis į „device2“, jis vadinamas „Publisher“, kitas yra „Subscriber“ ir atvirkščiai.
2. Pranešimas: Pranešimai yra informacija, kurią mes siunčiame ir gauname. Tai gali būti duomenys ar bet kokio tipo komandos. Pvz., Jei temperatūros duomenis skelbiame debesyje, šie temperatūros duomenys vadinami žinute.
3. Tema: Taip registruojate susidomėjimą gaunamais pranešimais arba nurodote, kur norite paskelbti pranešimą. Temos vaizduojamos eilutėmis, atskirtomis pasviruoju brūkšniu. Duomenys apie temas skelbiami naudojant MQTT, o tada MQTT įrenginys užsiprenumeruoja temą, kad gautų duomenis.
4. „MQTT Broker“: šis dalykas yra atsakingas už visų leidėjų pranešimų gavimą, pranešimų filtravimą ir paskui pranešimų paskelbimą abonentams, kurie jais domisi.
Kai šis brokeris yra patalpintas debesyje, jis vadinamas MQTT debesimi. Yra daug debesų pagrindu veikiančių MQTT paslaugų, tokių kaip „Adafruit IO“, „MQTT.IO“, „IBM bluemix“, „Microsoft Azure“ ir kt. „MQTT“ taip pat galima naudoti su populiariu „Amazon AWS“ debesiu, kurį mes paaiškinome „Pradedant nuo„ Amazon AWS “mokymo programos.
Mes galime sukurti savo MQTT brokerį naudodami „Raspberry Pi“. Tai bus vietinis MQTT brokeris, ty jūs galite siųsti ir gauti duomenis savo vietiniame tinkle tik ne iš bet kurios vietos. Taigi čia mes įdiegsime „Mosquitto MQTT“ brokerį į „Raspberry Pi“, kad jis taptų vietiniu MQTT brokeriu, ir išsiųsime temperatūros duomenis iš „NodeMCU“ į „MQTT“ prietaisų skydelio programą. Be to, naudodamiesi brokeriu valdysime šviesos diodą, prijungtą prie „NodeMCU“.
„Mosquitto MQTT Broker“ įdiegimas į „Raspberry Pi“
Atidarykite terminalą savo „Raspberry pi“ ir įveskite šias komandas, kad įdiegtumėte tarpininką
sudo apt atnaujinimas sudo apt install -y mosquitto mosquitto-klientai
Palaukite, kol baigsis diegimas. Dabar, norėdami pradėti tarpininką paleisdami aviečių pi, įveskite šią komandą
sudo systemctl įgalinti mosquitto.service
Viskas, mes visi pasirengę paleisti savo MQTT brokerį. Norėdami patikrinti, ar jis tinkamai įdiegtas, įveskite šią komandą
uodas -v
Ši komanda suteiks jums jūsų MQTT brokerio versiją. Tai turėtų būti 1.4.x arba didesnė.
„Raspberry Pi Mosquitto Broker“ testavimas
1. Paleiskite „Mosquitto“ brokerį fone naudodami žemiau esančią komandą
uodas -d
2. Dabar mes užsisakysime temą „exampleTopic“ naudodami šią komandą
mosquitto_sub -d -t pavyzdysTopic
3. Dabar mes paskelbsime pranešimą „exampleTopic“
mosquitto_pub -d -t exampleTopic -m "Sveikas pasauli!"
Jūs gausite „Hello world“! Pranešimas abonentiniame terminale.
Dabar atėjo laikas kontroliuoti ir gauti duomenis iš kito įrenginio, šiuo atveju mes naudojame „NodeMCU“ ir „ MQTT“ prietaisų skydelio programas.
- Pirmiausia mes valdysime šviesos diodą, siųsdami komandą naudodami programą, todėl šiuo atveju „ NodeMCU“ elgiasi kaip abonentas, o „App“ - kaip leidėjas.
- Tada ESP12E taip pat yra prijungtas DHT11 jutiklis ir jis siunčia šį temperatūros rodiklį į „Mobile MQTT“ programą, taigi šiuo atveju mobilusis bus abonentas, o „NodeMCU“ bus leidėjas. Šiems pranešimams persiųsti atitinkamose temose naudojamas „Mosquitto MQTT“ brokeris.
Grandinės schema
Prijunkite grandinę, kaip parodyta diagramoje. Čia temperatūros rodmenims naudojamas DHT11, bet taip pat galima naudoti LM35 temperatūros jutiklį. DHT11 jutiklį jau naudojome daugelyje savo projektų, įskaitant „NodeMCU“, kad sukurtume meteorologinę stotį.
Leidžia pradėti rašyti „NodeMCU“ kodą, kad būtų galima užsiprenumeruoti ir paskelbti duomenis.
Kodas ir paaiškinimas
Čia naudosime „Adafruit MQTT“ bibliotekos šabloną ir pakeisime reikiamus dalykus kode. Tą patį kodą galima naudoti duomenims skelbti ir užsiprenumeruoti „Adafruit IO“ debesyje, tik pakeičiant keletą dalykų.Norėdami atsisiųsti „Adafruit MQTT“ biblioteką iš „ Sketch“ -> „Įtraukti biblioteką“ -> „Tvarkyti bibliotekas“. Ieškokite „Adafruit MQTT“ ir įdiekite. Įdiegus biblioteką. Eikite į pavyzdžius -> „Adafruit mqtt“ biblioteka -> mqtt_esp8266
Tada redaguokite šį kodą pagal mūsų „Raspberry Pi“ IP adresą ir „Wi-Fi“ kredencialus.
Įtraukite visas ESP8266WIFI ir „Adafruit MQTT“ bibliotekas .
# įtraukti
Tada nustatykite „Wi-Fi“, iš kurio norite prijungti ESP-12e, SSID ir slaptažodį. Įsitikinkite, kad jūsų RPi ir „NodeMCU“ jungiasi prie to paties tinklo.
#define WLAN_SSID "xxxxxxxx" #define WLAN_PASS "xxxxxxxxxxx"
Šiame skyriuje apibrėžiamas „Adafruit“ serveris, šiuo atveju jūsų „Raspberry Pi“ IP adresas ir serverio prievadas.
#define AIO_SERVER "jūsų Pi IP adresas" #define AIO_SERVERPORT 1883
Žemiau laukai liks tušti, nes nenaudojame „Adafruit“ debesies.
#define AIO_USERNAME "" #define AIO_KEY ""
Tada sukurkite ESP8266 „WiFiClient“ klasę, kad prisijungtumėte prie MQTT serverio.
„WiFiClient“ klientas;
Nustatykite „MQTT“ kliento klasę, įvesdami „WiFi“ klientą ir MQTT serverį bei prisijungimo duomenis.
„Adafruit_MQTT_Client mqtt“ (& klientas, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Norėdami paskelbti temperatūrą, nustatykite kanalą „Temperatūra“.
„Adafruit_MQTT_Publish Temperature“ = „Adafruit_MQTT_Publish“ (& mqtt, AIO_USERNAME "/ tiekimai / temperatūra");
Norėdami užsisakyti pakeitimus, nustatykite sklaidos kanalą „led1“.
„Adafruit_MQTT_Subscribe led1“ = „Adafruit_MQTT_Subscribe“ (& mqtt, AIO_USERNAME "/ feeds / led");
Be sąrankos funkcijai mes pareiškiame kaištis NodeMCU, dėl kurių norite gauti išėjimą. Tada prijunkite „NodeMCU“ prie „Wi-Fi“ prieigos taško.
negaliojanti sąranka () { Serial.begin (115200); vėlavimas (10); pinMode (LED, OUTPUT); Serial.println (F („Adafruit MQTT demo“)); // Prisijunkite prie „WiFi“ prieigos taško. Serijinis.println (); Serijinis.println (); Serial.print („Prisijungimas prie“); Serial.println (WLAN_SSID); „WiFi.begin“ (WLAN_SSID, WLAN_PASS); o („WiFi.status ()! = WL_CONNECTED] { …. …. ... Nustatykite „MQTT“ prenumeratą vedamam kanalui. mqtt.subscribe (& led1); }
Naudodamiesi ciklo funkcija, mes užtikrinsime, kad ryšys su MQTT serveriu yra gyvas, naudodami „MQTT_connect ()“; funkcija.
void loop () { MQTT_connect ();
Dabar užsiprenumeruokite „vedamą“ kanalą ir gaukite eilutę iš „MQTT“ brokerio ir konvertuokite šią eilutę į skaičių naudodami atoi (); funkcija ir užrašykite šį skaičių į LED kaištį naudodami „ digitalWrite“ (); funkcija.
„Adafruit_MQTT_Subscribe *“ prenumerata; while ((subscription = mqtt.readSubscription (20000))) { if (subscription == & led1) { Serial.print (F ("Got:")); Serial.println ((char *) led1.paskutęs); int led1_State = atoi ((char *) led1.paskutęs); „digitalWrite“ (LED, led1_State); }
Dabar gaukite temperatūrą kintamajame ir paskelbkite šią vertę naudodami funkciją Temperature.publish (t) .
plūdė t = dht.readTemperature (); … .. if (! Temperatūra.publikuoti (t)) { Serial.println (F ("Nepavyko")); } else { Serial.println (F ("Gerai!")); }
Pilnas kodas su demonstraciniu vaizdo įrašu pateikiamas šios pamokos pabaigoje. Įkelkite kodą į „NodeMCU“ plokštę ir atidarykite „MQTT“ prietaisų skydelio programą, kurią atsisiuntėte išmaniajame telefone.
Taip pat galite valdyti „Raspberry Pi GPIO“ iš bet kurios pasaulio vietos naudodami MQTT debesį, pvz., „Adafruit IO“, „MQTT.IO“ ir kt., Kuriuos sužinosime kitoje pamokoje.