Internet of Things (IoT) este definit ca o colecție de noduri (things) care pot aduna informații din mediul în care se află, pot trimite aceste informații către o locație remote/locală și pot face anumite acțiuni.
Nodurile acestea sunt de obicei alimentate de la baterie, cu putere de procesare, memorie și lățime de bandă reduse. Nodurile sunt în general dispozitive embedded, identificate în mod unic, și conectate la Internet.
În acest laborator, vom utiliza două protocoale de comunicație frecvent utilizate în IoT.
CoAP (Constrained Application Protocol) este un protocol de comunicare conceput pentru utilizarea în medii cu resurse limitate, în special în contextul IoT. Este folosit pe dispozitive cu resurse reduse (energie, memorie, lățime de bandă), și în rețelele cu pierderi de pachete.
CoAP funcționează peste UDP/IP și oferă un model simplu de interacțiune bazat pe cerere/răspuns, similar cu HTTP, ceea ce îl face potrivit pentru dispozitivele cu resurse limitate.
CoAP suportă cele 4 metode standard din HTTP, mai exact GET, POST, PUT și DELETE, care au aceeași semnificație cu cele din HTTP. De obicei nodul senzorial joacă rolul de server CoAP.
Există o multitudine de implementări software ale protocolului CoAP (Implementări), dar în acest laborator vom utiliza biblioteca CoAP-simple-library pentru Arduino IDE pentru a rula un server CoAP și implementarea Python CoAPthon pentru a rula un client CoAP.
O captură Wireshark arată cum rulează protocolul CoAP peste protocolul UDP:
MQTT (Message Queuing Telemetry Transport) este un protocol de comunicare eficient din punct de vedere al consumului de energie și fiabil. A fost dezvoltat pentru a facilita schimbul de mesaje între dispozitive cu resurse limitate, conectate în rețele cu lățime de bandă redusă, fiind ideal pentru IoT.
MQTT este un protocol pentru transportul mesajelor de la un producător (publisher) la un consumator (subscriber). Spre deosebire de CoAP, care are o arhitectură client-server, MQTT folosește un intermediar (broker) pentru a livra mesajele de la producător la consumator.
MQTT funcționează pe baza conceptului de topic-uri. Un topic este un identificator unic care definește un subiect de interes (ex. temperatura).
Un dispozitiv care dorește să publice un mesaj se conectează la un broker MQTT. Brokerul este un server care intermediază comunicarea dintre clienții care publică și clienții care se abonează la mesaje.
Când un client publică un mesaj, acesta specifică topicul mesajului. Brokerul transmite apoi mesajul tuturor clienților abonați la acel topic.
Un client care dorește să se aboneze la mesaje se conectează la broker și specifică topicurile la care dorește să se aboneze. Când brokerul primește un mesaj pentru un topic la care un client este abonat, acesta transmite mesajul clientului.
În această figură avem o comparație vizuală între protocoalele CoAP și MQTT. La MQTT avem un singur broker și mai mulți clienți care pot fi publisheri și/sau subscriberi. La CoAP putem avea mai multe servere care generează date (de obicei nodurile senzoriale) și mai mulți clienți care obțin acele date.
Instalați Arduino IDE și adăugați board-ul ESP32 conform acestui tutorial, dar alegeți tipul board-ului esp32-wrover-kit (all)
pentru Sparrow ESP32.
Dorim să folosim CoAP pentru a stinge și aprinde un LED pe placa ESP32. Pentru asta trebuie ca placa ESP32 să fie configurată ca server CoAP și să răspundă la cererile primite de la clienți CoAP (laptop/dispozitiv mobil).
Descărcați biblioteca CoAP-simple-library, dezarhivați-o și copiați-o în directorul cu biblioteci din Arduino IDE (de obicei în Documents/Arduino/libraries
). Este necesară repornirea Arduino IDE după instalarea unei biblioteci direct în acel director, în loc să utilizați Library Manager.
Deschideți exemplul numit esp32
din biblioteca CoAP_simple_library
și ajustați codul astfel încât LED-ul să fie aprins prin CoAP.
Pe Sparrow v2 (placile albastre), folositi urmatoarele GPIO-uri:
Conectați placa ESP32 la rețeaua WiFi (recomandăm să faceți un hotspot pe dispozitivul mobil, deoarece nu va merge cu rețeaua facultății). Completați în cod SSID-ul și parola rețelei.
Rețineți adresa IP obținută de ESP32 pentru a fi utilizată în clientul CoAP.
CoAP_simple_library
din Arduino IDE, portul este definit în fișierul libraries/CoAP_simple_library/coap-simple.h
#define COAP_DEFAULT_PORT 5683
Instalați pe laptop biblioteca CoAPthon3
din Python 3 folosind utilitarul pip
:
python3 -mpip install CoAPthon3
CoAPthon
este pentru Python 2 (nu se mai folosește).
Folosiți următoarea comandă pentru a aprinde și stinge LED-ul:
# pe sistemele *nix, pip a instalat coapclient.py în PATH coapclient.py -o PUT -p "coap://192.168.1.151/light" -P "1"
Dorim să controlăm LED-ul plăcii ESP32 prin protocolul MQTT. Placa ESP32 va avea rol de subscriber pe un anumit topic, iar laptopul va avea rol de publisher pe același topic. Astfel, prin mesajul MQTT trimis de la laptop vom aprinde și vom stinge LED-ul plăcii.
Instalați biblioteca PubSubClient
din Library Manager al Arduino IDE și deschideți exemplul mqtt_esp8266
.
Deși este scris pentru ESP8266, puteți rula programul pe ESP32 prin modificarea următoarei linii:
- #include <ESP8266WiFi.h> + #include <WiFi.h>
Placa ESP32 va folosi clientul MQTT pentru a se înregistra ca subscriber la topic-ul inTopic
și pe laptop vom instala biblioteca paho-mqtt
pentru a instanția un client MQTT în modul publisher. Pentru a instala paho-mqtt
, utilizați următoarea comandă:
pip install paho-mqtt
Folosiți acest program Python pentru a aprinde și stinge LED-ul pe placa ESP32.
Veți utiliza broker-ul MQTT public de la adresa „test.mosquitto.org”, atât pentru clientul MQTT al ESP32, cât și pentru clientul Python. Din acest motiv, este important să schimbați numele topicului pentru a nu primi mesaje de la alte dispozitive din Internet care utilizează același server public.