This shows you the differences between two versions of the page.
si:laboratoare:03 [2023/10/15 19:35] laura.ruse created |
si:laboratoare:03 [2024/10/23 20:48] (current) robert_ionut.alexa |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | ===== Laboratorul 03. NuttX - TODO ===== | + | ===== Laboratorul 03. NuttX - Wi-Fi, Bootloader ===== |
+ | |||
+ | În laboratorul de astăzi vom configura placa Esp32 să acceseze internetul prin intermediul Wi-Fi-ului (denumit station mode), iar mai apoi vom conecta laptopul la Esp32 (care va rula într-o configurație denumită SoftAP) pentru a avea conectivitate la internet. | ||
+ | |||
+ | În final, vor fi prezentate câteva noțiuni despre procesul de boot de pe Esp32. | ||
+ | |||
+ | ==== 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. | ||
+ | |||
+ | Î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 poate funcționa ca un access point atunci când este configurat hotspot-ul. | ||
+ | </note> | ||
+ | |||
+ | În NuttX, Esp32 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). Configurațiile precum ''esp32-wrover-kit:wifi'' permit plăcii să funcționeze doar ca un station, dar există și ''esp32-devkitc:sta_softap'', de exemplu, care oferă suport atât pentru station cât și pentru SoftAP. | ||
+ | |||
+ | Pentru a putea conecta Esp32 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. | ||
+ | |||
+ | 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ă (open network), poate fi consultată [[https://nuttx.apache.org/docs/latest/applications/wapi/index.html|aici]]. | ||
+ | |||
+ | De asemenea, o altă comandă utilă pentru a investiga starea interfețelor de rețea este ''ifconfig'', asemănătoare cu cea din Linux. | ||
+ | |||
+ | ==== Bootloader ==== | ||
+ | |||
+ | {{ :si:laboratoare:nuttx_bootloader.png?600 |}} | ||
+ | |||
+ | Esp32 folosește două bootloadere într-un proces denumit multi-stage boot: | ||
+ | |||
+ | * First-stage bootloader se află în memoria ROM și este primul cod care se execută la un reset de placă. Are rolul de a inițializa accesul la memoria flash externă CPU-ului și de a stoca datele venite pe UART în cazul în care flash-uim placa. | ||
+ | * Second-stage bootloader preia controlul de la first-stage bootloader, citește tabela de partiții și începe să ruleze executabilul de NuttX. | ||
+ | |||
+ | Tabela de partiții definește, în mod implicit, două tipuri de partiții: | ||
+ | |||
+ | * app - partiție care conține cod executabil. | ||
+ | * data - partiție care conține date. | ||
+ | |||
+ | Cu ajutorul partiției ''otadata'' se implementează procedeul denumit OTA - Over-the-air update. Atunci când second-stage bootloader-ul citește tabela de partiții, caută otadata și, bazându-se pe conținutul acesteia, începe execuția partiției ''ota_1'' sau ''ota_2''. Astfel, presupunând că sistemul folosește ''ota_1'', în cazul în care vrem să reflash-uim placa putem să încărcăm noul binar în ''ota_2'', iar mai apoi doar să dăm un reset. În cazul în care partiția otadata nu există sau nu este inițializată, bootloader-ul foloseste partiția ''factory'' implicită de la adresa 0x10000. | ||
+ | |||
+ | <note important> | ||
+ | În funcție de nevoile aplicației, este posibil să încărcăm executabilul direct la adresa 0x1000 în locul bootloader-ului pentru a fi executat direct de first-stage bootloader. | ||
+ | </note> | ||
+ | |||
+ | ==== Exerciții ==== | ||
+ | |||
+ | Pentru a putea rula exercițiile, este nevoie să compilați NuttX folosind ''esp32-devkitc:sta_softap'', la care va trebui să activați manual alte câteva config-uri: | ||
+ | |||
+ | * CONFIG_NET_ROUTE=y | ||
+ | * CONFIG_NET_IPFORWARD=y | ||
+ | * CONFIG_NET_NAT=y | ||
+ | * CONFIG_SYSTEM_IPTABLES=y | ||
+ | |||
+ | **1.** Conectați Esp32-ul la rețeaua facultății și testați cu ''ping 8.8.8.8'' că aveți acces la internet. Folosiți interfata ''wlan0''. | ||
+ | |||
+ | <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. | ||
+ | </note> | ||
+ | |||
+ | Rulați comanda ''route'' și inspectați output-ul acesteia. Va fi relevant la exercițiul 3. | ||
+ | |||
+ | **2.** Configurați placa să ruleze în modul SoftAP și conectați-vă cu laptopul la rețea pentru a testa. Folosiți interfața ''wlan1''. Rulați din nou comanda ''route'' și observați cum s-a modificat tabela de routare. | ||
+ | |||
+ | **3.** În urma exercițiului 2, laptopul este conectat la Esp32, dar nu are acces la internet. Puteți testa acest lucru din CMD (Windows)/terminal (Linux) folosind ''ping 8.8.8.8''. Mai departe, urmăriți pașii de mai jos: | ||
+ | |||
+ | - De pe Esp32 mai rulați o dată comanda ''ping 8.8.8.8''. Observați că nu aveți acces la internet. Configurarea wlan1 ca SoftAP a stricat tabela de routare, așa cum se poate observa din output-ul comenzii ''route''. | ||
+ | - Setați regula implicită de routare folosind comanda ''addroute default 192.168.0.1 wlan0''. Esp32 este conectat din nou la internet, puteți să testați folosind ''ping''. | ||
+ | - Ultimul pas implică adăugarea unei reguli in iptables pentru a aplica NAT pe fiecare pachet routat de Esp32: ''iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE''. | ||
+ | - Testați de pe laptopul personal folosind ping, iar din browser conectați-vă la ''www.google.com''. | ||
+ | |||
+ | ==== Resurse ==== | ||
+ | * [[https://nuttx.incubator.apache.org/docs/12.3.0/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]] |