You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IoT-For-Beginners/translations/lt/1-getting-started/lessons/4-connect-internet/README.md

30 KiB

Prijunkite savo įrenginį prie interneto

Pamokos apžvalga piešinyje

Piešinys sukurtas Nitya Narasimhan. Spustelėkite paveikslėlį, kad pamatytumėte didesnę versiją.

Ši pamoka buvo dėstoma kaip dalis Hello IoT serijosMicrosoft Reactor. Pamoka buvo pateikta per 2 vaizdo įrašus 1 valandos pamoka ir 1 valandos konsultacija, kurioje gilinamasi į pamokos dalis ir atsakoma į klausimus.

Pamoka 4: Prijunkite savo įrenginį prie interneto

Pamoka 4: Prijunkite savo įrenginį prie interneto - Konsultacijos

🎥 Spustelėkite aukščiau esančius paveikslėlius, kad peržiūrėtumėte vaizdo įrašus

Klausimynas prieš pamoką

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.

IoT įrenginiai jungiasi prie brokerio, publikuoja telemetriją ir prenumeruoja komandas. Debesų paslaugos jungiasi prie brokerio, prenumeruoja visą telemetriją ir siunčia komandas konkretiems įrenginiams.

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ą.

IoT įrenginys publikuoja telemetriją temoje /telemetry, o debesų paslauga prenumeruoja tą temą

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.

Užduoties srauto diagrama, rodanti šviesos lygių skaitymą ir tikrinimą bei LED valdymą

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.

Interneto prijungtas termostatas, naudojantis kelis kambario jutiklius

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.

  1. Į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.

  1. Į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.

  1. Terminale arba komandų eilutėje paleiskite šias komandas pasirinktoje vietoje, kad sukurtumėte ir pereitumėte į naują katalogą:

    mkdir nightlight-server
    cd nightlight-server
    
  2. 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, komanda python naudos Python 2 vietoj Python 3.

  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ą.

  4. 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ą.

  5. 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ą.

  1. 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
      
  2. Atidarykite dabartinį aplanką VS Code:

    code .
    
  3. Kai VS Code paleidžiamas, jis aktyvuos Python virtualią aplinką. Tai bus nurodyta apatinėje būsenos juostoje:

    VS Code rodo pasirinktą virtualią aplinką

  4. 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:

    VS Code mygtukas Kill the active terminal instance

  5. 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 
    
  6. 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.

  7. 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.

  8. Į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, kad app.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.

Šis Ferrari tapo neveiksnus, nes kažkas bandė jį atnaujinti po žeme, kur nėra mobiliojo ryšio

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ą.

Interneto prijungtas termostatas, gaunantis komandą įjungti šildymą

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.

  1. Atidarykite serverio kodą VS Code

  2. Pridėkite šią eilutę po client_telemetry_topic deklaracijos, kad apibrėžtumėte, į kurią temą siųsti komandas:

    server_command_topic = id + '/commands'
    
  3. 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.

  4. Paleiskite kodą kaip anksčiau

  5. 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

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 naudodami mosquitto.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.