This shows you the differences between two versions of the page.
|
si:laboratoare:03 [2023/10/18 14:46] laura.ruse [Exercitii] |
— (current) | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Laboratorul 03. NuttX - Wi-Fi, Bootloader ===== | ||
| - | |||
| - | In laboratorul de astazi vom configura placa Esp32 sa acceseze internetul prin intermediul Wi-Fi-ului (denumit station mode), iar mai apoi vom conecta laptopul la Esp32 (care va rula intr-o configuratie denumita SoftAP) pentru a avea conectivitate la internet. | ||
| - | |||
| - | In final, vor fi prezentate cateva notiuni despre procesul de boot de pe Esp32. | ||
| - | |||
| - | ==== Wi-Fi ==== | ||
| - | |||
| - | Placile Esp32 incorporeaza un modul RF (Radio Frequency) prin intermediul caruia dispun de Wi-Fi, Bluetooth si BLE (Bluetooth Low Energy). Deoarece toate cele trei tehnologii functioneaza la frecventa de 2.4GHz, nu putem sa primim si sa trimitem date in acelasi timp si pe Wi-Fi si prin Bluetooth. Pentru a fi posibil acest lucru, se foloseste time-division multiplexing. | ||
| - | |||
| - | In comunicatia prin Wi-Fi, un device poate sa aiba unul dintre rolurile de mai jos: | ||
| - | |||
| - | * Router - defineste o noua retea. | ||
| - | * Access Point - un device care face parte dintr-o retea, se conecteaza la router, dar este folosit pentru a crea subretele. | ||
| - | * Station - un simplu device conectat in retea. | ||
| - | |||
| - | <note tip> | ||
| - | Un smartphone poate functiona ca un access point atunci cand este configurat hotspot-ul. | ||
| - | </note> | ||
| - | |||
| - | In NuttX, Esp32 poate rula atat ca un station, cat si cat un access point (software access point - SoftAP - deoarece managementul comunicatiei se intampla in cadrul sistemului de operare, nu in hardware). Configuratiile precum ''esp32-wrover-kit:wifi'' permit placii sa functioneze doar ca un station, dar exista si ''esp32-devkitc:sta_softap'', de exemplu, care ofera suport atat pentru station cat si pentru SoftAP. | ||
| - | |||
| - | Pentru a putea conecta Esp32 la o retea Wi-Fi existenta identificata 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 reteaua trebuie sa il indeplineasca, precum si algoritmul de criptare - in cazul de fata, se foloseste WPA2 si algoritmul CCMP. In total, exista patru niveluri de securitate, iar in NuttX sunt suportate doar ultimele trei: | ||
| - | |||
| - | * WEP | ||
| - | * WPA | ||
| - | * WPA2 (WPA2-PSK) | ||
| - | * WPA3 (WPA3-AES) | ||
| - | |||
| - | Deoarece ''wapi essid'' doar seteaza intern numele retelei, pentru conectarea efectiva la retea si obtinerea unei adrese IP este nevoie de o comanda explicita - ''renew wlan0''. | ||
| - | |||
| - | Pentru a putea configura Esp32 sa ruleze ca un SoftAP (prin a doua interfata de retea disponibila - wlan1), e nevoie de un set asemanator de comenzi: | ||
| - | |||
| - | <code> | ||
| - | ifup wlan1 | ||
| - | dhcpd_start wlan1 | ||
| - | wapi psk wlan1 <mypasswd> 3 | ||
| - | wapi essid wlan1 nuttxapp 1 | ||
| - | </code> | ||
| - | |||
| - | Astfel, se creeaza reteaua ''nuttxapp'', protejata tot prin WPA2 si CCMP, avand parola <mypasswd>. Prin ''dhcpd_start'' se porneste daemon-ul ''dhcpd'' care va rula un server de DHCP si va asigna un IP tuturor device-urile conectate. | ||
| - | |||
| - | O descriere mai detaliata a API-ului expus prin WAPI (de exemplu, ''wapi show wlan0''), precum si cum te poti conecta la o retea nesecurizata (open network), poate fi consultata [[https://nuttx.apache.org/docs/latest/applications/wapi/index.html|aici]]. | ||
| - | |||
| - | De asemenea, o alta comanda utila pentru a investiga starea interfetelor de retea este ''ifconfig'', asemanatoarea cu cea din Linux. | ||
| - | |||
| - | ==== Bootloader ==== | ||
| - | |||
| - | {{ :si:laboratoare:nuttx_bootloader.png?600 |}} | ||
| - | |||
| - | Esp32 foloseste doua bootloadere intr-un proces denumit multi-stage boot: | ||
| - | |||
| - | * First-stage bootloader se afla in memoria ROM si este primul cod care se executa la un reset de placa. Are rolul de a initializa accesul la memoria flash externa CPU-ului si de a stoca datele venite pe UART in cazul in care flash-uim placa. | ||
| - | * Second-stage bootloader preia controlul de la first-stage bootloader, citeste tabela de partitii si incepe sa ruleze executabilul de NuttX. | ||
| - | |||
| - | Tabela de partitii defineste, in mod implicit, doua tipuri de partitii: | ||
| - | |||
| - | * app - partitie care contine cod executabil. | ||
| - | * data - partitie care contine date. | ||
| - | |||
| - | Cu ajutorul partitiei ''otadata'' se implementeaza procedeul denumit OTA - Over-the-air update. Atunci cand second-stage bootloader-ul citeste tabela de partitii, cauta otadata si, bazandu-se pe continutul acesteia, incepe executia partitiei ''ota_1'' sau ''ota_2''. Astfel, presupunand ca sistemul foloseste ''ota_1'', in cazul in care vrem sa reflash-uim placa putem sa incarcam noul binar in ''ota_2'', iar mai apoi doar sa dam un reset. In cazul in care partitia otadata nu exista sau nu este initializata, bootloader-ul foloseste partitia ''factory'' implicita de la adresa 0x10000. | ||
| - | |||
| - | <note important> | ||
| - | In functie de nevoile aplicatiei, este posibil sa incarcam executabilul direct la adresa 0x1000 in locul bootloader-ului pentru a fi executat direct de first-stage bootloader. | ||
| - | </note> | ||
| - | |||
| - | ==== Exercitii ==== | ||
| - | |||
| - | Pentru a putea rula exercitiile, este nevoie sa compilati NuttX folosind ''esp32-devkitc:sta_softap'', la care va trebui sa activati manual alte cateva config-uri: | ||
| - | |||
| - | * CONFIG_NET_ROUTE=y | ||
| - | * CONFIG_NET_IPFORWARD=y | ||
| - | * CONFIG_NET_NAT=y | ||
| - | * CONFIG_SYSTEM_IPTABLES=y | ||
| - | |||
| - | **1.** Conectati Esp32-ul la reteaua facultatii si testati cu ''ping 8.8.8.8'' ca aveti acces la internet. Folositi interfata ''wlan0''. | ||
| - | |||
| - | <note important> | ||
| - | NuttX nu trateaza in mod implicit semnalul SIGINT, iar in urma rularii ping-ului vi se va bloca consola de nsh. Puteti evita aceasta problema prin activarea CONFIG_TTY_SIGINT. | ||
| - | </note> | ||
| - | |||
| - | Rulati comanda ''route'' si inspectati output-ul acesteia. Va fi relevant la exercitiul 3. | ||
| - | |||
| - | **2.** Configurati placa sa ruleze in modul SoftAP si conectati-va cu laptopul la retea pentru a testa. Folositi interfata ''wlan1''. Rulati din nou comanda ''route'' si observati cum s-a modfiicat tabela de routare. | ||
| - | |||
| - | **3.** In urma exercitiului 2, laptopul este conectat la Esp32, dar nu are acces la internet. Puteti testa acest lucru din CMD/terminal folosind ''ping 8.8.8.8''. Mai departe, urmariti pasii de mai jos: | ||
| - | |||
| - | - De pe Esp32 mai rulati o data comanda ''ping 8.8.8.8''. Observati ca nu aveti acces la internet. Configurarea wlan1 ca SoftAP a stricat tabela de routare, asa cum se poate observa din output-ul comenzii ''route''. | ||
| - | - Setati regula implicita de routare folosind comanda ''addroute default 192.168.0.1 wlan0''. Esp32 este conectat din nou la internet, puteti testati folosind ''ping''. | ||
| - | - Ultimul pas implica adaugarea unei reguli in iptables pentru a aplica NAT pe fiecare pachet routat de Esp32: ''iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE''. | ||
| - | - Testati de pe laptopul personal folosind ping, iar din browser conectati-va la ''www.google.com''. | ||
| - | |||
| - | ==== Resurse ==== | ||
| - | * [[https://nuttx.apache.org/docs/latest/applications/wapi/index.html| WAPI (Wireless API)]] | ||
| - | * [[https://www.lucadentella.it/en/2016/12/22/esp32-4-flash-bootloader-e-freertos/| Esp32 Bootloader]] | ||
| - | * [[https://eadalabs.com/esp32-nuttx-and-bridged-networking/|Esp32, NuttX and bridged networking]] | ||