Manual
do
Maker
.
com
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.
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?
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.
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.
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.
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.
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.
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:
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):
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.
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.