This shows you the differences between two versions of the page.
si:laboratoare:03 [2023/10/18 14:46] laura.ruse [Exercitii] |
si:laboratoare:03 [2023/10/22 10:57] (current) robert_ionut.alexa |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 03. NuttX - Wi-Fi, Bootloader ===== | ===== 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. | + | Î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. |
- | In final, vor fi prezentate cateva notiuni despre procesul de boot de pe Esp32. | + | În final, vor fi prezentate câteva noțiuni despre procesul de boot de pe Esp32. |
==== Wi-Fi ==== | ==== 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. | + | 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. |
- | In comunicatia prin Wi-Fi, un device poate sa aiba unul dintre rolurile de mai jos: | + | În comunicația prin Wi-Fi, un device poate să aibă unul dintre rolurile de mai jos: |
- | * Router - defineste o noua retea. | + | * Router - definește o nouă rețea. |
- | * Access Point - un device care face parte dintr-o retea, se conecteaza la router, dar este folosit pentru a crea subretele. | + | * 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 in retea. | + | * Station - un simplu device conectat în rețea. |
<note tip> | <note tip> | ||
- | Un smartphone poate functiona ca un access point atunci cand este configurat hotspot-ul. | + | Un smartphone poate funcționa ca un access point atunci când este configurat hotspot-ul. |
</note> | </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. | + | Î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 retea Wi-Fi existenta identificata prin <myssid>:<mypasswd>, se pot folosi comenzile de mai jos: | + | Pentru a putea conecta Esp32 la o rețea Wi-Fi existentă identificată prin <myssid>:<mypasswd>, se pot folosi comenzile de mai jos: |
<code> | <code> | ||
Line 30: | Line 30: | ||
</code> | </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: | + | ''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 | * WEP | ||
Line 37: | Line 37: | ||
* WPA3 (WPA3-AES) | * 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''. | + | 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 sa ruleze ca un SoftAP (prin a doua interfata de retea disponibila - wlan1), e nevoie de un set asemanator de comenzi: | + | 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> | <code> | ||
Line 48: | Line 48: | ||
</code> | </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. | + | 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 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]]. | + | 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 alta comanda utila pentru a investiga starea interfetelor de retea este ''ifconfig'', asemanatoarea cu cea din Linux. | + | 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 ==== | ==== Bootloader ==== | ||
Line 58: | Line 58: | ||
{{ :si:laboratoare:nuttx_bootloader.png?600 |}} | {{ :si:laboratoare:nuttx_bootloader.png?600 |}} | ||
- | Esp32 foloseste doua bootloadere intr-un proces denumit multi-stage boot: | + | Esp32 folosește două bootloadere într-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. | + | * 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, citeste tabela de partitii si incepe sa ruleze executabilul de NuttX. | + | * 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 partitii defineste, in mod implicit, doua tipuri de partitii: | + | Tabela de partiții definește, în mod implicit, două tipuri de partiții: |
- | * app - partitie care contine cod executabil. | + | * app - partiție care conține cod executabil. |
- | * data - partitie care contine date. | + | * data - partiție care conține 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. | + | 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> | <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. | + | Î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> | </note> | ||
- | ==== Exercitii ==== | + | ==== Exerciții ==== |
- | 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: | + | 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_ROUTE=y | ||
Line 83: | Line 83: | ||
* CONFIG_SYSTEM_IPTABLES=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''. | + | **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> | <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. | + | 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> | </note> | ||
- | Rulati comanda ''route'' si inspectati output-ul acesteia. Va fi relevant la exercitiul 3. | + | Rulați comanda ''route'' și inspectați output-ul acesteia. Va fi relevant la exercițiul 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. | + | **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.** 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: | + | **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 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''. | + | - 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''. |
- | - 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''. | + | - 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 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''. | + | - 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''. |
- | - Testati de pe laptopul personal folosind ping, iar din browser conectati-va la ''www.google.com''. | + | - Testați de pe laptopul personal folosind ping, iar din browser conectați-vă la ''www.google.com''. |
==== Resurse ==== | ==== Resurse ==== |