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.

Un smartphone poate funcționa ca un access point atunci când este configurat hotspot-ul.

Î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:

ifup wlan0
wapi psk wlan0 <mypasswd> 3
wapi essid wlan0 <myssid> 1
renew wlan0

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:

ifup wlan1
dhcpd_start wlan1
wapi psk wlan1 <mypasswd> 3
wapi essid wlan1 nuttxapp 1

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ă 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

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.

Î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.

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.

Î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).

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.

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:

  1. 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.
  2. 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.
  3. 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.
  4. Testați de pe laptopul personal folosind ping, iar din browser conectați-vă la www.google.com.

Resurse

si/laboratoare/03.txt · Last modified: 2023/10/22 10:57 by robert_ionut.alexa
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