Com a crescente demanda por dispositivos pequenos e conectados, pode surgir a necessidade de adicionar conectividade a sistemas que não possuem esta funcionalidade nativa.
Este artigo mostrará como utilizar o popular chip ESP8266 (com o módulo ESP-12 NodeMcu) como uma interface de rede no Linux pelo protocolo SLIP (Serial Line IP). Isso permitirá que uma conexão com a internet estabelecida via Wi-Fi no módulo seja roteada pelas linhas RX e TX de uma conexão serial.
Neste tutorial, utilizaremos como exemplo o computador em módulo Colibri iMX6ULL da Toradex juntamente com uma Iris Carrier Board.
O protocolo
O SLIP (Serial Line Internet Protocol) é utilizado para a comunicação utilizando IP entre duas máquinas pré-configuradas. Este tipo de conexão é chamado de link Point-to-Point.
Este protocolo é bastante simples e não possui recursos como controles de erro e endereço. Atualmente, o protocolo mais utilizado para este tipo de comunicação é o PPP (como em modems 3G/4G, por exemplo).
Apesar disso, este protocolo é bastante útil em aplicações onde os dispositivos são pré-configurados, oferecendo baixo overhead e transmissão simples de dados, onde cada frame é constituído apenas pelos dados a serem transmitidos acrescidos do caractere ASCII END.
Habilitando SLIP no kernel
Neste exemplo, o SLIP não vem habilitado por padrão no kernel. Seguimos estas instruções para recompilá-lo, habilitando como built-in a opção Device Drivers -> Network device support -> SLIP (serial line) support, e então gravá-lo na placa.
Compilando o firmware para o ESP8266 (no seu computador)
Na sua máquina host, baixe e instale o esp-open-sdk. Teste seu funcionamento compilando e gravando o exemplo “blinky” na placa.
Em outro diretório, clone o repositório esp_slip_router. Este firmware fará a conexão do ESP8266 com sua rede Wi-Fi e o roteamento via SLIP. Modifique o Makefile alterando a variável de ambiente BUILD_AREA conforme sua instalação do esp-open-sdk. Altere o arquivo user/user_config.h com as configurações da sua rede Wi-Fi (SSID e senha).
Execute:
$ make
Se a compilação for feita com sucesso, grave o firmware compilado no ESP8266 (que deve estar conectado via USB do módulo NodeMCU) executando:
$ make flash
Após a gravação, a placa reiniciará automaticamente.
Conectando o ESP8266 à sua placa via UART
Conecte os pinos RX e TX do módulo NodeMCU aos pinos TX e RX da sua placa de desenvolvimento, respectivamente. Na Iris Carrier Board, usaremos a UART_C: no conector X16, UART_C_TXD é o pino 35 e UART_C_RXD é o pino 34.
Não se esqueça da alimentação: conecte os pinos GND e 3V da placa NodeMCU aos pinos 36 e 33 da Iris Carrier Board, respectivamente. Estas ligações estão representadas na figura a seguir:
Instalando dependências
No Linux, utilizaremos o comando slattach, que faz parte do pacote net-tools da Linux Foundation.
Neste exemplo, o pacote não está disponível nos repositórios. Portanto, compilaremos esta dependência utilizando Yocto/OpenEmbedded.
Siga estas instruções para configurar o OpenEmbedded no seu computador e compile a recipe net-tools:
$ bitbake net-tools
Copie os pacotes .ipk gerados para sua placa. Eles devem estar em deploy/ipk/armv7at2hf-neon.
$ scp deploy/ipk/armv7at2hf-neon/net-tools* root@<ip-da-placa>:~
Então instale-os na sua placa:
root@colibri-imx6ull:~# opkg install net-tools*
Configurando o ESP8266 como interface de rede no Linux
Com o ESP8266 conectado, execute o seguinte comando na sua placa:
root@colibri-imx6ull:~# slattach -p slip -s 115200 /dev/ttymxc4&
Isto ligará o dispositivo serial line que está na UART_C (mapeada como /dev/ttymxc4 no computador-em-módulo utilizado) com uma baud rate de 115200 utilizando o protocolo SLIP.
Então execute:
root@colibri-imx6ull:~# ifconfig sl0 192.168.240.2 pointopoint 192.168.240.1 up mtu 1500
Este comando criará uma nova interface de rede (sl0) com endereço de rede 192.168.240.2 e endereço Point-to-Point 192.168.240.1. Estes endereços vêm por padrão e podem ser alterados no arquivo user_config.h no firmware.
Agora que o ESP8266 está funcionando como um roteador, você pode acessar o console de configuração do firmware por telnet:
root@colibri-imx6ull:~# telnet 192.168.240.1 7777
Se você configurou SSID e senha no arquivo user_config.h, o ESP8266 já deverá estar conectado à sua rede Wi-Fi. Confira executando:
CMD>show SLIP: IP: 192.168.240.1 PeerIP: 192.168.240.2 STA: SSID: <SUA_SSID> PW: <SUA SENHA> [AutoConnect:1] External IP: 192.168.0.108 DNS server: 192.168.0.1 Clock speed: 80 Serial bit rate: 115200
Caso deseje alterar SSID e senha, execute:
CMD> set ssid <NOVA_SSID> CMD> set password <NOVA_SENHA> CMD> save CMD> reset
Acessando a internet
Para acessar a internet usando a interface criada, primeiro adicione a rota:
root@colibri-imx6ull:~# route add default gw 192.168.240.1
E o servidor DNS que foi mostrado no comando *show* no console do firmware acima (192.168.0.1 neste exemplo):
root@colibri-imx6ull:~# echo "nameserver 192.168.0.1" > /etc/resolv.conf
A internet já deverá estar funcionando. Faça um teste pingando um endereço:
root@colibri-imx6ull:~# ping embarcados.com.br PING embarcados.com.br (104.24.21.16): 56 data bytes 64 bytes from 104.24.21.16: seq=0 ttl=55 time=18.838 ms 64 bytes from 104.24.21.16: seq=1 ttl=55 time=18.545 ms 64 bytes from 104.24.21.16: seq=2 ttl=55 time=17.261 ms 64 bytes from 104.24.21.16: seq=3 ttl=55 time=19.842 ms 64 bytes from 104.24.21.16: seq=4 ttl=55 time=16.337 ms 64 bytes from 104.24.21.16: seq=5 ttl=55 time=17.344 ms 64 bytes from 104.24.21.16: seq=6 ttl=55 time=19.641 ms 64 bytes from 104.24.21.16: seq=7 ttl=55 time=37.151 ms
Ou baixando um arquivo:
root@colibri-imx6ull:~# wget https://upload.wikimedia.org/wikipedia/commons/8/8a/Toradex_Logo_HD.png
--2018-06-08 17:25:45-- https://upload.wikimedia.org/wikipedia/commons/8/8a/Toradex_Logo_HD.png
Resolving upload.wikimedia.org... 198.35.26.112, 2620:0:863:ed1a::2:b
Connecting to upload.wikimedia.org|198.35.26.112|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 24203 (24K) [image/png]
Saving to: ��‘Toradex_Logo_HD.png.4��’
Toradex_Logo_HD.png 100%[===================>] 23.64K 108KB/s in 0.2s
2018-06-08 17:25:46 (108 KB/s) - ��‘Toradex_Logo_HD.png.4��’ saved [24203/24203]
Note que, como a implementação do protocolo SLIP pelo slattach limita a velocidade da UART a 115200 baud, a velocidade da conexão será um pouco lenta, mas suficiente para comunicação de um dispositivo IoT.
Boa comunicação! 🙂
Saiba mais
Usando modem GSM/3G/4G no Linux Embarcado
O que é o protocolo NTCIP de comunicação?
Aplicações e Perfis do Bluetooth Low Energy (BLE)
