Spájanie vecí
komunikačné technológie z pohľadu spotreby, dosahu, množstva prenášaných dát, komunikačné protokoly používané v IoT, protokoly MQTT, ZigBee a BLE
Záznam z prednášky
Introduction
(slide) V prvej prednáške sme hovorili o architektúre IoT, kde sme si ukázali, ako svet IoT funguje v 4. vrstvách. Dnes sa však budeme rozprávať o komunikácii vo svete IoT, čo je téma charakteristická pre komunikáciu medzi zariadeniami prvej a druhej vrstvy - medzi vecami a IoT bránami. Zvyšné vrstvy sú totiž prepojené vysokorýchlostným internetom, takže tam to už nie je žiadna výzva, pretože na prenos využívajú komunikačné protokoly aplikačnej vrstvy OSI/ISO modelu.
Machine to Machine (M2M)
(slide) Ak by sme mali začať hovoriť o komunikácii vecí v IoT, mali by sme začať s termínom M2M.
(slide) V skratke by sme M2M komunikáciu mohli charakterizovať ako priamu komunikáciu medzi dvoma zariadeniami pomocou akéhokoľvek komunikačného kanála bez nutnosti manuálnej ľudskej asistencie.
Hlavným účelom M2M komunikácie vo svete IoT je prenos dát od vecí (koncových zariadení) smerom do internetu. V tom prípade je jedným komunikujúcim zariadením samotný chytrý senzor a druhým komunikujúcim zariadením je počítačový systém, ktorý obyčajne tieto údaje posiela ďalej v rámci IoT architektúry.
Dá sa povedať, že M2M reprezentuje architektúru, kde nie je dôležité, aká technológia je použitá na prenos, prípadne pomocou akého komunikačného protokolu sú tieto údaje prenášané.
Rozdiel medzi M2M a IoT
(slide) Dá sa stretnúť s interpretáciou, že M2M je vlastne IoT. Ale to nie je pravda - M2M hovorí obecne o prepojení dvoch ľubovoľných zariadení ľubovoľným spôsobom. Takže správna interpretácia by mala byť, že IoT pre svoju činnosť potrebuje M2M, ale M2M nepotrebuje IoT.
Communication Technologies
Nás však bude a musí zaujímať, aké technológie sú použité na prenos údajov (do internetu). Ich výber je samozrejme ovplyvnený viacerými faktormi:
- cenou,
- dosahom,
- množstvom prenášaných dát, alebo
- spotrebou.
Poďme sa teda pozrieť na niektoré technológie populárne v IoT bližšie.
Power Consumption
(slide) Jedným z dôležitých aspektov výberu komunikačnej technológie je jej spotreba. Treba si totiž uvedomiť, že častým riešením a nasadením IoT je v prostredí, kde nie je trvalý prívod elektrickej energie. Spotreba celého zariadenia (veci) teda predstavuje jeden z kľúčovch faktorov pri jeho dizajnovaní a návrhu.
Communication Distance
(slide) Ďalším nemenej dôležitým aspektom výberu správnej komunikačnej technológie je jej dosah. Tu sa je možné odraziť od charakteristiky siete, v ktorej bude riešenie nasadené:
- PAN (Personal Area Network)
- LAN (Local Area Network)
- MAN (Metropolitan Area Network)
- WAN (Wide Area Network)
- LPWAN (Low-Power Wide Area Network)
(slide) Zjednodušene sa proste môžeme na dosah takto:
- short range (< 10m) - nositeľná elektronika (PAN)
- local area (< 100m) - domácnosť (LAN)
- wide area (km) - celý zvyšok sveta (MAN, WAN, LPWAN)
Data Rate
- V závislosti od charakteristiky prenášaných údajov nás môže zaujímať aj otázka max. množstva prenášaných dát. V tejto kategórii samozrejme dominujú technológie pre prenos dát v LAN sieťach (WiFi) a vo WAN sieťach (LTE, 2G, 3G, 4G).
Communication Protocols
(slide) V prípade technológií komunikujúcich v prostredí IP sietí nás bude zaujímať aj výber komunikačného protokolu, pomocou ktorého budú veci komunikovať buď so zariadeniami vyšších vrstviet (napr. posielať údaje zo senzorov) alebo medzi sebou navzájom.
Ako je možné vidieť, tak tieto protokoly pracujú na aplikačnej vrstve ISO/OSI modelu. Medzi tie najznámejšie a najpopulárnejšie protokoly patria:
- HTTP
- MQTT
- CoAP
- XMPP
- LwM2M
Upozornenie
Dá sa stretnúť s článkami, kde sa termíny komunikačné protokoly a komunikačné technológie zamieňajú, resp. sú synonymom jednen pre druhého. Je treba si uvedomiť, že špeciálna technológia si vyžaduje aj pre ňu špeciálny komunikačný protokol, ktorý sa obyčajne vymeniť nedá (len nová technológia za novú technológiu). Preto komunikačným protokolom budeme chápať výlučne tým, ktoré pracujú na aplikačnej vrstve 7 vrstvového ISO/OSI modelu.
(slide) My sa budeme venovať konkrétne len protokolom HTTP a MQTT.
Práca so sieťou na doske Raspberry Pi Pico W/H
(slide) Ako sme sa rozprávali, mikrokontrolér ESP32 je vybavený WiFi modulom s podporou štandardu 802.11 b/g/n a so štandardnou podporou bezpečnostných vlastností IEEE 802.11 ako sú WFA, WPA/WPA2_ a WAPI.
Mikrokontrolér vie dokonca pracovať ako Access Point. Tým pádom môže poskytovať pre ostatné zariadenia v sieti rozličné služby. Napríklad môže slúžiť ako webový server, ktorý bude poskytovať webové používateľské rozhranie pre ovládanie pripojených akčných členov alebo môže poskytovať len stavovú stránku s informáciami zozbieranými z pripojených senzorov.
The network
Module
(slide Pre prácu so sieťou má ESP32 k dispozícii modul
network
. Pred začiatkom práce ho teda importneme:>>> import network
Následne vytvoríme WiFi sieťové rozhranie, ktoré bude pracovať v režime pracovnej stanice (z angl. station interface) a aktivujeme ho:
>>> wlan = network.WLAN(network.STA_IF) >>> wlan.active(True)
Následne sa môžeme pozrieť, aké bezdrôtové siete máme v dosahu:
>>> wlan.scan()
Výsledkom bude zoznam sietí s informáciami ako:
- SSID siete
- MAC adresa rozhrania
- sila signálu
- číslo kanála
Ak sa teda chceme k niektorej z nich pripojiť, potrebujem poznať SSID siete a heslo pre prístup k nej. Samotné pripojenie vykonáme pomocou volania metódy
.connect()
nad objektomwlan
:>>> wlan.connect('SSID', 'password')
Po (ne)úspešnom pripojení môžeme overiť stav pripojenia volaním metódy
.isconnected()
, ktorá vráti hodnotuTrue
, ak sme sa úspešne pripojili alebo hodnotuFalse
, ak nie. Nastavenie pripojenia vieme overiť volaním metódy.ifconfig()
:>>> wlan.isconnected() True >>> wlan.ifconfig() '192.168.1.128', '255.255.255.0', '192.168.1.1', '192.168.1.1') (
Len pre úplnosť je možné dodať, že MAC adresu zariadenia môžeme získať takto:
>>> wlan.config('mac') b'`\x01\x94\x1b\xf7\xb1'
Od tohto momentu je mikrokontrolér pripojený a môžeme s ním vykonávať sieťové operácie.
Poznámka
Spomínal som, že je možné mikrokontrolér ESP32 použiť aj v režime Access Point-u. To je možné zabezpečiť napríklad týmto fragmentom kódu:
# create access-point interface
= network.WLAN(network.AP_IF)
ap
# set the ESSID of the access point
='ESP-AP')
ap.config(essid
# set how many clients can connect to the network
=10)
ap.config(max_clients
# activate the interface
True) ap.active(
Pripojenie k WiFi
Pripojiť sa k sieti je vhodné počas štartu zariadenia, resp. vzhľadom na šetrenie spotreby sa jemožné pripájať k sieti podľa potreby - napríklad v pravidelných intervaloch niekoľkokrát do dňa. Za tým účelom je možné použiť napr. túto funkciu:
def do_connect(ssid, password): import network = network.WLAN(network.STA_IF) wlan True) wlan.active(if not wlan.isconnected(): print('connecting to network...') connect(ssid, password) wlan.while not wlan.isconnected(): pass print('network config:', wlan.ifconfig())
MQTT Protokol
(slide)
Komunikačný protokol MQTT patrí medzi najčastejšie používané komunikačné protokoly vo svete IoT. Je veľmi jednoduchý binárny protokol, ktorý sa vyznačuje malou veľkosťou prenášaných paketov, napr. v porovnaní s protokolom HTTP. Rovnako je protokol veľmi jednoducho implementovateľný na strane klienta. Pri jeho vývoji bol kladený veľký dôraz na jednoduchosť použitia, vďaka čomu sa hodí aj na zariadenia s obmedzenými zdrojmi, akými sú napríklad mikorkontroléry. [MQTT 3.1.1 specification]
Vznik protokolu
The MQTT protocol was invented in 1999 by Andy Stanford-Clark (IBM) and Arlen Nipper (Arcom, now Cirrus Link). They needed a protocol for minimal battery loss and minimal bandwidth to connect with oil pipelines via satellite. The two inventors specified several requirements for the future protocol:
- Simple implementation
- Quality of Service data delivery
- Lightweight and bandwidth efficient
- Data agnostic
- Continuous session awareness
These goals are still at the core of MQTT. However, the primary focus of the protocol has changed from proprietary embedded systems to open Internet of Things (IoT) use cases. This shift in focus has created a lot of confusion about what the acronym MQTT stands for. The short answer is that MQTT is no longer considered an acronym. MQTT is simply the name of the protocol.
Návrhový vzor Publish-Subscribe
The publish/subscribe pattern (also known as pub/sub) provides an alternative to a traditional client-server architecture. In the client-server model, a client communicates directly with an endpoint. The pub/sub model decouples the client that sends a message (the publisher) from the client or clients that receive the messages (the subscribers). The publishers and subscribers never contact each other directly. In fact, they are not even aware that the other exists. The connection between them is handled by a third component (the broker). The job of the broker is to filter all incoming messages and distribute them correctly to subscribers.
Poslanie správy
Posielať správy je možné okamžite, ako sa klient pripojí k broker-ovi. Každá správa musí obsahovať
- tému (z angl. topic), vďaka ktorej bude broker vedieť správu poslať všetkým zainteresovaným klientom, a ** údaje (z angl. payload), ktoré reprezentujú samotné prenášané údaje.
Pri posielaní je možné okrem témy a samotných údajov pridať aj niekoľko ďalších atribútov. Pozrieme sa na ne podrobnejšie:
topic name
- pravidla pre topiky
retain flag
payload
packet id
qos
- At most once (QoS 0)
- At least once (QoS 1)
- Exactly once (QoS 2)
DUP flag
Ako organizovať témy
Wildcards
Témy začínajúce znakom
$
Posledná vôľa
- This message notifies other clients when a client disconnects ungracefully.
MQTT and ESP32
(slide)
k dispozícii máme balík
umqtt
, ktorý je potrebné importnúť:from umqtt.robust import MQTTClient
vytvorenie objektu
MQTTClient
, resp. prihlásenie sa k MQTT brokerovi:= MQTTClient('client-id', 'broker-ip', port) client connect() client.
Sending Data to MQTT Broker
Následne môžeme správu odoslať pomocou metódy
.publish()
:'messages', 'hello world') client.publish(
Rozprávali sme sa o tom, že nepotrebujeme sa nutne pripájať často, resp. v tomto prípade byť pripojení neustále. V závislosti od použitia sa pripájať stačí napr. len pri odosielaní údajov. Kód teda môže vyzerať nasledovne:
connect() client.'messages', 'hello world') client.publish( client.disconnect()
Receiving Data from MQTT Broker
Ak chceme údaje prijímať, musíme vytvoriť callback, ktorý bude objekt
MQTTClient
volať, keď správu dostane:def on_message(topic, message): = 'Message "{}" received in topic "{}"' text print(text.format(topic, message))
Callback sa potom nastaví objektu
MQTTClient
pomocou volania metódy.set_callback()
:= MQTTClient('client-id', 'broker-ip', port) client client.set_callback(on_message)
Dôležité je, aby ste svojho klienta nezabudli prihlásiť do príslušnej témy (topic). To je však možné až potom, keď je klient pripojený k MQTT brokerovi:
connect() client.'topic') client.subscribe(
Následne sa môže začať vykonávať hlavná slučka našej veci. Poprípade môžeme explicitne volať metódu
.wait_msg()
, ak vyslovene čakáme na prijatie správy, čím sa zablokuje akékoveľvek ďalšie vykonávanie. Toto volanie je totiž blokujúce:print('Waiting for message...') # blocking call client.wait_msg()
Poznámka
Ak potrebujeme v hlavnej slučke vykonávať ešte ďalšiu prácu, neblokujúce volanie zabezpečíme volaním metódy
.check_msg()
:client.check_msg()