Maximizando a velocidade do Wi-Fi: Sintonizando o Zephyr para Máximo Desempenho com os SoCs ESP32 em Aplicações IoT

Uma necessidade comum a todos os desenvolvedores de aplicações baseadas no Zephyr OS é mensurar o desempenho alcançado por uma determinada configuração nos parâmetros do stack de rede WiFi. Este artigo tem por objetivo demonstrar como instalar, configurar e utilizar as ferramentas zperf e iperf para quantificar este desempenho.

Ambiente de Testes

Para avaliar o desempenho da comunicação, um setup composto por uma placa de desenvolvimento esp32-s3_devkitc, um roteador Wi-Fi doméstico um computador com Linux rodando Ubuntu 22.04 foi utilizado.

Para facilitar a geração e consumo de pacotes na rede Wi-Fi, nós utilizamos a ferramenta iperf no lado do computador. Já na placa de desenvolvimento esp32-s3_devkitc nós utilizamos a aplicação zperf, quem vem na configuração padrão do Zephyr. Uma abordagem de teste estruturado permitiu analisar sistematicamente o impacto dos ajustes feitos nos parâmetros do stack de rede WiFi do Zephyr em vários cenários reais:

ESP32 Enviando Pacotes UDP para o PC:

PC Enviando Pacotes UDP para o ESP32:

ESP32 Enviando Pacotes TCP para o PC:

PC Enviando Pacotes TCP para o ESP32:

Instalando o iperf no PC

Em um terminal, execute o seguinte comando:

$ sudo apt-get install iperf

Observe que são necessárias credenciais de administrador para completar a instalação de forma bem-sucedida.

Instalando o Zephyr OS

Para instalar o Zephyr OS e suas dependências, siga passo a passo as seguintes instruções:

Instalando as Dependências:

Em um terminal, execute o seguinte comando:

$ sudo apt install --no-install-recommends \
  git cmake ninja-build gperf ccache dfu-util device-tree-compiler wget \
  python3-dev python3-pip python3-setuptools python3-tk python3-wheel \
  xz-utils file make gcc gcc-multilib g++-multilib libsdl2-dev libmagic1

Instalando o West:

Para instalar o script Python o sistema de build do Zephyr OS, e execute o seguinte comando:

$ pip install west

Inicializando o Zephyr:

Agora, inicialize o Zephyr no seu computador executando os seguintes comandos:

$ west init ~/zephyrproject
$ cd ~/zephyrproject
$ west update

Instalando a Dependências Python:

Depois de inicializar o Zephyr, instale as dependências Python adicionais executando:

$ pip install -r ~/zephyrproject/zephyr/scripts/requirements.txt

Download e Instalação do Zephyr SDK:

Para cross-compilar o zperf, download e instale o Zephyr SDK executando os seguintes comandos:

$ cd ~
$ wget https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.4/zephyr-sdk-0.16.4_linux-x86_64.tar.xz
$ wget -O - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.16.4/sha256.sum | shasum --check --ignore-missing
$ tar xvf zephyr-sdk-0.16.4_linux-x86_64.tar.xz
$ cd zephyr-sdk-0.16.4

 Instalando os blobs da Espressif:

Para compilar sua aplicação Wi-Fi para o ESP32-S3 com o Zephyr, instale os blobs da hal_espressif:

$ west blobs fetch hal_espressif

Instalando as Regras do udev:

Adicionalmente, instale as regras do udev para possibilitar a gravação do ESP32-S3 como um usuário comum:

$ sudo cp /opt/zephyr-sdk-0.16.4/sysroots/x86_64-pokysdk-linux/usr/share/openocd/contrib/60-openocd.rules /etc/udev/rules.d
$ sudo udevadm control --reload

Fazendo o zperf Funcionar no ESP32-S3_DevKitC-1

Para possibilitar a compilação do zperf no ESP32-S3_DevKitC-1, siga estes passos para alterar os arquivos necessários:

Crie o Arquivo de Overlay:

Crie o arquivo zephyr/samples/net/zperf/boards/esp32s3_devkitc.overlay com o seguinte conteúdo:

/*
 * Copyright (c) 2024 Espressif Systems (Shanghai) Co., Ltd.
 *
 * SPDX-License-Identifier: Apache-2.0
 */
&wifi {
    status = "okay";
};

Atualize o Arquivo prj.conf : 

Modique o conteúdo do arquivo zephyr/samples/net/zperf/prj.conf para conter as seguintes configurações:

CONFIG_NET_BUF_DATA_SIZE=1500
CONFIG_NET_IF_UNICAST_IPV4_ADDR_COUNT=1
CONFIG_NET_MAX_CONTEXTS=5
CONFIG_NET_TC_TX_COUNT=1
CONFIG_NET_SOCKETS=y
CONFIG_NET_SOCKETS_POSIX_NAMES=y
CONFIG_NET_SOCKETS_POLL_MAX=4
CONFIG_POSIX_MAX_FDS=8
CONFIG_INIT_STACKS=y
CONFIG_TEST_RANDOM_GENERATOR=y
CONFIG_NET_L2_ETHERNET=y
CONFIG_NET_SHELL=y
CONFIG_NET_L2_WIFI_SHELL=y
CONFIG_NET_CONFIG_SETTINGS=y
CONFIG_LOG=y
CONFIG_SHELL_CMDS_RESIZE=n
CONFIG_NET_IPV6=n
CONFIG_NET_DHCPV4=n
CONFIG_NET_CONFIG_MY_IPV4_ADDR="<STATION IP ADDRESS>"
CONFIG_NET_CONFIG_MY_IPV4_GW="<GATEWAY IP ADDRESS>"
CONFIG_NET_CONFIG_MY_IPV4_NETMASK="255.255.255.0"
CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=50000

Não se esqueça de substituir <STATION IP ADDRESS> e <GATEWAY IP ADDRESS> pelos endereções de IP de acordo com a sua rede Wi-Fi. 

Compile e grave o zperf:

Depois de cada notificação feita no arquivo zephyr/samples/net/zperf/prj.conf com o propósito de ajustar os valores dos parâmetros de configuração, recompile o zperf e grave o firmware na placa ESP32-S3_DevKitC-1 antes de iniciar a sequência de testes executando os seguintes comandos:

$ west build -b esp32s3_devkitc zephyr/samples/net/zperf --pristine
$ west flash
$ west espressif monitor

Assegure-se de que o ESP32-S3_DevKitC-1 está conectar a uma porta USB do seu computador durante o processo de gravação do firmware.

Rodando os Testes

Antes de começar uma sequência de testes, lembre-se sempre de compilar e gravar o zperf no ESP32-S3_DevKitC-1:

$ west build -b esp32s3_devkitc zephyr/samples/net/zperf --pristine
$ west flash
$ west espressif monitor

Depois de executas esses comandos, você estará na interface de linha de comando do zperf. Siga os passos que seguem para conectar o ESP32-S3_DevKitC-1 ao roteador Wi-Fi:

$ wifi connect <SSID> <PASSWORD>
$ net ping <PC_IP>

Resultado da execução do comando anterior:

*** Booting Zephyr OS build zephyr-v3.5.0-2714-g031c842ecb76 ***
[00:00:00.387,000] <inf> net_config: Initializing network
[00:00:00.387,000] <inf> net_config: Waiting interface 1 (0x3fcc8810) to be up...
[00:00:00.388,000] <inf> net_config: Interface 1 (0x3fcc8810) coming up
[00:00:00.388,000] <inf> net_config: IPv4 address: 192.168.15.2
uart:~$ wifi connect <SSID> <PASSWORD>
Connection requested
Connected
uart:~$ net ping 192.168.15.8
PING 192.168.15.8
28 bytes from 192.168.15.8 to 192.168.15.2: icmp_seq=1 ttl=64 time=219 ms
28 bytes from 192.168.15.8 to 192.168.15.2: icmp_seq=2 ttl=64 time=434 ms
28 bytes from 192.168.15.8 to 192.168.15.2: icmp_seq=3 ttl=64 time=356 ms
uart:~$ 

Em seguida, abra um segundo terminal onde você executará o iperf.

ESP32 Enviando Pacotes UDP para o Computador:

No terminal do iperf, digite:

$ iperf -s -l 1K -u -B 192.168.15.8

No terminal do zperf, digite:

$ zperf udp upload 192.168.15.6 5001 10 1K 5M

Computador Enviando Pacotes UDP para o ESP32:

No terminal do zperf, digite:

$ zperf udp download 5001

No terminal do iperf, digite:

$ iperf -l 1K -u -c 192.168.15.2 -b 10M

ESP32 Enviando Pacotes TCP para o PC:

No terminal do iperf, digite:

$ iperf -s -l 1K -B 192.168.15.8

No terminal do zperf, digite:

$ zperf tcp upload 192.168.15.8 5001 10 1K 5M

PC Enviando Pacotes TCP para o ESP32:

No terminal do zperf, digite:

$ zperf tcp download 5001

No terminal do iperf, digite:

$ zperf tcp download 5001

Resultados

Para ilustrar o impacto tangível do ajuste dos parâmetros de rede na velocidade da comunicação Wi-Fi do ESP32-S3 Wi-Fi, foram conduzidas uma série de testes, sempre modificando o valor do parâmetro CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE. Os resultados demostram a evolução do desempenho antes e depois de cada mudança neste parâmetro:

Configuração Inicial: 

CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE comentado.

DEVICEPROTOCOL ROLEDIRECTIONRATE

ESP32-S3
UDPSERVERDOWNLOAD10.05 Mbps
CLIENTUPLOAD4.78 Mbps
TCPSERVERDOWNLOAD2.83 Mbps
CLIENTUPLOAD4.22 Mbps

1a Modificação na Configuração (Incremento no Tamanho da Janela): 

CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=20000

DEVICEPROTOCOL ROLEDIRECTIONRATE

ESP32-S3
UDPSERVERDOWNLOAD10.05 Mbps
CLIENTUPLOAD4.78 Mbps
TCPSERVERDOWNLOAD3.62 Mbps
CLIENTUPLOAD4.22 Mbps

2a Modificação na Configuração (Incremento no Tamanho da Janela): 

 CONFIG_NET_TCP_MAX_RECV_WINDOW_SIZE=50000

DEVICEPROTOCOL ROLEDIRECTIONRATE

ESP32-S3
UDPSERVERDOWNLOAD10.05 Mbps
CLIENTUPLOAD4.78 Mbps
TCPSERVERDOWNLOAD4.07 Mbps
CLIENTUPLOAD4.22 Mbps

Gráfico comparativo dos resultados obtidos:

Estes resultados demostram claramente a relação direta entre os valores dos parâmetros e a taxa de transferência de dados na rede Wi-Fi utilizando o ESP32-S3. Os desenvolvedores podem utilizar esta informação para promover um ajuste fino em suas aplicações de forma a obter um desempenho ótimo em diversos cenários de comunicação. Pode-se então ajustar os parâmetros de acordo com requisitos e condições específicas a fim de alcançar o objetivo almejado.

Conclusão

O problema de medir a evolução do desempenho da velocidade de comunicação em resposta às mudanças efetuadas nos valores dos parâmetros de configuração do stack de rede Wi-Fi do Zephyr OS utilizando a placa de desenvolvimento ESP32-S3_devkitM  foi apresentado. Por meio da instalação, configuração e utilização das ferramentas iperf e zperf, e seguindo o procedimento descrito nesse artigo, foi possível observar de forma tangível a evolução do desempenho na medida em que os valores dos parâmetros de configuração eram modificados.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Comentários:
Notificações
Notificar
0 Comentários
recentes
antigos mais votados
Inline Feedbacks
View all comments
Home » Internet Das Coisas » Maximizando a velocidade do Wi-Fi: Sintonizando o Zephyr para Máximo Desempenho com os SoCs ESP32 em Aplicações IoT

EM DESTAQUE

WEBINARS

VEJA TAMBÉM

JUNTE-SE HOJE À COMUNIDADE EMBARCADOS

Talvez você goste: