Differences

This shows you the differences between two versions of the page.

Link to this comparison view

si:laboratoare:11 [2024/01/06 00:13]
laura.ruse created
si:laboratoare:11 [2024/12/15 17:36] (current)
andreea.miu [Exercitii]
Line 1: Line 1:
-====== Laboratorul ​10Servicii IoT Services ======+===== Laboratorul ​11NuttX - MQTT =====
  
-==== Despre ​IoT si Servicii ​IoT ====+==== Despre IoT ==== 
 + 
 +**Internet of Things** (IoT, sau “Internetul Lucrurilor”) este domeniul ce studiaza dispozitivele integrate (echipate cu senzori, modul de retea, firmware si software corespunzator etc.) prin prisma conexiunilor dintre acestea si a retelelor pe care le formeaza. 
 + 
 +Dispozitivele IoT au ca scopuri principale colectarea si transmiterea de date, dar si efectuarea unor comenzi simple pe baza informatiilor primite. In viata cotidiana, retelele IoT sunt intalnite intr-o multitudine de spatii (orice spatiu poate deveni un spatiu //​“inteligent”//​),​ cateva exemple fiind: 
 +  * //sistemele de semaforizare inteligenta//,​ in care semafoarele isi schimba culoarea in functie de numarul de masini / pietoni in asteptare;​ 
 +  * //casele si cladirile inteligente//,​ in care putem controla temperatura,​ umiditatea, lumina ambientala etc. prin aplicatii mobile, asistent vocal, etc. 
 +  * //sere inteligente//,​ ce colecteaza date despre aer si sol si ajusteaza temperatura si frecventa de irigare a plantelor 
 + 
 +Fie ca vorbim de senzori sau controllere,​ dispozitivele ce formeaza o retea IoT au resurse hardware limitate. De aceea, este ideal ca modalitatea de comunicare dintre dispozitive sa tina cont de restrictiile de memorie si alimentare. O modalitate eficienta prin care putem optimiza consumul de resurse este delegarea partii de management a datelor trimise, respectiv primite, cu ajutorul unui broker, ce va gestiona datele. 
 + 
 +Aceasta paradigma este cunoscuta sub numele de //​producator / consumator//​ (sau //​“publisher / subscriber”//​),​ si este implementata de multiple protocoale de comunicatie. In acest laborator vom folosi protocolul MQTT pentru a facilita transmisia de date, fiind unul dintre cele mai utilizate protocoale de comunicatie in retelele IoT.
  
-ToDo: scurta introducere in IoT  
-ToDo: servicii IoT, CoAP, MQTT + de vazut lista cu servicii web pe care a facut-o Florin pentru tema 
  
 ==== MQTT ==== ==== MQTT ====
  
-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.+{{ :​si:​laboratoare:​lab11-mqtt-flow.png?600 |}}
  
-ToDopoza+In figura de mai sus putem observa modul de functionare al protocolului MQTT, in cadrul caruia intalnim urmatoarele: 
 +  * **Broker** - este reprezentat de un server si este elementul central al retelei, ce se ocupa de gestionarea datelor din reteaua IoT; 
 +  * **Clienti** - care sunt de 2 tipuri: 
 +    * //​Producatori//​ (sau //​“publisheri”//​) - sunt dispozitivele care publica / trimit date catre broker, precum senzori si butoane 
 +    * //​Consumatori//​ (sau //​“subscriberi”//​) - sunt dispozitivele ce primesc date de la broker, precum afisaje electronice sau aplicatii mobile 
 +Mesajele transmise prin acest protocol sunt organizate folosind “topic”-uri,​ care descriu tipul de date transmise prin retea (de exemplu “temperatura”,​ “umiditate” etc.). Astfel, un client de tip subscriber se poate abona doar la topic-urile de interes pentru acesta, iar un clienti de tip publisher poate publica date pe anumite topic-uri, in functie de datele pe care le poate colecta. 
 + 
 +In cadrul laboratorului,​ vom folosi broker-ul MQTT public de la adresa //​broker.hivemq.com//​.  
 + 
 + 
 +=== MQTT in NuttX === 
 + 
 +Din NuttX, putem publica mesaje prin MQTT folosind aplicatia ''​mqttc_pub'',​ din suita de aplicatii prezente in //​nuttx-apps//​. Dupa cum sugereaza si numele, aplicatia este un MQTT publisher, si are mai multe optiuni legate de publicarea mesajelor, printre care urmatoarele:​ 
 + 
 +  * //-t// - topic-ul pe care se vor publica date (exemplu: //​“temperature”//​) 
 +  * //-m// - mesajul ce va fi publicat (exemplu: //“28 °C”//)
  
 ==== Exercitii ==== ==== Exercitii ====
  
-=== 1. Client MQTT pe ESP32 Sparrow === +**1.** Folosind sistemul de build al NuttX, vom compila aplicatia ''​mqttc_pub''​. Codul sursa a acesteia il puteti gasi in ''​apps/​examples/​mqttc''​.
  
-Pentru ​publicarea datelor precum temeratura ​si intensitatea luminoasavom folosi suportul oferit ​de aplicatia MQTT din NuttX.+  * Pentru ​a compila aplicatia, revizuiti [[si:​laboratoare/​01|Laboratorul 01]]. Va trebui sa descarcati toolchain-ulrepository-urile //nuttx// si //​nuttx-apps//,​ tabela ​de partitii si bootloader-ul.
  
-Folositi "make menuconfig"​ pentru ​activa aplicatia MQTT.+<note important>​ 
 +Vom folosi o versiune diferita ​toolchain-ului. Adaptati comenzile din primul laborator pentru numele acestui toolchain. 
 +<​code>​ 
 +wget https://​github.com/​espressif/​crosstool-NG/​releases/​download/​esp-14.2.0_20240906/​xtensa-esp-elf-14.2.0_20240906-x86_64-linux-gnu.tar.xz 
 +</​code>​
  
-{{:si:laboratoare:​lab-10-menuconfig-mqtt.png?​600|}}+De asemenea, vom clona //​nuttx// ​si //​nuttx-apps//​ folosind urmatoarele comenzi:
  
-Copiati codul din aplicatia BME680 (apps/examples/bme680/bme680_main.c) in aplicatia de MQTT (apps/examples/mqttc/mqttc_pub.c) pentru a publica periodic temperatura si umiditatea catre serverul de MQTT.+<​code>​ 
 +git clone --branch=si-lab-11 https://github.com/​andreeaThePenguin/nuttx.git nuttx --depth 1 
 +git clone --branch=releases/12.7 https://github.com/​andreeaThePenguin/​nuttx-apps.git apps 
 +</​code>​
  
-ToDo: explicat putin cum functioneaza threadul din aplicatia de MQTT.+</​note>​
  
-ToDoexplicat de ce este important ca path-ul de MQTT sa fie unic pentru ​fiecare student ​(utilizator)+  * Pentru a configura NuttX cu suport pentru aplicatia ''​mqttc_pub'',​ vom folosi urmatoarea comanda<​code>​ 
 +./​tools/​configure.sh esp32-sparrow-kit:​mqttc 
 +</​code>​ 
 +  * Compilati NuttX, folositi ''​esptool'' ​pentru ​a sterge continutul memoriei flash a placii, si scrieti imaginea pe aceasta ​(vedeti [[si:​laboratoare/​01|Laboratorul 1]])
 +  * Conectati-va la seriala placii folosind utilitarul picocom: <​code>​ 
 +picocom /​dev/​ttyUSB0 -b 115200 </​code>​ 
 +  * Verificati ca aplicatia e instalata, folosind comanda: ''?'',​ care va afiseaza toate aplicatiile disponibile pe versiunea de NuttX compilata si incarcata anterior.
  
-=== 2. Aplicatia MyMQTT pentru Android ===+**2.** Pentru a putea testa aplicatia, ne dorim sa cream un setup de tipul //​Publisher-Subscriber//​. Pentru aceasta, vom crea un MQTT subscriber care sa primeasca datele trimise de MQTT publisher (reprezentat de placa).
  
-Instalati ​aplicatia MyMQTT ​pe telefonpentru a inregistra un Subscriber ​si a vedea mesajele ​de la ESP32.+  * Instalati ​libraria ''​paho-mqtt'' ​pe masina virtuala: <​code>​ 
 +pip3 install paho-mqtt 
 +</​code>​ 
 +  * Preluati scriptul Python 3 de mai jos, si plasati-l pe masina virtuala; acest script joaca rolul de MQTT subscriber din figura prezentata in laborator. Pregatiti un terminal separat (ideal: pe care sa il puteti vedea in paralel cu primul) din care veti rula la finalul exercitiului acest script.
  
-ToDo: poza cu ESP-ul, telefonul si broker-ul.+<file python mqtt_subscriber.py> 
 +import paho.mqtt.client as mqtt 
 +import ssl
  
-=== 3Server Web ===+broker ​"​broker.hivemq.com"​ 
 +port 1883 
 +topic "​si-labs"​
  
-Pe masina virtuala cu Linux vom rula un server web cu ajutorul aplicatiei Flask si vom inregistra un client ​de MQTT care va prelua datele de la ESP32 si le va afisa in pagina web.+# This is the Subscriber 
 +def on_connect(client,​ userdata, flags, rc, properties):​ 
 +    print("​Connected with result code: " + str(rc)) 
 +    print("​Subscribing to topic: ", topic) 
 +    ​client.subscribe(topic)
  
-<​code>​ +def on_message(client,​ userdata, msg): 
-pip install paho-mqtt +    print("​Received message: ", str(msg.payload.decode("​utf-8"​))) 
-pip install flask+ 
 +client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2) 
 + 
 +client.on_connect = on_connect 
 +client.on_message = on_message 
 + 
 +if port == 8883: 
 +    client.tls_set(tls_version=ssl.PROTOCOL_TLSv1_2) 
 +     
 +client.connect(broker,​ port, 60) 
 + 
 +client.loop_forever() 
 +</​file>​ 
 + 
 +  * Pentru a putea trimite mesaje folosind ESP32, vom conecta placa la WiFi. Puteti folosi orice retea WiFi disponibila (ideal: activati un hotspot cu ajutorul telefonului). Folositi urmatorii pasi pentru a conecta placa la reteaua WiFi: <​code>​ 
 +ifup wlan0 
 +wapi psk wlan0 <​mypasswd>​ 3 
 +wapi essid wlan0 <​myssid>​ 1 
 +renew wlan0
 </​code>​ </​code>​
  
-Testati functionaliatea serverului web trimitand valori incrementale din clientul de MQTT de pe ESP32.+  * In final, veti avea deschise 2 terminale: unul ce ruleaza scriptul Python (MQTT subscriber),​ si altul ce afiseaza seriala placii, ​pe care se afla MQTT publisher-ul. Pentru a publica date, folosim comanda: <​code>​ 
 +mqttc_pub -t si-labs -m <​message>​ 
 +</​code>​ 
 +  * Trimiteti mai multe date modificand topic-ul si valoarea.
  
-=== 4. Bonus Folositi senzorul ​de intensitate luminoasa ===+<note important>​ 
 +Schimbati numele topic-ului atat in scriptul Python, cat si in comanda ​de mai sus (altfel, veti primi si mesajele de la ceilalti colegi). 
 +</​note>​
  
-Copiati codul din aplicatia LTR308 (apps/​examples/​ltr308/​ltr308_main.c) in aplicatia ​de MQTT si afisati in pagina web intensitatea ​luminii.+**3.** Dorim sa trimitem date mai utile catre script-ul nostru ​de Python, pentru a simula un scenariu real de transmisie a datelor. Mai exact, vom prelua date de la senzorul LTR308, ce capteaza ​intensitatea ​luminoasa, apoi vom repeta setup-ul de la exercitiul 2.
  
-ToDopoza?+  * Inspectati exemplul ''​apps/​examples/​ltr308''​ pentru a vedea cum se utilizeaza senzorul LTR308 (optional, puteti sa il si compilati si testati). Pornind de la acest exemplu, veti modifica aplicatia ''​apps/​examples/​mqttc_pub''​. 
 +  * Pentru a modifica aplicatia, vom folosi scheletul prezent pe branch-ul ''​si-lab-11''​ din ''​nuttx-apps''​ repo. Din directorul //apps//, schimbati branch-ul folosind<​code>​ 
 +git checkout si-lab-11 
 +</​code>​
  
-=== 5. Bonus - Controlati LED-ul RGB de pe placa ESP32 direct din pagina web ===+<note tip> 
 +Puteti verifica ca lucrati pe branch-ul corect folosind comanda ''​git branch''​. 
 +</​note>​
  
-ToDopoza+  * Urmati TODO-urile marcate cu **(3)** din ''​apps/​examples/​mqttc_pub''​. 
 +  * Dupa completarea codului, revenim in directorul //nuttx//. Pentru a putea folosi senzorul LTR308, aplicam urmatoarele configuratii la rularea ''​make menuconfig'',​ peste configuratia folosita initial, de ''​mqttc''​: 
 +    * ''​CONFIG_SENSORS=y''​ 
 +    * ''​CONFIG_SENSORS_LTR308=y''​ 
 +  * Compilati NuttX si incarcati-l pe placa. Folosind setup-ul de la exercitiul 2, cu cele 2 terminale deschise in paralel, transmiteti date folosind aplicatia ''​mqttc_pub''​ si captati-le folosind scriptul Python. 
 + <​note important>​ 
 + ​Deoarece mesajul transmis este preluat de la senzor, rulam aplicatia folosim comanda: <​code>​ 
 +mqttc_pub -t si-labs</​code>​ 
 + </​note>​
  
 +==== Resurse ====
 +  * [[https://​nuttx.apache.org/​docs/​latest/​|Documentatia oficiala NuttX]]
 +  * [[https://​robots.net/​tech/​what-is-mqtt-in-iot/​| What is MQTT in IoT?]]
 +  * [[https://​nuttx.apache.org/​docs/​latest/​platforms/​xtensa/​esp32/​boards/​esp32-devkitc/​index.html#​mqttc| ESP32 DevKitC - mqttc]]
si/laboratoare/11.1704492835.txt.gz · Last modified: 2024/01/06 00:13 by laura.ruse
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0