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)