30 de julho de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Socket server com ESP8266

arrays dinâmicos em C++ | Interagir com ponteiros | Alocação de memória | Ponteiros em C/C++ | Socket server com ESP8266 | Socket server com ESP32 | Socket server com Python | Socket client com ESP32 | Sistema de arquivos no ESP8266

Algo bastante útil e pouco divulgado com o ESP8266 ou ESP32 é a comunicação via socket TCP ou UDP. Nesse artigo veremos como fazer um socket server com ESP8266, e por qual razão utilizá-lo. Já discorri a respeito de socket com ESP32 usando LWIP, mas farei um artigo mais simples, para quem não gosta de implementações longas.

Socket server com ESP8266: O que é socket?

Bem basicamente, uma rede é representada por 7 camadas no modelo conceitual OSI. Temos na primeira camada a representação física, que é o hardware em si. Seguidamente temos a camada de enlace, que é o primeiro nível de comunicação entre hardwares, e então temos a camada 3, que é rede. Na camada de rede temos o TCP/IP, seja IPv4 ou IPv6, e é aqui que temos endereçamento e protocolos.

Muitas das comunicações que fazemos entre dispositivos seriam mais simples, leves e rápidas de implementar se dispensássemos o servidor web, que é uma camada bem mais alta do modelo OSI. Quanto mais alta a camada, mais complexidade na implementação, além de mais recursos consumidos. Apesar dos recursos em embarcados estarem cada vez mais amplos, acabamos por vez gastando mais tempo e mais recursos por conta de uma implementação básica – com exceção apenas quando fazendo uma interface com o usuário.

O socket está na camada 3 do modelo OSI. Nesse ponto, já temos uma comunicação IP, ou seja, estamos conectados a uma rede. Abrir um socket significa abrir uma porta, pela qual poderemos trafegar dados. Utilizando um socket sem implementação de protocolos superiores como HTTP nos entrega uma experiência semelhante à comunicação serial, na qual devemos definir as regras por nós mesmos.

Abrindo um socket server com ESP8266

Há uma razão pela qual esse artigo dedicado está sendo escrito. Em um artigo relacionado mostrarei uma comunicação com o robô da MASUGUX, cuja comunicação será por WiFi. Achei importante descrever essa parte do código isoladamente para que sirva como referência para outros projetos onde caiba a utilização de sockets.

Para fazê-lo, podemos utilizar o seguinte código:

#include <ESP8266WiFi.h>

#define SSID "suaRede"
#define PASSWD "suaSenha"
#define SOCK_PORT 123

WiFiServer sockServer(SOCK_PORT);

void setup(){
    Serial.begin(9600);
    delay(1000);
    WiFi.begin(SSID,PASSWD);
    while (WiFi.status() != WL_CONNECTED){delay(100);}

    Serial.print("IP: ");
    Serial.println(WiFi.localIP());

    sockServer.begin(); //abre a porta 123
}

void loop(){
    WiFiClient client = sockServer.available();
    if (client){
        while (client.connected()){
            while (client.available() > 0){
                uint8_t value = client.read();
                Serial.write(value);
            }
            delay(10);
        }
        client.stop(); //acabou a leitura dos dados. Finaliza o client.
    }
}

Código client para testar o socket

Para testar o socket eu adaptei um script que escrevi para outro propósito (o robô do qual falo no vídeo). Nele, coloquei os valores ASCII de 0 à 4. O vídeo é mera prova de conceito, mas é a primeira oportunidade de mostrar um vídeo no novo formato, no qual vocês poderão me ajudar, deixando seu comentário e like, se gostarem, ou sugestões do que precisa ser melhorado.

#!/usr/bin/env python
import socket 
import time 
import struct

#ip a se conectar
ip = "192.168.1.211"

#porta do socket server
port = 123 

addr = ((ip,port)) 

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
client_socket.connect(addr) 

msg = bytearray()
msg.append(48)
msg.append(49)
msg.append(50)
msg.append(51)
msg.append(52)
msg.append(10)

for i in range(6):
#   client_socket.sendall(str(msg[i]).encode())
    client_socket.send(chr(msg[i]).encode())


time.sleep(1)

client_socket.close()

Troque o IP pelo que for mostrado na serial, só isso. Esse código pode ser salvo em qualquer arquivo com a extensão “.py” e roda em qualquer plataforma que tenha o Python 3 instalado. Se precisar de tutorial de instalação do Python, instalação de bibliotecas e afins, deixe seu comentário lá no vídeo.

Vídeo

Essa é a essência da comunicação socket, que facilitará em muito a comunicação com o robô. Espero que acompanhe!

E agora com novo formato (ainda em adaptação) e melhores resultados de audiovisual, acompanhe também em nosso canal DobitaobyteBrasil no Youtube os vídeos sobre os artigos.

O link direto para o vídeo é esse.

 

Revisão: Ricardo Amaral de Andrade