Differences

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

Link to this comparison view

si:iot2025:lab03 [2025/08/10 10:41]
robert_ionut.alexa created
si:iot2025:lab03 [2025/08/10 16:15] (current)
robert_ionut.alexa
Line 1: Line 1:
 ===== Laboratorul 03. Wi-Fi, NimBLE ===== ===== Laboratorul 03. Wi-Fi, NimBLE =====
 +
 +În laboratorul de astăzi vom configura smartwatch-ul Hacktorwatch să acceseze internetul prin intermediul Wi-Fi-ului (denumit station mode), iar prin NimBLE (o biblioteca care implementeaza BLE - Bluetooth Low Energy) vom trimite date si alerte legat de starea bateriei catre smartphone, iar in final vom configura ceasul sa functioneze ca un mini-router la care ne vom conecta laptopul.
 +
 +==== Wi-Fi ====
 +
 +Plăcile ESP32 încorporează un modul RF (Radio Frequency) prin intermediul căruia dispun de Wi-Fi, Bluetooth și BLE (Bluetooth Low Energy). Deoarece toate cele trei tehnologii funcționează la frecvența de 2.4GHz, nu putem să primim și să trimitem date în același timp și pe Wi-Fi și prin Bluetooth. Pentru a fi posibil acest lucru, se folosește time-division multiplexing,​ insa momentan acest feature nu este integrat in NuttX.
 +
 +În comunicația prin Wi-Fi, un device poate să aibă unul dintre rolurile de mai jos:
 +  * Router - definește o nouă rețea.
 +  * Access Point - un device care face parte dintr-o rețea, se conectează la router, dar este folosit pentru a crea subrețele.
 +  * Station - un simplu device conectat în rețea.
 +
 +<note tip>
 +Un smartphone funcționeaza ca un access point atunci când este configurat hotspot-ul.
 +</​note>​
 +
 +În NuttX, ESP32-ul poate rula atât ca un station, cât și ca un access point (software access point - SoftAP - deoarece managementul comunicației se întâmplă în cadrul sistemului de operare, nu în hardware).
 +
 +Pentru a putea conecta smartwatch-ul la o rețea Wi-Fi existentă identificată prin <​myssid>:<​mypasswd>,​ se pot folosi comenzile de mai jos:
 +
 +<​code>​
 +ifup wlan0
 +wapi psk wlan0 <​mypasswd>​ 3
 +wapi essid wlan0 <​myssid>​ 1
 +renew wlan0
 +</​code>​
 +
 +''​wapi psk''​ este folosit pentru a specifica nivelul de securitate minim pe care rețeaua trebuie să îl îndeplinească,​ precum și algoritmul de criptare - în cazul de față, se folosește WPA2 și algoritmul CCMP. În total, există patru niveluri de securitate, iar în NuttX sunt suportate doar ultimele trei:
 +  * WEP
 +  * WPA
 +  * WPA2 (WPA2-PSK)
 +  * WPA3 (WPA3-AES)
 +
 +Deoarece wapi essid doar setează intern numele rețelei, pentru conectarea efectivă la rețea și obținerea unei adrese IP este nevoie de o comandă explicită - ''​renew wlan0''​.
 +
 +Pentru a putea configura ESP32 să ruleze ca un SoftAP (prin a doua interfață de rețea disponibilă - ''​wlan1''​),​ e nevoie de un set asemănător de comenzi:
 +
 +<​code>​
 +ifup wlan1
 +dhcpd_start wlan1
 +wapi psk wlan1 <​mypasswd>​ 3
 +wapi essid wlan1 nuttxapp 1
 +</​code>​
 +
 +Astfel, se creează rețeaua ''​nuttxapp'',​ protejată tot prin WPA2 si CCMP, având parola <​mypasswd>​. Prin ''​dhcpd_start''​ se pornește daemon-ul ''​dhcpd''​ care va rula un server de DHCP și va asigna un IP tuturor device-urile conectate.
 +
 +De asemenea, o altă comandă utilă pentru a investiga starea interfețelor de rețea este ''​ifconfig'',​ asemănătoare cu cea din Linux.
 +
 +O descriere mai detaliată a API-ului expus prin WAPI (de exemplu, ''​wapi show wlan0''​),​ precum și cum te poți conecta la o rețea nesecurizată (denumita open network), poate fi consultată [[https://​nuttx.incubator.apache.org/​docs/​12.3.0/​applications/​wapi/​index.html|aici]]
 +
 +==== BLE ====
 +
 +Bluetooth Low Energy (BLE) este o varianta optimizata a tehnologiei clasice de Bluetooth pretabila microcontrollerelor care ruleaza pe baterie datorita consumului redus de energie. Din aceasta cauza, un dezavantaj este latimea de banda scazuta (nu se pot trimite multe date), iar distanta este mai scazuta decat in cazul Bluetooth-ului clasic. Consumul redus de energie provine din faptul ca, prin BLE, device-ul se gaseste majoritar in starea de sleep.
 +
 +In lumea BLE, comunicarea dintre doua dispozitive este impartita pe doua niveluri denumite profile:
 +  - GAP (Generic Access Profile) - defineste rolul fiecarui dispozitiv si cum doua dispozitive se pot conectata (advertising,​ scanning, etc).
 +  - GATT (Generic Attribute Profile) - defineste un mod ierarhic prin care datele sunt transmise intre doua dispozitive odata ce a fost stabilita o conexiune, asemanator unui pachet de retea cu mai multe protocoale din stiva TCP/IP.
 +
 +Din punct de vedere al arhitecturii de retea, in BLE exista doua tipuri principale de dispozitive,​ definite de asemenea de profilul GAP:
 +  * BLE peripheral - trimite periodic mesaje de advertisement pentru a anunta ca este "​disponibil",​ insa nu initiaza conexiuni.
 +  * BLE central - scaneaza reteaua si initializeaza conexiunile.
 +
 +De cele mai multe ori, un smartphone este BLE central, iar smartwatch-urile sunt BLE peripherals,​ insa nu este obligatoriu. In realitate, smartwatch-urile moderne se pot conecta la diverse accesorii de la care pot citi date (de exemplu, smartwatch-urile Garmin se pot conecta la anumite heart rate monitors pentru a masura pulsul cat mai exact).
 +
 +Pe de alta parte, GATT defineste rolurile de Server - Client pentru dispozitivele conectate prin BLE. Intr-o arhitectura de tipul smartphone - smartwatch, smartphone-ul este BLE central dar in acelasi timp este si client, deoarece citeste datele de pe smartwatch.
 +
 +Asa cum am explicat deja, GATT ofera o modalitate ierarhica de a propaga datele prin impartirea acestora in servicii (categorii de date) si caracteristici (date efective). Atat serviciile, cat si caracteristicile sunt identificabile printr-un UUID unic, care este un numar pe 128 de octeti.
 +
 +{{ :​si:​iot2025:​gatt-ble-esp32.png?​600 }}
 +
 +De exemplu, un device care monitorizeaza conditiile de mediu poate folosi un singur serviciu cu trei caracteristici:​ temperatura,​ umidate, presiune.
 +
 +In functie de complexitatea aplicatiei si a datelor transmise, in cadrul comunicatiei peste BLE pot fi folosite mai multe servicii. Bluetooth Special Interest Group (SIG) a definit o lista de servicii pentru a oferi o modalitate standardizata prin care atat sender-ul cat si receiver-ul sa poata interpreta datele. In laboratorul de astazi vom folosi doua servicii:
 +  * Battery Service - pentru a propaga date despre starea bateriei dispozitivului.
 +  * Alert Notification Service - pentru a trimite alerte atunci cand bateria dispozitivului ajunge la 100%.
 +
 +Mai jos, aveti o lista a celor mai importante servicii definite de Blueooth SIG. O lista completa poate fi accesata [[https://​www.bluetooth.com/​specifications/​assigned-numbers/​|aici]].
 +
 +{{ :​si:​iot2025:​gatt-services.png?​600 }}
 +
 +In cadrul GATT exista si posibilitatea definirii propriului serviciu, insa acest lucru face o aplicatie mai putin portabila, nefiind ceva standardizat de BLuetooth SIG.
 +
 +=== NimBLE ===
 +
 +Pentru a implementa BLE, NuttX se foloseste de NimBLE care este o implementare open-source a stivei de BLE (BLE stack) oferita de Apache in detrimentul dezvoltarii propriei stive.
 +
 +===== Exercitii =====
 +
 +**1.** Conectați smartwatch-ul la rețeaua facultății și testați cu ''​ping 8.8.8.8''​ că aveți acces la internet.
 +  * Dupa ce ati configurat ceasul folosind comenzile din laborator, incercati ''​ping 8.8.8.8''​. Observati ca nu se trimite niciun pachet. In unele cazuri este posibil chiar ca unele din comenzi sa va returneze eroare.
 +  * Asa cum am precizat anterior, NuttX nu ofera support pentru time division multiplexing intre BLE si Wi-Fi, iar build-urile noastre sunt configurate sa foloseasca in mod implicit interfata de BLE.
 +  * Va trebui sa rulati ''​ifconfig''​ pentru a determina numele interfetei de BLE, iar mai apoi ''​ifdown <​interfata>''​ pentru a o opri.
 +
 +<note tip>
 +În cazul în care nu reușiți să vă conectați la rețeaua facultății,​ puteți folosi hotspot-ul de pe telefonul mobil. Acest lucru vă va permite să testați atăt conectarea la o rețea nesecurizată,​ căt și la una securizată (prin WPA2).
 +</​note>​
 +
 +<note important>​
 +NuttX nu tratează în mod implicit semnalul SIGINT, iar în urma rulării ping-ului vi se va bloca consola de nsh. Puteți evita această problemă prin activarea CONFIG_TTY_SIGINT sau configurand un numar fix de pachete de ICMP pe care ping-ul sa le trimita folosind ''​ping -c''​.
 +</​note>​
 +
 +**2.** In cadrul acestui exercitiu vrem sa transmitem smartphone-ului date si alerte despre starea bateriei folosind aplicatia demo ''​nimble''​ din nuttx-apps.
 +  - Activati compilarea acestei aplicatii folosind CONFIG_EXAMPLES_NIMBLE. Rulati si inspectati codul. Starea bateriei este simulata si este deja trimisa catre smartphone.
 +  - Instalati **nRF connect** pe smartphone-uri. Conectati smartphone-ul la smartwatch prin intermediul acesteia si cititi datele despre baterie.
 +  - Pentru a putea folosi serivicul Alert Notification Service, este nevoie sa configuram smartphone-ul pentru tipul de alerte pe care vrem sa le primim. In caz contrar, vor fi ignorate. Faceti acest lucru din ''​Alert Notification Service''​ -> ''​Alert Notification Control Point''​ -> selectati ''​0 - Simple Alert''​.
 +  - Alertele vor fi transmise prin ''​ble_svc_ans_new_alert_add''​. Cautati semnatura acesteia pentru a determina cum poate fi folosita. (**Hint**: deoarece vom folosi "​Simple Alert",​ macro-ul pe care trebuie sa il trimiteti functiei este ''​BLE_SVC_ANS_CAT_ID_SIMPLE_ALERT''​).
 +
 +<note tip>
 +Numele device-ului va fi exportat prin ''​g_gap_name''​. Ideal, acesta trebuie modificat pentru a nu va confunda device-ul cu cel al colegilor.
 +</​note>​
 +
 +**3. (Bonus)** Ne dorim sa configuram smartwatch-ul sa functioneze ca un mini-router cu doua interfete:
 +  * ''​wlan0''​ va fi conectata la internet in urma exercitiului 1.
 +  * ''​wlan1''​ va rula un server de dhcp si va accepta cereri de conectarea din partea altor dispozitive (laptopul vostru), iar orice pachet primit pe wlan1 trebuie rutat spre wlan0.
 +
 +Pentru a face asta trebuie sa rulati comenzile din laborator, la care se adauga inca doua comenzi extra:
 +  - Trebuie sa setati regula implicită de rutare folosind comanda ''​addroute default 192.168.0.1 wlan0''​.
 +  - Trebuie sa adaugati o noua regula in iptables pentru a aplica NAT pe fiecare pachet rutat: ''​iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE''​.
si/iot2025/lab03.1754811696.txt.gz · Last modified: 2025/08/10 10:41 by robert_ionut.alexa
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