This shows you the differences between two versions of the page.
si:laboratoare:10 [2024/01/07 14:28] laura.ruse [Laboratorul 10. CoAP & MQTT] |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laboratorul 10. CoAP & MQTT ====== | ||
- | 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 ==== | ||
- | |||
- | CoAP (Constrained Application Protocol) este un protocol de comunicare conceput pentru utilizarea în medii cu resurse limitate, în special în contextul IoT (Internet of Things). 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. | ||
- | * GET pentru a obține date de pe server | ||
- | * POST pentru a scrie o resursă de pe server | ||
- | * PUT pentru a actualiza o resursă de pe server | ||
- | * DELETE pentru a șterge o resursă de pe server | ||
- | |||
- | Există o multitudine de implementări software ale protocolului CoAP ([[https://en.wikipedia.org/wiki/Constrained_Application_Protocol#Implementations|Implementări]]), dar în acest laborator vom utiliza biblioteca [[https://github.com/hirotakaster/CoAP-simple-library|CoAP-simple-library]] pentru Arduino IDE pentru a rula un server CoAP și implementarea Python [[https://github.com/Tanganelli/CoAPthon|CoAPthon]] pentru a rula un client CoAP. | ||
- | |||
- | O captură Wireshark arată cum rulează protocolul CoAP peste protocolul UDP: | ||
- | |||
- | {{:iothings:laboratoare:lab7-coap-capture.png?600|}} | ||
- | ==== MQTT ==== | ||
- | |||
- | 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. | ||
- | |||
- | {{:iothings:laboratoare:lab7-mqtt-flow.png|}} | ||
- | |||
- | ==== CoAP vs. MQTT ==== | ||
- | |||
- | Î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 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. | ||
- | |||
- | {{:si:laboratoare:mqtt_coap.png?800|}} | ||
- | |||
- | |||
- | ==== Exerciții ==== | ||
- | |||
- | Instalați Arduino IDE și adăugați board-ul ESP32 conform acestui [[https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/|tutorial]], dar alegeți tipul board-ului ''esp32-wrover-kit (all)'' pentru Sparrow ESP32. | ||
- | |||
- | === Ex. 1 CoAP === | ||
- | |||
- | 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 și dispozitiv mobil). | ||
- | |||
- | == Ex. 1.1. Serverul CoAP pe ESP32 == | ||
- | |||
- | Descărcați biblioteca [[https://github.com/hirotakaster/CoAP-simple-library|CoAP-simple-library]] ș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. | ||
- | |||
- | {{:iothings:laboratoare:lab7-coap-server-png.png|}} | ||
- | |||
- | Deschideți exemplul numit ''esp32'' din biblioteca ''CoAP_simple_library'' și ajustați codul astfel încât LED-ul să fie aprins prin CoAP. | ||
- | |||
- | <note> | ||
- | Pe placile Sparrow v1 (cele verzi), LED-ul este conectat la urmatoarele GPIO-uri: | ||
- | * GPIO 25 - rosu | ||
- | * GPIO 26 - verde | ||
- | * GPIO 27 - albastru | ||
- | Pe Sparrow v2 (placile albastre), folositi urmatoarele GPIO-uri: | ||
- | * GPIO 13 - verde | ||
- | * GPIO 14 - rosu | ||
- | * GPIO 15 - albastru | ||
- | </note> | ||
- | |||
- | <note important> | ||
- | GPIO-urile la care este conectat LED-ul functioneaza in logica negativa. | ||
- | </note> | ||
- | |||
- | 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. | ||
- | |||
- | <note> | ||
- | Portul implicit definit de CoAP este portul UDP 5683. În biblioteca ''CoAP_simple_library'' din Arduino IDE, portul este definit în fișierul ''libraries/CoAP_simple_library/coap-simple.h'' | ||
- | |||
- | <code> | ||
- | #define COAP_DEFAULT_PORT 5683 | ||
- | </code> | ||
- | </note> | ||
- | |||
- | |||
- | == Ex. 1.2. Clientul CoAP == | ||
- | |||
- | Instalați pe laptop biblioteca ''CoAPthon'' din Python folosind utilitarul ''pip'': | ||
- | |||
- | <code> | ||
- | pip install CoAPthon | ||
- | </code> | ||
- | |||
- | <note important>Dacă folosiți Python3 instalați CoAPthon3</note> | ||
- | |||
- | Folosiți următoarea comandă pentru a aprinde și stinge LED-ul: | ||
- | |||
- | <code> | ||
- | /usr/local/bin/coapclient.py -o PUT -p "coap://192.168.1.151/light" -P "1" | ||
- | </code> | ||
- | |||
- | <note important>Folosiți adresa IP a plăcii ESP32. | ||
- | Laptop-ul și placa ESP32 trebuie să fie conectate în aceeași rețea WiFi. | ||
- | </note> | ||
- | |||
- | <hidden> | ||
- | == Ex. 1.3. Aplicația Android ''IoT CoAP'' == | ||
- | |||
- | <note important> | ||
- | Atentie: Aplicația ''IoT CoAP'' nu mai funcționează pe noile versiuni de Android. | ||
- | </note> | ||
- | |||
- | Descărcați și instalați aplicația ''IoT CoAP'' din Google Play Store. Folosiți aplicația pentru a trimite mesaje către placa ESP32 pentru a aprinde și stinge LED-ul. | ||
- | |||
- | {{:iothings:laboratoare:lab7-iot-coap-app.png|}} | ||
- | |||
- | </hidden> | ||
- | |||
- | === Ex. 2 MQTT === | ||
- | |||
- | 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''. | ||
- | |||
- | {{:iothings:laboratoare:lab7-mqtt-esp8266.png|}} | ||
- | |||
- | Deși este scris pentru ESP8266, puteți rula programul pe ESP32 prin modificarea următoarei linii: | ||
- | |||
- | <code> | ||
- | - #include <ESP8266WiFi.h> | ||
- | + #include <WiFi.h> | ||
- | </code> | ||
- | |||
- | 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ă: | ||
- | |||
- | <code> | ||
- | pip install paho-mqtt | ||
- | </code> | ||
- | |||
- | Folosiți {{:iothings:laboratoare:mypythonmqttclient.py.txt|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. | ||
- | |||
- | <note important> | ||
- | Modificați topic-ul „inTopic” în „si-lab10-myLED-inTopic”, iar topicul „outTopic” în „si-lab10-myTemperature-outTopic”." | ||
- | </note> | ||
- | ===== Resources ===== | ||
- | |||
- | * https://github.com/Tanganelli/CoAPthon | ||
- | * https://github.com/hirotakaster/CoAP-simple-library | ||
- | * https://en.wikipedia.org/wiki/Constrained_Application_Protocol | ||
- | * https://play.google.com/store/apps/details?id=ch.buedev.iot_coap&hl=en&gl=US | ||
- | * https://www.digikey.de/en/maker/blogs/2019/how-to-use-mqtt-with-the-raspberry-pi |