Amazonove spletne storitve v računalniškem oblaku (AWS) lahko uporabljamo tudi v IoT napravah z ESP8266, ESP32, WINC15x0, WFI32E in drugimi IoT Wi-Fi moduli. Kako je izdelamo in kako deluje AWS IoT naprava? Katere storitve ponuja oblak? Kako z njim povežemo dve oddaljeni napravi? Kako varno je? Koliko stane?
AWS daje možnost souporabe zmogljive Amazonove računalniške infrastrukture v javnem računalniškem oblaku. Številni podatkovni centri po vsem svetu so strogo fizično varovani in omogočajo varno hrambo naših podatkov na različnih lokacijah po vsej zemeljski obli. V AWS lahko neposredno povežemo tudi majhne IoT naprave, pri čemer ne potrebujemo lastnih informacijskih strežnikov. Mogoča je tudi varna komunikacija med različnimi IoT napravami prek AWS storitev.
AWS storitve omogočajo povezovanje domačih, službenih in javnih infrastrukturnih IoT naprav (npr. avtobusi, vlaki, …). Zato se odpirajo številne možnosti za enostavno in varno implementacijo zahtevnih aplikacijskih rešitev, s katerimi lahko varujemo dom, upravljamo določene procese v podjetju (npr. samodejna registracija delovnega časa s pomočjo pametnega telefona), ali zagotavljamo javne storitve, kot je obveščanje čakajočih potnikov na avtobusni postaji o prihodu naslednjega avtobusa.
V oblaku lahko zgradimo tudi varno navidezno strežniško okolje za izvajanje želenih informacijskih storitev, med katerimi so usmerjevalniki, spletni in podatkovni strežniki, pogoni za hrambo podatkov, analitična orodja, metode za grafične prikaze, umetno-inteligenčne funkcije itn.
AWS IoT Core
IoT naprave se povežejo z AWS oblakom preko AWS IoT Core storitev, ki omogočajo njihovo komunikacijo z drugimi storitvami in aplikacijami v oblaku. Za neposredno komunikacijo AWS oblaka z IoT napravo je odgovoren message broker (sporočilni posrednik) s protokoli za varno šifrirano komunikacijo na osnovi X.509 elektronskih certifikatov. Naloga sporočilnega posrednika je razpošiljanje podatkov IoT naprave drugim napravam, ki so na podatke naročene in drugim AWS IoT Core storitvam, kot sta Shadow service (senčna storitev) in Rules engine (stroj za izvajanje pravil). Shadow service hrani stanje IoT naprave in omogoča komunikacije drugih naprav z njo ne glede na to, ali je trenutno povezana v oblak ali ne. Vendar pa IoT naprava ob vsakokratnem ponovnem priklopu posodobi stanje svoje sence (shadow state) v svoji senčni storitvi.
Rules engine povezuje podatke iz sporočilnega posrednika z drugimi AWS storitvami, ki omogočajo njihovo shranjevanje in nadaljnje procesiranje. Tako lahko podatke shranimo v tabelo AWS podatkovne zbirke AWS DynamoDB ali glede na logični izraz, definiran v stroju za pravila, uporabimo Lambda funkcijo.
Vse komunikacije in aktivnosti v AWS IoT Core so šifrirane z X.509 elektronskimi certifikati in elektronskimi ključi za avtentifikacijo, za avtorizacijo pa uporabljajo varnostne politike.
MQTT sporočila komunikacija
AWS IoT Core omogoča komunikacijo s protokoli: MQTT(Message Queuing Telemetry Transport) in MQTT preko Web Socket Secure (WSS), ki omogočata objavo in naročanje na sporočila, ter z napravami in odjemalci, ki za objavo sporočil uporabljajo protokol HTTPS; vendar slednji ne omogoča naročanje na sporočila. Osnovna komunikacija poteka prek protokolov IPv4 in/ali IPv6.
MQTT je enostaven in pogosto uporabljan sporočilni protokol za izmenjavo podatkov z napravami z omejenim naborom funkcionalnosti. AWS IoT podpira nekoliko prilagojeno različico MQTT v3.1.1. Programska podpora za MQTT in MQTT preko WSS je na voljo v SDKjih za različne operacijske sisteme, programske jezika in tipe IoT naprav. Vsebuje s funkcije za povezavo naprav in odjemalcev ter dostop do AWS IoT Core storitev. SDK bistveno poenostavi pisanje vgrajene programske opreme za IoT naprave, vendar pa ni pogoj za uporabo AWS IoT Core storitev. Pogoj za vzpostavitev povezave odjemalcev s strežnikom je uporaba Server name indication (SNI, slov. označba strežniškega imena) TLS razširitve, saj morajo odjemalci v zahtevi za povezavo s strežnikom posredovati SNI, v nasprotnem je ta zavrnjena.
MQTT z uporabo AWS IoT Device SDK
Poglejmo, na katere načine je MQTT v AWS IoT Cores storitvah podprt z SDK-ji. Raznolikost operacijskih sistemov pri tem ne predstavlja ovire, saj je vsaj eden od programskih jezikov podprt v vsakem operacijskem sistemu. Za razvoj v programskem jeziki C++ je na voljo AWS IoT C++ Device SDK, skupaj s primeri iz GitHuba. Natančne podatke najdemo v AWS IoT Core Developer Guide (iot-dg.pdf, ki jo lahko prenesemo iz AWS Management Console (AWS upravljavska konzola), console.aws.amazon.com). Podobno so za programske jezike Python, JavaScript, Java na voljo še: AWS IoT Device SDK for Python, AWS IoT Device SDK for JavaScript, AWS IoT Device SDK for Java.
Medtem, ko je AWS IoT Device SDK for Embedded C je namenjena izkušenim razvijalcem ugnezdene programske opreme, so na voljo so izvorne kode za različne strojne osnove, ki vključujejo popularne Wi-Fi module, kot so ESP-ji pa tudi Microchip-ovi WINC in WIFI moduli. SDK lahko prenesemo iz spletne strani GitHuba [1]. Vsekakor pa je so za različna razvojna okolja, kot je Arduino, na GitHubu še številni drugi razvojni paketi, kot je Hornbill-Examples.
Kakšne Wi-Fi module potrebujemo za AWS IoT?
Poplava brezžičnih modulov, kot sta seriji ESP8266 in ESP32 ter Microchip-ovi seriji WINX15x0 in WFI32E, omogoča neštete možnosti povezovanja; še posebej zato, ker lahko kupimo tudi razvojne ploščice, ki jih lahko programiramo preko vgrajenega USB-RS232 mosta. Mnoge se napajajo kar iz računalniškega priključka USB, obenem pa lahko z njimi povežemo tudi enostavna tipala z nizko porabe energije. Enostavne aplikacije lahko s peščico električnih vodnikov povežemo že na prototipni plošči, v katero nataknemo IoT razvojno ploščico in tipala. Preizkus AWS lahko izvedemo tudi samo z Wi-Fi razvojno ploščo, tako da programske primere prilagodimo tako, da razvojna ploščica sama ustvarja podatke (npr. meri čas, temperaturo mikrokontrolerja, analogne in digitalne vrednosti na GPIO vhodih ipd.)…
A pojdimo po vrsti! Odločitev za pravi modul ni lahka, saj imajo vsi tako prednosti kot slabosti. Nekateri ne omogočajo hkratnega priklopa več kot ene Wi-Fi naprave, a imajo zato vgrajeno strojno podporo za varnostno kodiranje podatkov. Pri drugih bi si želeli strojno podporo za zmogljivejše kriptografske algoritme. Nemalokrat si želimo tudi hiter prenos podatkov med Wi-Fi, Ethernetnom in USB. Neposredno podporo slednjemu pogrešamo pri večini modulov. Zato bomo najprej nekoliko natančneje pregledali zgradbo Microchip-ovih WFI32E01 Wi-Fi modulov, ki predstavljajo zanimivo alternativo uveljavljenim ESP8266 in ESP32 modulom.
Vsekakor ne moremo niti mimo Espressif Systems novosti ESP32-C3 sistema v enem čipu, kakor tudi ne prihajajočih modulov na njegovi osnovi, ki imeli zmogljivejši RISC-V procesor namesto zdajšnjih Tensilicinih eno- in dvojedrnih rešitev, ki so vgrajene v ESP32-S2 in starejše module. Nato se lotimo AWS storitev.
Če bi radi AWS IoT preizkusili tudi v praksi, je vsekakor zdaj čas tudi za nakup združljive IoT razvojne plošče ali IoT modula, saj hitra pošta potrebuje za dostavo vsaj nekaj dni. Na spletnih straneh AWS najdete tudi seznam z AWS IoT Core združljivih Wi-Fi razvojnih plošč, ki je priročen tudi pri gradnji lastnih razvojnih plošč na osnovi standardnih Wi-Fi modulov, saj mnoge razvojne plošče poleg Wi-Fi modula ne vsebujejo drugega kot komunikacijski most USB/RS-232, ki deluje transparentno. Zato lahko uporabimo standardna razvojna orodja in SDK-je, ki so na voljo za eno do podprtih razvojnih plošč s tem Wi-Fi modulom.
PIC32MZ W1 in družina WFI32E01 modulov
Da so bili WINC15x0 moduli s Cortus APS3 mikrokontrolerjem z arhitekturo ARM le uvod v novo poglavje Microchip-ovih Wi-Fi rešitev, se lahko prepričamo iz zgradbe nove družine PC32MZ W1 mikrokontrolerjev z integriranim Wi-Fi modulom. Slednje je vsekakor velika novost, saj WINC15x0 moduli s PIC-i ali drugimi mikrokontrolerji komunicirajo prek SPI vodila, ki je veliko počasnejše od sistemskega vodila znotraj PIC32 čipa. PIC32MZ W1 mikrokontrolerska družina tako s svojim prvim predstavnikom PIC32MZ1025W104 v WFI32E01 modulu predstavlja ESP32 podobno rešitev, le da 1 MB programski Flash RAM ni v posebnem čipu. Od 384 kB RAMa je le 256 kB namenjeno splošni uporabi, medtem ko 64 kB uporablja Wi-Fi modul. Na voljo sta tudi Ethernet in USB modul in vsa ostala periferija, ki smo je vajeni iz PIC32 mikrokontrolerjev. USB modul pri modulih ESP močno pogrešamo, zato je WFI32E01 s 37 prostimi GPIO priključki vsekakor v prednosti.
Pomemben element WFI32E modulov je tudi informacijska varnostna osnova Trust&Go, ki združuje strojne podpore za različne algoritme varnostnih kodiranj in protokolov za varen brezžični prenos podatkov, kot so WAP3, AES, 3DES, SHA, MD5 in HMAC.
Je pa več kot očitno, da moduli WFI32E01 niso namenjeni ročnemu spajkanju, saj ima miniaturne kontakte s spodnje strani. Tako je za pritrditev na tiskano vezje potrebno najprej nanesti spajko in nato hkrati enakomerno segreti celotno površino pod modulom, ali pa uporabiti tehniko lepljenja. Posebno tehniko spajkanja in natančnega strojnega polaganja na tiskanino zahteva tudi PIC32MZ1025W104 mikrokontrolerski čip, saj so miniaturni kontakti s spodje strani razporejeni v notranji iz zunanji kvadrat.
Moduli WFI32E01 stanejo okoli 10 EUR, vendar pa je za samograditelje veliko primernejši razvojni komplet PIC32 WFI32E Curiosity Board (pri MicrochipDirect stane okoli 65 EUR), ki omogoča tudi izmenjavo razvojnih plošč z različnimi tipi WFI32E modulov. WFI32E moduli so združljivi z Microchip Harmony razvojnim okoljem, morda pa bomo nekoč dočakali tudi njihovo združljivost z Arduinom.
Espressif Systems pohitel s specifikacijo družine ESP32-C3 modulov
Čeprav današnji ESP8266 in ESP32 moduli temeljijo na Tensilica procesorskih jedrih, so se Espressif Systems razvijalci tokrat zavoljo z večje zmogljivosti odločili za eno samo zmogljivejše RISC-V jedro, ki bo poganjalo številne periferne enote, vgrajene v nove ESP32-C3 Wi-Fi module. Jedrno programja za krmiljenje vgrajenih perifernih enot naj bi ostalo zaprtokodno, kot pri ostalih napravah z RISC-V procesorji, zato pa bo programska koda višjih nivojev odprtokodna in združljiva s programskimi knjižnicami za ESP32 ter Arduino in IDF razvojnima okoljema, medtem ko bodo priključki mikrokontrolerskega čipa združljivi s tistimi pri mikrokontrolerskem čipu ESP8266 modula.
Poleg 400 kB RAMa in zajetnega 384 kB ROMa z zagonskimi programi z možnostjo varnega zagona (secure boot) za nalaganje uporabniške programske kode, bo ESP32-C3 vseboval tudi strojno podporo za varnostna kodiranja AES, RSA, HMAC ter podporo za digitalni podpis in OTP, kodiranje Flash RAMa, nadzor dostopa itn. Flash RAM bo še vedno v ločenem čipu, vendar pa bodo lahko programi in podatki v njem kodirani z algoritmom XTS-AES.
Še vedno pa pogrešamo USB krmilnik, ki bi omogočal programiranje modula brez mostu iz USB na RS-232. ESP32-C3 ima 22 GPIO, ki jih lahko uporabimo za različne funkcije. V predhodnih specifikacijah pa zaman iščemo tudi Ethernet krmilnik, prek katerega lahko pri ESP8266 in ESP32 povežemo ožičeni Ethernet. Vendar ni izključeno, da si bodo do začetka proizvodnje pri Espressif Systems vsaj glede podpore USB še premislili, saj so nekatere novičarske internetne strani še v začetku decembra objavile blok diagram z vključeno USB enoto.
Vzpostavitev dostopa do AWS storitev
Zdaj se lahko lotimo prijave na AWS, za katero potrebujemo tudi mobilni telefon in eno od plačilnih kartic. Brez slednjih se ne bomo mogli registrirati in uporabljati storitve. Pri AWS dajejo velik poudarek varnosti uporabnikov storitev računalniškega oblaka, kot tudi varnosti uporabnikov interneta. Zato želijo nedvoumno preveriti identiteto vsakega novega uporabnika.
Postopek registracije je dvofazen. Najprej v AWS oblaku registriramo novega korenskega uporabnika, ki mora skozi postopek preverjanja identitete s pomočjo kreditne kartice in (mobilnega) telefona, vključno s povratnim klicem z AWS podpore. Vse lahko uredite v enem dnevu, pod pogojem, da je vse v redu s plačili iz kreditne kartice. Pri AWS na slednji zgolj rezervirajo 1 EUR sredstev, ki jih kasneje vrnejo.
Za tiste, ki se odločijo za zastonjski načrt AWS storitev nato kakršnokoli plačevanje zanje ni potrebno. Vseeno pa ni slabo za vsak primer narediti načrta proračuna, s katerim z zagotovimo čimprejšnje obveščanje v primeru, da bi nas AWS bremenil za kakršnekoli stroške. Vsekakor iz AWS tudi kadarkoli izstopimo.
Kakorkoli, ko je enkrat AWS upravljavska konzola (gumb in meni v desnem zgornjem kotu) aktivirana, lahko začnemo uporabljati AWS storitve. V tokratnem nadaljevanju si bomo ogledali osnovni način povezave IoT naprave in prenos podatkov z nje v AWS. Postopek je podoben, ne glede na to katero IoT strojno opremo uporabimo, pod pogojem, da imamo zanjo na voljo ustrezne programske knjižnice.
AWS IAM uporabniki
Ko dobimo pravico uporabe AWS, se vanj prijavljamo s korenskim uporabnikom (root user) z vsakovrstnimi možnostmi upravljanja storitev, vključno z menjavanjem načrta AWS storitev. Zato AWS omogoča dvostopenjsko prijavo z uporabniškim imenom in geslom ter enkratno kodo, ki nam jo AWS pošlje na mobilni telefon, ko vpišemo uporabniško ime in geslo. Če tako visoke varnosti ne potrebujemo, lahko ob prvi prijavi z OTP izberemo, da se bomo iz računalnika prijavljali brez OTP. AWS v nato na tem računalniku oz. njegovem spletnem brskalniku ne zahteva prijave z OTP, saj AWS v računalnik odloži kodiran varnostni piškotek. Z OTP se bomo ponovno morali prijaviti, če omenjeni piškotek izbrišemo. Če menimo, da je naš računalnik varen pred hekerji, se lahko odločimo tudi za varovanje s piškotkom.
Po drugi, strani korenski dostop le redko potrebujemo pri običajem delu. Zato pri AWS svetujejo, da za slednje izdelamo IAM uporabnike z bistveno manj pravicami, ki so lahko namenjeni tudi sodelavcem, ki bodo delali na istem projektu.
IoT povezava z AWS
Želene AWS storitve lahko poiščemo iz menija ali iskalnika v AWS upravljavski konzoli. Za naš primer potrebujemo IoT Core storitev, v katero moramo registrirati našo IoT napravo z njenim imenom ter izdelati varnostno politiko njene povezave z AWS storitvami. Obe operaciji lahko izvedemo iz Manage menija v IoT Core storitvah, v katerem najprej izberemo podmeni Things in nato kliknemo na gumb Register a thing. Omenimo še, da je mogoče enake operacije izvesti z različnimi sprehodi prek gumbov in menijev. Res pa je, da so velika okna z gumbi na voljo, ko v določenem pregledu še nimamo vnosov. Denimo, v našem primeru je pregled stvari (things) še prazen, zato AWS ponudi tudi uporabniški priročnik, do katerega pridemo z gumbom Learn more, novo stvar pa registriramo z gumbom Register za thing. Ko smo vnesli prvo stvar, ostale dodajamo iz spustnega menija.
V naslednjem koraku dodajanja stvari potrebujemo elektronske certifikate zanjo. Za začetek izberemo kar prvo opcijo Cerate certificate, ki za prenos pripravi tri elektronska potrdila: certifikat IoT naprave (A certificate fort his thing), javni ključ (A public key) in zasebni ključ (A private key). Na spletni strani je tudi gumb Activate, s katerim certifikat IoT stvari omogočimo in napravi dovolimo dostop. To sicer lahko storimo že sedaj, vendar ne bomo, saj IoT naprava še ni sprogramirana. Zato si bomo to operacijo izvedli pred začetkom testiranja. Po drugi strani, je dobro vedeti, da je mogoče certifikat stvari vselej tudi deaktivirati, ali razveljaviti (revoke). Vendar pa moramo razveljavljeni certifikat nato nadomestiti z novim.
Poleg teh moramo prenesti še korenski certifikat AWS certifikatnega strežnika Amazom Root CA, ki ga dobimo v meniju Security and Identity/AWS IoT Authentication/X.509 Certificates/X.509 Certificates and IoT. Izberemo 2048 bitni RSA certifikat.
Zdaj se lotimo izdelave varnostne politike (Policy) za programski dostop do AWS storitev. Dokler še nimamo idej, katere operacije dovoliti in katere ne, si lahko pri definiciji dovoljenih storitev in njihovi sredstev pomagamo kar z dvema zvezdicama (*), ki ju vpišemo v polji za akcije in ARN sredstva. Ko je politika izdelana, izberemo stvar, na njej odpremo spustni seznam in s stvarjo povežemo varnostno politiko.
Ugnezdena programska koda IoT naprave
V AWS upravljavski konzoli najdemo tudi primere ugnezdenih programskih kod za različne IoT module. Sam sem izbral primer za ESP32, ki sem ga imel ravno pri roki. Poteki prenosov, priprav in namestitev vgrajenih programskih oprem v IoT naprave so dokumentirani tudi z videi, na voljo pa so tudi programski vodniki (tutorials) in interaktivne predstavitve. Ogledate si pač tisto, ki se vam zdi najbolj nazorno in hkrati primerno za vaš nivo računalniškega znanja.
Odločil sem se, da bom za začetek uporabil AWS IoT primer merilnika temperature in relativne zračne vlažnosti. Ker pa tipala DHT11 ali DHT12 v resnici nimam, sem se hkrati odločil primer programske kode predelati tako, da podatke zajema iz drugih virov.
Naprej sem iz GitHuba v svoj računalnik prenesel razvojni kit Hornbill-Examples (gumb Code in pritisnemo Download ZIP), ki vključuje primer povezave ESP32 z AWS storitvami [2]. Nato pa sem iz naslova[3] na enak način prenesel še programsko knjižnico za tipalo DHT11. Zadnjo sem potreboval le za referenco, ko sem se lotil odstranjevanja programske kode za prenos podatkov s tipala.
Datoteko Hornbill-Examples-master.zip sem razpakiral v mapo z ESP32 (po lastni izbiri), nato pa iz C:UsersAdministratorDocumentsArduinolibraries, iz kateri so dodatne programske knjižnice razvojnega okolja Arduino, vanjo prekopiral mapo AWS_IOT. Namesto tega lahko knjižnico AWS-SDK-ESP8266 namestimo tudi prek menija Tools, iz katerega zaženemo Library Manager. Opozorimo le še to, da je predpogoj, da je v Arduino že nameščena knjižnica ESP32 s splošno podporo za gradnjo ugnezdene programske opreme za tovrstne Wi-Fi module.
Vgradnja certifikatov, spletnih naslovov in Wi-Fi poverilnic v programsko kodo
Pripravljavci vzorčne programske kode za povezavo IoT naprav z AWS so na nazoren način označili mesta, ki jih moramo prekriti z vsebino strežniškega certifikata in šifrirnih ključev, ki jih prenesemo z AWS upravljavske konzole, ko ustvarimo komplet certifikatov za novo AWS stvar (oz. napravo). V datoteko aws_iot_certficates.c v mapi C:UsersAdministratorDocumentsArduinolibrariesAWS_IOT ustrezna mesta prekrijemo z elektronskim certifikatom Amazonovega strežnika ter javnim in privatnim ključem, ki smo jih dobili pri registraciji IoT stvari (oz. naše naprave). Mesta, kamor moramo prenesti kode certifikata in ključev, so označena s črkami x. Po kopiranju novega certifikata moramo vsako vrstico ponovno zaključiti z n, tako kot je nakazano v vzorčni kodi. Pri kopiranju je potrebna pazljivost, saj bo v nasprotnem primeru vsebina certifikata ali šifrirnega ključa napačna in se ne bomo mogli prijaviti na AWS strežnik.
Zdaj moramo v kodo vnesti še ime Wi-Fi usmerjevalnika (WIFI_SSID) in pristopno geslo (WIFI_PASSWORD). Pravilno nastavimo tudi HOST_ADDRESS, CLIENT_ID in TOPIC_NAME, ki so potrebni za komunikacijo z AWS strežnikom prek MQTT protokola. Slednje podatke lahko prepišemo iz AWS IoT Core konzole, če iz stranskega pregleda odpremo Manage/thing, izberemo želeno napravo in nato na tej iz stranskega pregleda izberemo Interact. Na vrhu vidimo polje s HTTPS.
HOST_ADDRESS je fiksno domensko ime strežnika, do katerega dostopamo, ko uporabljamo svoje AWS storitve. Vendar pa ne smemo misliti, da je fiksen tudi IP naslov. Slednjega AWS oblak določa sproti in se dinamično spreminja. TOPIC_NAME je ime teme, v katero se uvrščajo sporočila MQTT, ki se prenašajo med IoT napravo in AWS strežnikom. Za ID odjemalca (CLIENT_ID) izberemo poljubno unikatno ime.
Testiranje AWS IoT storitev v AWS IoT upravljavski konzoli
Prvi korak testiranja AWS IoT storitev najenostavneje izvedemo kar preko AWS IoT upravljavske konzole, v katerih smo pripravili storitve. Testiramo tako, da pripravimo MQTT vprašanje, ki ga nato posredujemo neposredno MQTT dostopni točki preko menija Act/Test. Odgovor vidimo tako v majhnem tekstovnem okencu, ki je namenjeno prikazu odziva storitve na sporočila o različnih temah.
Testiranje AWS IoT Core povezave v IoT napravi
Če vse predpriprave v AWS upravljavski konzoli in vnos poverilnic v programsko kodo opravimo pravilno, s testiranjem praviloma ne bo težav. Sam sem uporabil kar dva ESP32 modula, od katerih je tisti s fiksno povezavo v internet deloval kot usmerjevalnik med Wi-Fi in Ethernetom, na drugega pa sem namestil testno aplikacijo iz razvojnega kita Hornbill-Examples. Na ta način lahko povezavo z AWS vzpostavimo v nekaj enostavnih korakih. Res pa je, da se da v primerih še marsikaj izboljšati. Denimo, prijava v dostopno točko se dejansko izvede dvakrat, kar ni potrebno. Če tega ne želimo, lahko poleg ukaza WiFi.begin, uporabimo še ukaz WiFi.status, ki po časovni zakasnitvi preveri (npr. 5 s), če je povezava Wi-Fi dostopno točko uspela. Še boljša možnost za hitro vzpostavljanje, ki jo lahko uporabite kjerkoli pa je naslednja:
int status=WL_IDLE;
while(status != WL_CONNECTED){
status = WiFi.begin(WIFI_SSID, WIFI_PASSWORD);i = 50;
while(((status=WiFi.status())!=WL_CONNECTED)&&(i>0)){delay(100);i–;}
}
Po klicu WiFi.begin program počaka 100 ms in nato še enkrat z ukazom WiFi.status preveri, ali je povezava uspela. Če ni, z istim ukazom ponovno preverja na vsakih 100 ms. Če po petih sekundah povezava še vedno ni vzpostavljena, ponovi celotno proceduro povezovanja. To je hitreje, kot če bi po WiFi.begin počakali 5 s in nato WiFi.status preverili, ali je povezava uspela.
Po drugi strani, je MQTT komunikacija s programsko knjižnico AWS_IoT enostavna. Povežemo s klicem funkcije AWS_CLIENT.connect(HOST_ADDRESS, CLIENT_ID), ki vrne 0 ob uspešni prijavi, sicer pa vrne kodo napake. Sporočilo v znakovnem nizu payload pa na AWS IoT Core objavimo takole: AWS_CLIENT.publish(TOPIC_NAME, payload). Tudi ta funkcija vrne 0, če je objava uspešna, sicer pa vrne kodo napake.
Testiranje AWS IoT Core povezave s splošno-namenskim računalnikom
Za testiranje AWS IoT Core storitev sicer lahko uporabimo tudi katerikoli namizni računalnik (npr. PC z operacijskim sistemom Microsoft Windows, Linux ali MacOS X) ali mikroračunalnik (npr. Raspberry Pi ali Banana Pi). Za vsak podprt operacijski sistem sta a voljo tudi testna aplikacija in SDKji v višjih programskih jezikih Pythonu in Javi.
Predpogoj za pravilno delovanje protokola MQTT je pravilno delujoča internetna poveza z odprtimi TCP vrati 443 in 8883, oz. vrati glede na izbiro načina komunikacije. Nemoten prenos podatkov moramo torej zagotoviti v usmerjevalniku. Pomembno je tudi pravilno delovanje DNS strežnika. Javni Googlov DNS strežnik ima naslov 8.8.8.8, lahko pa uporabimo tudi DNS strežnik svojega internetnega operaterja. Pomembno je le, da strežnik pravilno pretvori naslov gostiteljskega strežnika (HOST_ADDRESS) v IP naslov. V nasprotnem AWS strežnik ne bo dobil sporočila MQTT.
Čeprav številni demonstracijski videi prikazujejo sorazmerno enostavnost osnovne povezave IoT naprave z AWS strežnikom, je potrebne predpriprava, s katero bomo omogočim, da bo sporočilo IoT naprave dosego AWS strežnik, kar je načeloma sorazmerno preprosto, vendar pa se včasih tudi kaj zatakne. K sreči so za razvijalce na voljo tudi podrobna navodila v PDF datotekah, ki so dostopne tudi preko spletnih strani AWS. Tisti, ki ste pripravljeni za tehnično pomoč odšteti tudi nekaj malega denarja, lahko izberete tudi plačljiv načrt AWS storitev, pri katerem ste vsak mesec upravičeni do nekaj ur neposredne tehnične pomoči preko e-pošte ali tipkanja v živo. Za vse uporabnike pa so na voljo tudi AWS-jevi izobraževalni videi.
Naslednjič
Tokrat smo spoznali, najosnovnejšo možnosti povezave IoT naprave z AWS storitvami, pri čemer smo preveril zgolj zajem podatkov, ne pa tudi načinov njihove obdelava in možnosti njihovega posredovanja v drugo IoT napravo. Prihodnjič se lotimo kompleksnejšega primera, pri katerem bomo videli, katere prednost nam prinese povezovanje različnih IoT naprav preko AWS. Videli bomo tudi, kako uporabljamo pravila, s katerimi lahko z MQTT sporočila posredujemo jedrnim storitvam AWS, ki tvorijo naše delovno okolje, in kako preko MQTT sporočil krmilimo drugo IoT napravo, oziroma jih posredujemo aplikaciji v osebnem računalniku, tabličnem računalniku ali pametnem telefonu. Preizkusili bomo tudi Microchipov Wi-Fi modul WINC1510. Več o izdelavi Wi-Fi AWS IoT združljivih modulov preberite na [4].
Viri:
1: https://github.com/aws/aws-iot-device-sdk-embedded-C
2: github.com/ExploreEmbedded/Hornbill-Examples
3: github.com/adafruit/DHT-sensor-library
4: https://sites.google.com/site/pcusbprojects
<Slike>
Slika 1: Povezovanje IoT naprav v Amazonov računalniški oblak
Slika 2: Lokacije strogo varovanjih Amazinovih podatkovnih centrov po svetu
Slika 3: Zgradba indelovanje AWS IoT Core
Slika 4: Povezovanje IoT naprav prek AWS z MQTT
Slika 5: SDKji in zbirke programerskih orodij (Toolkits)
Slika 6: Doma izdelan Wi-Fi modul na osnovi ESP32, združljiv z AWS IoT Core
Slika 7: Ena izmed v AWS podprtih razvojnih ploščic z ESP32
Slika 8: Microchipove z AWS združljive razvojne plošče
Slika 9: AWS upravljavska konzola (AWS Management Console)
Slika 10: Programirane IoT modula in povezovanje v AWS oblak preko Wi-Fi
Slika 11: AWS IoT programska knjižnica za razvojno okolja Arduino
Slika 12: Razvojna okolja Greengrass za različne razvojne plošče in strojne osnove
Slika 13: V datoteko aws_iot_certificates.c prekopiramo vsebine certifikatov, ki jih dobimo iz AWS IoT Core upravljavske konzole
Slika 14: V glavno programsko datoteko na rdeče pobarvana mesta vnesemo podatke za prijavo na Wi-Fi dostopno točko in vzpostavitev povezave z AWS IoT Core message brokerjem
<konec slik>
Avtor: dr. Simon Vavpotič