Differences

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

Link to this comparison view

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]]  
si/laboratoare/03.1697387739.txt.gz · Last modified: 2023/10/15 19:35 by laura.ruse
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