This shows you the differences between two versions of the page.
si:laboratoare:11 [2024/01/06 00:14] laura.ruse |
si:laboratoare:11 [2024/12/15 17:36] (current) andreea.miu [Exercitii] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Laboratorul 11. Servicii IoT ====== | + | ===== Laboratorul 11. NuttX - 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 |}} |
- | ToDo: poza | + | 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 luminoasa, vom folosi suportul oferit de aplicatia MQTT din NuttX. | + | * Pentru a compila aplicatia, revizuiti [[si:laboratoare/01|Laboratorul 01]]. Va trebui sa descarcati toolchain-ul, repository-urile //nuttx// si //nuttx-apps//, tabela de partitii si bootloader-ul. |
- | Folositi "make menuconfig" pentru a activa aplicatia MQTT. | + | <note important> |
+ | Vom folosi o versiune diferita a 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> |
- | ToDo: explicat 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 telefon, pentru 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 | ||
- | === 3. Server 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. |
- | ToDo: poza? | + | * 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> | ||
- | ToDo: poza | + | * 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]] |