31 de julho de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Roteamento com ESP32 T-Internet-PoE

t-internet-poe | ethernet e wifi | roteamento

Apesar de já ter explicado no artigo anterior relacionado e no vídeo de apresentação da T-Internet-PoE, vou enfatizar um pouco mais sobre o roteamento com ESP32 para que fique claro. É importante entender o conceito, caso redes não seja uma de suas especialidades. Mas já adianto: Não consegui colocar esse modo pra funcionar direito ainda.

O que é roteamento em redes?

Vamos pegar como exemplo duas redes LAN, uma classe C com endereçamento 192.168.0.0/24 e uma rede classe B com endereçamento 172.16.0.0/16 e queremos acessar o servidor web que estiver em 172.16.0.100, o modem fará o encaminhamento, desde que haja uma rota dizendo que tudo que for encaminhado para 172.16.0.0/16 passe pela interface com o IP 172.16.0.1.

Um roteador é um ponto da rede que faz interface com um endereço de destino ou que tenha rota para passar adiante a requisição até o destino.

Já fiz roteamentos bastante complexos usando a combinação de roteamento com NAT mascarado e transversal. Tudo depende da necessidade. Mas para o ESP32 desse artigo tudo o que precisamos ter em mente é que um roteador é o cara que abre o “portal” para um destino. Um “mestre dos magos” que não fica de enrolação.

O ESP32 T-Internet-PoE pode funcionar como um roteador ou como uma bridge. E o que é a bridge?

Bridge com ESP32

Uma bridge é, na tradução direta, uma ponte. É uma forma de interconectar dois pontos sem atuar sobre esses dois pontos. Normalmente uma bridge não tem endereçamento, as interfaces ficam no chamado “modo promíscuo”, apenas trafegando o que entra e o que sai.

Com a T-Internet-PoE podemos fazer o chamado data forwarding, repassando dados da internet para a rede WiFi. Nesse caso o WiFi trabalhará no modo station, se conectando à rede WiFi, enquanto a ethernet fará interface com outro dispositivo ethernet, sem endereçamento. Nesse modo podemos usar o ESP32 para fornecer conectividade com a Internet e se parecerá muito com um roteador pelo fato de ser o caminho primário para a Internet, porém ele trabalha mais no modo bridge nesse caso.

Uma bridge transparente não tem endereço em nenhuma das interfaces. Nesse artigo demonstro o recurso com Linux, que usei amplamente no passado.

Talvez você não tenha visto aplicação real até o momento, mas já estou há um ano com essa necessidade, cuja “luva” recém foi criada: A T-Internet-PoE, que fará o roteamento com ESP32 para conectar minha CNC à rede WiFi, uma vez que a CNC só tem interface ethernet. Porém, o “único” projeto com a proposta é esse apresentado mais abaixo.

Agora que acabamos a parte chata (conceitual), vamos ao projeto.

Roteamento com ESP32 e ESP-IoT-Solution

Temos uma solução pronta pra uso! Bem, “quase” pronta. Temos que preparar o ambiente e “ajustar” o projeto; razão pela qual escrevi o artigo sobre como configurar o ESP-IDF.

O ESP-IoT-Solution é um repositório com o projeto que usaremos especificamente “nesse” artigo, mas tem mais projetos para essa e outras placas, contendo drivers de dispositivos e um framework para desenvolvimento IoT. Ele funciona como um conjunto extra de componentes do ESP-IDF e promete ser muito mais fácil de iniciar. Veremos.

A documentação oficial é essa.

Se já tem seu esp-idf configurado, entre no diretório esp e clone o repositório:

git clone -b release/v1.1 --recursive https://github.com/espressif/esp-iot-solution

Para usá-lo, alguns métodos diferentes são explicados na documentação, mas aqui adoto um método direto.

Inicie o ambiente de desenvolvimento

Se seguiu o artigo anterior relacionado, deve ter configurado um alias para iniciar o ambiente. Nesse caso, abra um terminal e digite:

get_idf

Agora precisamos adicionar o esp-iot-solution ao path do sistema também. Podemos criar um novo alias para fazer o export, para quando formos usar o ESP-IDF e também o esp-iot-solution. Adicione ao ~/.bashrc uma linha assim:

alias get_iot='export IOT_SOLUTION_PATH=~/esp/esp-iot-solution'

Agora que temos o ambiente pronto para uso, vamos ao projeto.

Ethernet para WiFi data forwarding

O projeto base está dentro de esp-iot-solution/examples/eth2wifi. Copie o diretório para ~/esp/ e entre no diretório eth2wifi.

cd ~/esp/eth2wifi

Devemos optar por Ethernet to WiFi station ou Ethernet to WiFi softap usando make menuconfig ou idf.py menuconfig. Para manter o padrão disposto no artigo anterior, tenhamos em mente o uso de idf.py menuconfig.

Ethernet to wifi station data forwarding

Desse modo um computador poderá acessar a Internet através do ESP32. Esse é o modo que será utilizado. Ao abrir o menuconfig, teremos um item extra: IoT Example.

iot example - roteamento

Acesse o menu e então no primeiro item selecione Ethernet PHY (Microchip LAN8720 PHY) para utilizar a ethernet nativa da placa.

O ítem seguinte é o PHY Address. O endereço deve ser 1 para LAN8720 PHY Waveshare e 0 para LAN8720 que não seja Waveshare. Se tiver dúvidas, não tem problema nenhum em experimentar. Um outro repositório da própria LilyGo diz que tanto faz utilizar 0 ou 1 para essa placa. Ao escolher o modelo supracitado, automaticamente teremos o endereço 1. Só obtive algum êxito com o endereço 0.

O próximo item do menu é o PHY Power GPIO. A LilyGo configura esse parâmetro como -1 para desativar o pino e usar a APLL como gerador de frequência da ethernet. Como citei anteriormente, não use o barramento I2S para outra coisa quando fizer esse tipo de configuração.

Os próximos dois itens estão de acordo; 23 para MDC e 18 para MDIO.

Usaremos WiFi station mode. Marque essa opção. Feito isso, podemos definir agora o SSID e senha da rede a que o ESP32 deverá se conectar. No final teremos algo assim:

roteamento menuconfig

Use Esc para sair desse menu; Esc novamente e Y para salvar. Agora é só digitar:

idf.py build

No final teremos o firmware devidamente compilado, bastando conectar o gravador à placa e fazer o upload do firmware:

idf.py -p /dev/ttyUSB0 flash

Substitua a porta serial pela porta correta em seu sistema. Conecte as ethernets e tudo deveria funcionar dee forma transparente (com o WiFi do computador desligado). Mas, não foi o que aconteceu. O evento da ethernet foi gerado, portanto pareceu funcionar parcialmente. Ao conectar o cabo ethernet esse sinal de conectividade é gerado e então o ESP32 se conecta à rede WiFi e pega IP. Porém, não está acontecendo o repasse de pacotes. O que tenho no monitor serial da placa é isso (do boot ao evento):

roteamento

O reboot acontece após uma tentativa de comunicação.

Usando o projeto padrão só acontece reboots. Após fazer os ajustes usando menuconfig, consegui chegar até esse ponto. Se alguém quiser tentar (e se conseguir, informar o que deu errado), o projeto está aqui.

Vou escrever outro artigo com WiFi e ethernet funcionando, que é o único exemplo oficial e sem documentação, mas é da própria LilyGo. Porém, não é um “passthrough”.

Apesar de não ter um desfecho como esperado, achei adequado citar minha experiência e certamente o problema que estou tendo (ainda) é falta de experiência com esse modo promiscuo da interface. Quando eu acertar isso, escrevo de novo sobre roteamento. A placa funciona bem e é linda, recomendo sem sombra de dúvidas. O link da placa é esse.