This shows you the differences between two versions of the page.
si:iot2025:lab03 [2025/08/10 13:02] robert_ionut.alexa |
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. | + | Î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 ==== | ==== Wi-Fi ==== | ||
Line 16: | Line 16: | ||
</note> | </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). Cu toate acestea, | + | Î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: | Pentru a putea conecta smartwatch-ul la o rețea Wi-Fi existentă identificată prin <myssid>:<mypasswd>, se pot folosi comenzile de mai jos: | ||
Line 34: | Line 34: | ||
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''. | 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]] | 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]] | ||
Line 50: | Line 63: | ||
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). | 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. | 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. | ||
Line 66: | Line 81: | ||
In cadrul GATT exista si posibilitatea definirii propriului serviciu, insa acest lucru face o aplicatie mai putin portabila, nefiind ceva standardizat de BLuetooth SIG. | 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 ===== | ===== 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. | **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. | + | * 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. | * 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. | * Va trebui sa rulati ''ifconfig'' pentru a determina numele interfetei de BLE, iar mai apoi ''ifdown <interfata>'' pentru a o opri. | ||
Line 81: | Line 100: | ||
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''. | 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> | </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''. |