30 KiB
Prijunkite savo įrenginį prie interneto
Piešinys sukurtas Nitya Narasimhan. Spustelėkite paveikslėlį, kad pamatytumėte didesnę versiją.
Ši pamoka buvo dėstoma kaip dalis Hello IoT serijos iš Microsoft Reactor. Pamoka buvo pateikta per 2 vaizdo įrašus – 1 valandos pamoka ir 1 valandos konsultacija, kurioje gilinamasi į pamokos dalis ir atsakoma į klausimus.
🎥 Spustelėkite aukščiau esančius paveikslėlius, kad peržiūrėtumėte vaizdo įrašus
Klausimynas prieš pamoką
Įvadas
I IoT reiškia Internetą – debesų ryšį ir paslaugas, kurios leidžia daugumą IoT įrenginių funkcijų, nuo duomenų rinkimo iš jutiklių, prijungtų prie įrenginio, iki pranešimų siuntimo, skirtų valdyti aktuatorius. IoT įrenginiai paprastai jungiasi prie vienos debesų IoT paslaugos naudodami standartinį ryšio protokolą, o ši paslauga yra prijungta prie likusios jūsų IoT programos, nuo AI paslaugų, kurios priima išmanius sprendimus remiantis jūsų duomenimis, iki interneto programų, skirtų valdymui ar ataskaitoms.
🎓 Duomenys, surinkti iš jutiklių ir išsiųsti į debesį, vadinami telemetrija.
IoT įrenginiai gali gauti pranešimus iš debesies. Dažnai pranešimai yra komandos – tai instrukcijos atlikti veiksmą arba viduje (pvz., paleisti iš naujo ar atnaujinti programinę įrangą), arba naudojant aktuatorių (pvz., įjungti šviesą).
Šioje pamokoje pristatomi kai kurie ryšio protokolai, kuriuos IoT įrenginiai gali naudoti prisijungdami prie debesies, ir duomenų tipai, kuriuos jie gali siųsti ar gauti. Taip pat praktiškai susipažinsite su šiais protokolais, pridėdami interneto valdymą savo naktinei lempai, perkeldami LED valdymo logiką į „serverio“ kodą, kuris veiks lokaliai.
Šioje pamokoje aptarsime:
Ryšio protokolai
Yra keletas populiarių ryšio protokolų, kuriuos IoT įrenginiai naudoja bendraudami su internetu. Populiariausi yra pagrįsti publikavimo/prenumeravimo pranešimais per tam tikrą brokerį. IoT įrenginiai jungiasi prie brokerio ir publikuoja telemetriją bei prenumeruoja komandas. Debesų paslaugos taip pat jungiasi prie brokerio, prenumeruoja visus telemetrijos pranešimus ir publikuoja komandas arba konkretiems įrenginiams, arba įrenginių grupėms.
MQTT yra populiariausias ryšio protokolas IoT įrenginiams ir yra aptariamas šioje pamokoje. Kiti protokolai apima AMQP ir HTTP/HTTPS.
Pranešimų eilės telemetrijos transportas (MQTT)
MQTT yra lengvas, atviras standartinis pranešimų protokolas, kuris gali siųsti pranešimus tarp įrenginių. Jis buvo sukurtas 1999 m. naftos vamzdynų stebėjimui, o po 15 metų IBM jį išleido kaip atvirą standartą.
MQTT turi vieną brokerį ir kelis klientus. Visi klientai jungiasi prie brokerio, o brokeris nukreipia pranešimus atitinkamiems klientams. Pranešimai nukreipiami naudojant pavadintas temas, o ne siunčiami tiesiogiai konkrečiam klientui. Klientas gali publikuoti temą, o visi klientai, prenumeruojantys tą temą, gaus pranešimą.
✅ Atlikite tyrimą. Jei turite daug IoT įrenginių, kaip galite užtikrinti, kad jūsų MQTT brokeris galėtų apdoroti visus pranešimus?
Prijunkite savo IoT įrenginį prie MQTT
Pirmasis žingsnis pridedant interneto valdymą savo naktinei lempai yra prijungti ją prie MQTT brokerio.
Užduotis
Prijunkite savo įrenginį prie MQTT brokerio.
Šioje pamokos dalyje prijungsite savo IoT naktinę lempą prie interneto, kad ją būtų galima valdyti nuotoliniu būdu. Vėliau šioje pamokoje jūsų IoT įrenginys per MQTT siųs telemetrijos pranešimą viešam MQTT brokeriui su šviesos lygiu, kurį perims serverio kodas, kurį parašysite. Šis kodas patikrins šviesos lygį ir išsiųs komandą įrenginiui, nurodydamas įjungti arba išjungti LED.
Realiame pasaulyje tokia sistema galėtų būti naudojama duomenims rinkti iš kelių šviesos jutiklių prieš priimant sprendimą įjungti šviesas vietoje, kurioje yra daug šviesų, pvz., stadione. Tai galėtų užkirsti kelią šviesų įjungimui, jei tik vieną jutiklį uždengtų debesys ar paukštis, bet kiti jutikliai aptiktų pakankamai šviesos.
✅ Kokiose kitose situacijose reikėtų įvertinti duomenis iš kelių jutiklių prieš siunčiant komandas?
Užuot sprendę MQTT brokerio nustatymo sudėtingumą kaip šios užduoties dalį, galite naudoti viešą testavimo serverį, kuris naudoja Eclipse Mosquitto, atvirojo kodo MQTT brokerį. Šis testavimo brokeris yra viešai prieinamas adresu test.mosquitto.org ir nereikalauja paskyros, todėl tai puikus įrankis MQTT klientų ir serverių testavimui.
💁 Šis testavimo brokeris yra viešas ir nesaugus. Bet kas galėtų klausytis, ką publikuojate, todėl jis neturėtų būti naudojamas su duomenimis, kuriuos reikia laikyti privačiais.
Sekite atitinkamą žingsnį žemiau, kad prijungtumėte savo įrenginį prie MQTT brokerio:
Gilesnis žvilgsnis į MQTT
Temos gali turėti hierarchiją, o klientai gali prenumeruoti skirtingus hierarchijos lygius naudodami pakaitos simbolius. Pavyzdžiui, galite siųsti temperatūros telemetrijos pranešimus į temą /telemetry/temperature
ir drėgmės pranešimus į temą /telemetry/humidity
, o tada savo debesų programoje prenumeruoti temą /telemetry/*
, kad gautumėte tiek temperatūros, tiek drėgmės telemetrijos pranešimus.
Pranešimai gali būti siunčiami su kokybės užtikrinimo lygiu (QoS), kuris nustato pranešimo gavimo garantiją.
- Vieną kartą – pranešimas siunčiamas tik vieną kartą, o klientas ir brokeris nesiima papildomų veiksmų, kad patvirtintų pristatymą (siųsti ir pamiršti).
- Bent vieną kartą – pranešimas kelis kartus persiunčiamas siuntėjo, kol gaunamas patvirtinimas (patvirtintas pristatymas).
- Tiksliai vieną kartą – siuntėjas ir gavėjas vykdo dviejų lygių rankos paspaudimą, kad užtikrintų, jog pranešimas bus gautas tik vieną kartą (užtikrintas pristatymas).
✅ Kokiose situacijose reikėtų užtikrinto pristatymo pranešimo, o ne „siųsti ir pamiršti“ pranešimo?
Nors pavadinime yra „Message Queueing“ (MQTT inicialai), jis iš tikrųjų nepalaiko pranešimų eilių. Tai reiškia, kad jei klientas atsijungia, o vėliau vėl prisijungia, jis negaus pranešimų, išsiųstų atsijungimo metu, išskyrus tuos pranešimus, kuriuos jis jau pradėjo apdoroti naudodamas QoS procesą. Pranešimai gali turėti nustatytą „retained“ vėliavėlę. Jei ji nustatyta, MQTT brokeris saugos paskutinį pranešimą, išsiųstą temoje su šia vėliavėle, ir išsiųs jį bet kuriems klientams, kurie vėliau prenumeruos temą. Tokiu būdu klientai visada gaus naujausią pranešimą.
MQTT taip pat palaiko „keep alive“ funkciją, kuri tikrina, ar ryšys vis dar gyvas per ilgus tarpus tarp pranešimų.
🦟 Mosquitto iš Eclipse Foundation turi nemokamą MQTT brokerį, kurį galite paleisti patys, kad eksperimentuotumėte su MQTT, taip pat viešą MQTT brokerį, kurį galite naudoti savo kodo testavimui, talpinamą adresu test.mosquitto.org.
MQTT ryšiai gali būti vieši ir atviri arba užšifruoti ir apsaugoti naudojant vartotojo vardus ir slaptažodžius arba sertifikatus.
💁 MQTT bendrauja per TCP/IP, tą patį pagrindinį tinklo protokolą kaip HTTP, bet per kitą prievadą. Taip pat galite naudoti MQTT per „websockets“, kad bendrautumėte su interneto programomis, veikiančiomis naršyklėje, arba situacijose, kai ugniasienės ar kitos tinklo taisyklės blokuoja standartinius MQTT ryšius.
Telemetrija
Žodis telemetrija kilęs iš graikų kalbos šaknų, reiškiančių „matuoti nuotoliniu būdu“. Telemetrija – tai duomenų rinkimas iš jutiklių ir jų siuntimas į debesį.
💁 Vienas iš ankstyviausių telemetrijos įrenginių buvo išrastas Prancūzijoje 1874 m. ir realiu laiku siuntė orų ir sniego gylio duomenis iš Monblano į Paryžių. Jis naudojo fizinius laidus, nes tuo metu nebuvo belaidžių technologijų.
Pažvelkime atgal į išmaniojo termostato pavyzdį iš 1 pamokos.
Termostatas turi temperatūros jutiklius telemetrijai rinkti. Labiausiai tikėtina, kad jis turės vieną įmontuotą temperatūros jutiklį, ir jis gali prisijungti prie kelių išorinių temperatūros jutiklių per belaidį protokolą, pvz., Bluetooth Low Energy (BLE).
Telemetrijos duomenų, kuriuos jis galėtų siųsti, pavyzdys:
Pavadinimas | Vertė | Aprašymas |
---|---|---|
thermostat_temperature |
18°C | Temperatūra, išmatuota termostato įmontuotu temperatūros jutikliu |
livingroom_temperature |
19°C | Temperatūra, išmatuota nuotoliniu temperatūros jutikliu, kuris buvo pavadintas livingroom , kad identifikuotų kambarį, kuriame jis yra |
bedroom_temperature |
21°C | Temperatūra, išmatuota nuotoliniu temperatūros jutikliu, kuris buvo pavadintas bedroom , kad identifikuotų kambarį, kuriame jis yra |
Debesų paslauga gali naudoti šiuos telemetrijos duomenis, kad priimtų sprendimus dėl komandų siuntimo šildymo valdymui.
Siųskite telemetriją iš savo IoT įrenginio
Kitas žingsnis pridedant interneto valdymą savo naktinei lempai yra šviesos lygio telemetrijos siuntimas MQTT brokeriui telemetrijos temoje.
Užduotis – siųskite telemetriją iš savo IoT įrenginio
Siųskite šviesos lygio telemetriją MQTT brokeriui.
Duomenys siunčiami užkoduoti kaip JSON – tai JavaScript objektų notacija, standartas duomenims užkoduoti tekstu naudojant raktų/vertės poras.
✅ Jei dar nesusidūrėte su JSON, galite sužinoti daugiau apie jį JSON.org dokumentacijoje.
Sekite atitinkamą žingsnį žemiau, kad išsiųstumėte telemetriją iš savo įrenginio į MQTT brokerį:
Gaukite telemetriją iš MQTT brokerio
Nėra prasmės siųsti telemetriją, jei niekas kitoje pusėje jos neklauso. Šviesos lygio telemetrijai reikia kažko, kas ją klausytų ir apdorotų duomenis. Šis „serverio“ kodas yra toks kodas, kurį diegsite debesų paslaugoje kaip didesnės IoT programos dalį, tačiau čia jūs ketinate paleisti šį kodą lokaliai savo kompiuteryje (arba savo Pi, jei koduojate tiesiogiai ten). Serverio kodas susideda iš Python programos, kuri klausosi telemetrijos pranešimų per MQTT su šviesos lygiais. Vėliau šioje pamokoje ji atsakys komandiniu pranešimu su instrukcijomis įjungti arba išjungti LED.
✅ Atlikite tyrimą: Kas nutinka MQTT pranešimams, jei nėra klausytojo?
Įdiekite Python ir VS Code
Jei neturite Python ir VS Code įdiegtų lokaliai, turėsite juos abu įdiegti, kad galėtumėte rašyti serverio kodą. Jei naudojate virtualų IoT įrenginį arba dirbate su Raspberry Pi, galite praleisti šį žingsnį, nes turėtumėte jau turėti tai įdiegta ir sukonfigūruota.
Užduotis – įdiekite Python ir VS Code
Įdiekite Python ir VS Code.
- Įdiekite Python. Žr. Python atsisiuntimų puslapį, kad gautumėte instrukcijas, kaip įdiegti naujausią Python versiją.
💁 Galite naudoti bet kokį Python IDE ar redaktorių šioms pamokoms, jei turite mėgstamą įrankį, tačiau pamokose bus pateikiamos instrukcijos, remiantis VS Code.
- Įdiekite VS Code Pylance plėtinį. Tai yra VS Code plėtinys, kuris suteikia Python kalbos palaikymą. Diegimo instrukcijas rasite Pylance plėtinio dokumentacijoje.
Python virtualios aplinkos konfigūravimas
Viena iš galingiausių Python funkcijų yra galimybė įdiegti pip paketus – tai yra kitų žmonių parašyti ir internete paskelbti kodo paketai. Viena komanda galite įdiegti pip paketą į savo kompiuterį ir naudoti jį savo kode. Naudosite pip, kad įdiegtumėte paketą, skirtą bendrauti per MQTT.
Pagal numatytuosius nustatymus, kai įdiegiate paketą, jis tampa prieinamas visame jūsų kompiuteryje, ir tai gali sukelti problemų su paketų versijomis – pavyzdžiui, viena programa gali priklausyti nuo vienos paketo versijos, kuri nustoja veikti, kai įdiegiate naują versiją kitai programai. Norėdami išspręsti šią problemą, galite naudoti Python virtualią aplinką, kuri iš esmės yra Python kopija atskirame aplanke. Kai įdiegiate pip paketus, jie įdiegiami tik tame aplanke.
Užduotis – sukonfigūruoti Python virtualią aplinką
Sukonfigūruokite Python virtualią aplinką ir įdiekite MQTT pip paketus.
-
Terminale arba komandų eilutėje paleiskite šias komandas pasirinktoje vietoje, kad sukurtumėte ir pereitumėte į naują katalogą:
mkdir nightlight-server cd nightlight-server
-
Dabar paleiskite šią komandą, kad sukurtumėte virtualią aplinką
.venv
aplanke:python3 -m venv .venv
💁 Turite aiškiai nurodyti
python3
, kad sukurtumėte virtualią aplinką, nes gali būti, kad jūsų sistemoje įdiegta Python 2 versija kartu su Python 3 (naujausia versija). Jei turite Python 2, komandapython
naudos Python 2 vietoj Python 3. -
Aktyvuokite virtualią aplinką:
-
Windows sistemoje:
-
Jei naudojate Command Prompt arba Command Prompt per Windows Terminal, paleiskite:
.venv\Scripts\activate.bat
-
Jei naudojate PowerShell, paleiskite:
.\.venv\Scripts\Activate.ps1
-
-
macOS arba Linux sistemoje paleiskite:
source ./.venv/bin/activate
💁 Šias komandas reikia paleisti iš tos pačios vietos, kurioje paleidote komandą virtualiai aplinkai sukurti. Jums niekada nereikės pereiti į
.venv
aplanką – visada turėtumėte paleisti aktyvavimo komandą ir bet kokias komandas paketams įdiegti ar kodui vykdyti iš aplanko, kuriame sukūrėte virtualią aplinką. -
-
Kai virtuali aplinka bus aktyvuota, numatytoji
python
komanda paleis Python versiją, kuri buvo naudojama virtualiai aplinkai sukurti. Paleiskite šią komandą, kad sužinotumėte versiją:python --version
Rezultatas bus panašus į šį:
(.venv) ➜ nightlight-server python --version Python 3.9.1
💁 Jūsų Python versija gali skirtis – jei tik ji yra 3.6 ar naujesnė, viskas gerai. Jei ne, ištrinkite šį aplanką, įdiekite naujesnę Python versiją ir bandykite dar kartą.
-
Paleiskite šias komandas, kad įdiegtumėte pip paketą Paho-MQTT, populiarią MQTT biblioteką.
pip install paho-mqtt
Šis pip paketas bus įdiegtas tik virtualioje aplinkoje ir nebus prieinamas už jos ribų.
Parašykite serverio kodą
Dabar serverio kodą galima parašyti Python kalba.
Užduotis – parašyti serverio kodą
Parašykite serverio kodą.
-
Terminale arba komandų eilutėje, virtualioje aplinkoje, paleiskite šią komandą, kad sukurtumėte Python failą
app.py
:-
Windows sistemoje paleiskite:
type nul > app.py
-
macOS arba Linux sistemoje paleiskite:
touch app.py
-
-
Atidarykite dabartinį aplanką VS Code:
code .
-
Kai VS Code paleidžiamas, jis aktyvuos Python virtualią aplinką. Tai bus nurodyta apatinėje būsenos juostoje:
-
Jei VS Code terminalas jau veikia, kai VS Code paleidžiamas, virtuali aplinka jame nebus aktyvuota. Paprasčiausia yra uždaryti terminalą naudojant mygtuką Kill the active terminal instance:
-
Paleiskite naują VS Code terminalą pasirinkdami Terminal -> New Terminal arba paspausdami
CTRL+`
. Naujas terminalas įkels virtualią aplinką, o aktyvavimo komanda bus rodoma terminale. Virtualios aplinkos pavadinimas (.venv
) taip pat bus matomas eilutėje:➜ nightlight-server source .venv/bin/activate (.venv) ➜ nightlight
-
Atidarykite
app.py
failą iš VS Code naršyklės ir pridėkite šį kodą:import json import time import paho.mqtt.client as mqtt id = '<ID>' client_telemetry_topic = id + '/telemetry' client_name = id + 'nightlight_server' mqtt_client = mqtt.Client(client_name) mqtt_client.connect('test.mosquitto.org') mqtt_client.loop_start() def handle_telemetry(client, userdata, message): payload = json.loads(message.payload.decode()) print("Message received:", payload) mqtt_client.subscribe(client_telemetry_topic) mqtt_client.on_message = handle_telemetry while True: time.sleep(2)
Pakeiskite
<ID>
6 eilutėje į unikalų ID, kurį naudojote kurdami savo įrenginio kodą.⚠️ Tai privalo būti tas pats ID, kurį naudojote savo įrenginyje, kitaip serverio kodas neprenumeruos ir nesiųs pranešimų į tinkamą temą.
Šis kodas sukuria MQTT klientą su unikaliu pavadinimu ir prisijungia prie test.mosquitto.org brokerio. Tada jis pradeda apdorojimo ciklą, kuris veikia fone ir klausosi pranešimų iš prenumeruojamų temų.
Klientas prenumeruoja pranešimus iš telemetrijos temos ir apibrėžia funkciją, kuri iškviečiama, kai gaunamas pranešimas. Kai gaunamas telemetrijos pranešimas, iškviečiama
handle_telemetry
funkcija, kuri atspausdina gautą pranešimą į konsolę.Galiausiai, begalinis ciklas palaiko programą veikiančią. MQTT klientas klausosi pranešimų fone ir veikia tol, kol veikia pagrindinė programa.
-
Iš VS Code terminalo paleiskite šią komandą, kad paleistumėte savo Python programą:
python app.py
Programa pradės klausytis pranešimų iš IoT įrenginio.
-
Įsitikinkite, kad jūsų įrenginys veikia ir siunčia telemetrijos pranešimus. Reguliuokite fizinio ar virtualaus įrenginio aptinkamą šviesos lygį. Gaunami pranešimai bus atspausdinti terminale.
(.venv) ➜ nightlight-server python app.py Message received: {'light': 0} Message received: {'light': 400}
app.py
failas naktinės lemputės virtualioje aplinkoje turi būti paleistas, kadapp.py
failas naktinės lemputės serverio virtualioje aplinkoje galėtų gauti siunčiamus pranešimus.
💁 Šį kodą galite rasti code-server/server aplanke.
Kaip dažnai turėtų būti siunčiama telemetrija?
Vienas svarbus aspektas, susijęs su telemetrija, yra tai, kaip dažnai reikia matuoti ir siųsti duomenis? Atsakymas – tai priklauso. Jei matuojate dažnai, galite greičiau reaguoti į pokyčius, tačiau sunaudojate daugiau energijos, daugiau pralaidumo, sugeneruojate daugiau duomenų ir reikia daugiau debesų išteklių jiems apdoroti. Turite matuoti pakankamai dažnai, bet ne per dažnai.
Pavyzdžiui, termostatui matuoti kas kelias minutes greičiausiai yra daugiau nei pakankamai, nes temperatūra nesikeičia taip dažnai. Jei matuosite tik kartą per dieną, galite šildyti namus nakties temperatūrai viduryje saulėtos dienos, o jei matuosite kas sekundę, turėsite tūkstančius nereikalingų temperatūros matavimų, kurie sumažins vartotojo interneto greitį ir pralaidumą (problema tiems, kurie turi ribotus pralaidumo planus), sunaudos daugiau energijos, kas gali būti problema baterijomis maitinamiems įrenginiams, ir padidins debesų kompiuterijos išteklių apdorojimo ir saugojimo išlaidas.
Jei stebite duomenis apie gamyklos įrenginį, kurio gedimas gali sukelti katastrofišką žalą ir milijonus dolerių nuostolių, tada gali būti būtina matuoti kelis kartus per sekundę. Geriau švaistyti pralaidumą nei praleisti telemetriją, kuri rodo, kad įrenginį reikia sustabdyti ir pataisyti prieš jam sugendant.
💁 Tokiu atveju galite apsvarstyti galimybę naudoti kraštinį įrenginį, kad pirmiausia apdorotumėte telemetriją ir sumažintumėte priklausomybę nuo interneto.
Ryšio praradimas
Interneto ryšys gali būti nepatikimas, dažni nutrūkimai. Ką turėtų daryti IoT įrenginys tokiomis aplinkybėmis – prarasti duomenis ar juos saugoti, kol ryšys bus atkurtas? Vėlgi, atsakymas – tai priklauso.
Termostatui duomenys greičiausiai gali būti prarasti, kai tik gaunamas naujas temperatūros matavimas. Šildymo sistema nesirūpina, kad prieš 20 minučių buvo 20,5°C, jei dabar yra 19°C – dabartinė temperatūra lemia, ar šildymas turėtų būti įjungtas ar išjungtas.
Gamyklos įrenginiams galbūt norėsite išsaugoti duomenis, ypač jei jie naudojami tendencijoms stebėti. Yra mašininio mokymosi modelių, kurie gali aptikti anomalijas duomenų srautuose, analizuodami duomenis per tam tikrą laikotarpį (pvz., paskutinę valandą) ir ieškodami anomalijų. Tai dažnai naudojama prevencinei priežiūrai, ieškant požymių, kad kažkas gali greitai sugesti, kad galėtumėte tai pataisyti ar pakeisti prieš tai įvykstant. Galbūt norėsite, kad visi įrenginio telemetrijos duomenys būtų išsiųsti, kad jie galėtų būti apdoroti anomalijų aptikimui, todėl, kai IoT įrenginys vėl prisijungs, jis išsiųs visą telemetriją, sugeneruotą per interneto nutrūkimą.
IoT įrenginių kūrėjai taip pat turėtų apsvarstyti, ar IoT įrenginys gali būti naudojamas interneto nutrūkimo ar signalo praradimo dėl vietos sąlygų metu. Išmanusis termostatas turėtų galėti priimti ribotus sprendimus dėl šildymo valdymo, jei jis negali siųsti telemetrijos į debesį dėl nutrūkimo.
Kad MQTT galėtų susidoroti su ryšio praradimu, įrenginio ir serverio kodas turės būti atsakingas už pranešimų pristatymo užtikrinimą, jei to reikia, pavyzdžiui, reikalaujant, kad visi išsiųsti pranešimai būtų atsakyti papildomais pranešimais atsakymo temoje, o jei ne, jie būtų rankiniu būdu eilėje, kad būtų pakartoti vėliau.
Komandos
Komandos yra pranešimai, siunčiami iš debesies į įrenginį, nurodantys jam atlikti tam tikrą veiksmą. Dažniausiai tai apima tam tikrą išvestį per pavarą, tačiau tai gali būti ir nurodymas pačiam įrenginiui, pavyzdžiui, paleisti iš naujo arba surinkti papildomą telemetriją ir grąžinti ją kaip atsakymą į komandą.
Termostatas galėtų gauti komandą iš debesies įjungti šildymą. Remiantis visų jutiklių telemetrijos duomenimis, debesų paslauga nusprendė, kad šildymas turėtų būti įjungtas, todėl siunčia atitinkamą komandą.
Siųsti komandas MQTT brokeriui
Kitas žingsnis mūsų interneto valdomai naktinei lemputei yra serverio kodo siuntimas komandos atgal į IoT įrenginį, kad būtų valdomas šviesos lygis, kurį jis aptinka.
-
Atidarykite serverio kodą VS Code
-
Pridėkite šią eilutę po
client_telemetry_topic
deklaracijos, kad apibrėžtumėte, į kurią temą siųsti komandas:server_command_topic = id + '/commands'
-
Pridėkite šį kodą į
handle_telemetry
funkcijos pabaigą:command = { 'led_on' : payload['light'] < 300 } print("Sending message:", command) client.publish(server_command_topic, json.dumps(command))
Tai siunčia JSON pranešimą į komandų temą su
led_on
reikšme, nustatyta į true arba false, priklausomai nuo to, ar šviesa yra mažesnė nei 300. Jei šviesa yra mažesnė nei 300, siunčiama true, kad įrenginys įjungtų LED. -
Paleiskite kodą kaip anksčiau
-
Reguliuokite fizinio ar virtualaus įrenginio aptinkamą šviesos lygį. Gaunami pranešimai ir siunčiamos komandos bus atspausdintos terminale:
(.venv) ➜ nightlight-server python app.py Message received: {'light': 0} Sending message: {'led_on': True} Message received: {'light': 400} Sending message: {'led_on': False}
💁 Telemetrija ir komandos siunčiamos vienoje temoje kiekviena. Tai reiškia, kad telemetrija iš kelių įrenginių bus rodoma toje pačioje telemetrijos temoje, o komandos keliems įrenginiams bus rodomos toje pačioje komandų temoje. Jei norėtumėte siųsti komandą konkrečiam įrenginiui, galėtumėte naudoti kelias temas, pavadintas unikaliu įrenginio ID, pvz.,
/commands/device1
,/commands/device2
. Tokiu būdu įrenginys galėtų klausytis tik jam skirtų pranešimų.
💁 Šį kodą galite rasti code-commands/server aplanke.
Komandų apdorojimas IoT įrenginyje
Dabar, kai komandos siunčiamos iš serverio, galite pridėti kodą IoT įrenginyje, kad jas apdorotumėte ir valdytumėte LED.
Sekite atitinkamą žingsnį, kad klausytumėte komandų iš MQTT brokerio:
Kai šis kodas bus parašytas ir paleistas, eksperimentuokite keisdami šviesos lygius. Stebėkite serverio ir įrenginio išvestį bei LED veikimą keičiant šviesos lygius.
Ryšio praradimas
Ką turėtų daryti debesų paslauga, jei reikia siųsti komandą IoT įrenginiui, kuris yra neprisijungęs? Vėlgi, atsakymas – tai priklauso.
Jei naujausia komanda pakeičia ankstesnę, ankstesnės greičiausiai galima nepaisyti. Jei debesų paslauga siunčia komandą įjungti šildymą, tada siunčia komandą jį išjungti, tada įjungimo komandos galima nepaisyti ir jos neperduoti.
Jei komandos turi būti apdorotos eilės tvarka, pvz., pakelti roboto ranką, tada uždaryti griebtuvą, jos turi būti siunčiamos iš eil Apie šiuos įrenginius pagalvokite, kokias žinutes jie gali siųsti ar gauti. Kokius telemetrijos duomenis jie siunčia? Kokias žinutes ar komandas jie gali gauti? Ar manote, kad jie yra saugūs?
Klausimai po paskaitos
Apžvalga ir savarankiškas mokymasis
Skaitykite daugiau apie MQTT MQTT Wikipedia puslapyje.
Pabandykite patys paleisti MQTT brokerį naudodami Mosquitto ir prisijunkite prie jo iš savo IoT įrenginio bei serverio kodo.
💁 Patarimas - pagal numatytuosius nustatymus Mosquitto neleidžia anonimiškų prisijungimų (t. y. prisijungimų be vartotojo vardo ir slaptažodžio) ir neleidžia prisijungimų iš kitų kompiuterių, nei tas, kuriame jis veikia.
Tai galite išspręsti naudodamimosquitto.conf
konfigūracijos failą su šiuo turiniu:listener 1883 0.0.0.0 allow_anonymous true
Užduotis
Palyginkite ir kontrastuokite MQTT su kitais komunikacijos protokolais
Atsakomybės apribojimas:
Šis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą Co-op Translator. Nors siekiame tikslumo, atkreipiame dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudotis profesionalių vertėjų paslaugomis. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus aiškinimus, kylančius dėl šio vertimo naudojimo.