Comunicação Wireless TCP com ESP (Parte 2)
Comunicação Wireless TCP com ESP
Daremos inicio a segunda parte do nosso material sobre comunicações Wireless. No tutorial anterior, foi abordado sobre o protocolo UDP, que não é orientado à conexão. Desta vez, vamos aprender sobre o protocolo TCP, este por sua vez, é orientado à conexão, que nos garante a entrega de mensagens, ordenação do recebimento/envio, etc. O código aqui apresentado irá funcionar tanto para ESP8266 quanto para o ESP32, já que a diferença é mínima e funciona da mesma forma.
[toc]
Protocolo TCP
TCP (Transmission Control Protocol) é um protocolo para transmissão de dados voltado à conexão, ou seja, permite que as maquinas se comuniquem e gerenciem o estado atual da conexão com seus clientes e servidores. Uma característica importante do TCP é seu gerenciamento do status da rede e os dados, com isto, podemos saber se o dado enviado foi realmente entregue ao destinatário, também garante a entrega ordenada das informações sem que haja colisões e perdas inperceptíveis. Muitas aplicações usam o TCP para efetuar suas comunicações, sendo amplamente usado em todo tipo de situação, ao contrario do UDP que por não ser orientado à conexão, pode gerar erros em nossos sistemas.
Mãos à obra
Componentes necessários
- 1x ESP8266(Usaremos NodeMCU 8266) ou 1x ESP32.
- Aplicativo TCP Client no celular.
Obs: Você pode usar qualquer aplicativo ou programa para transmitir os pacotes TCP. Nós usaremos o primeiro encontrado na Play Store para ser fácil de vocês encontrarem caso queiram usar também. Link do TCP Client na Play Store
Código do projeto
#ifdef ESP8266//Se estiver usando ESP8266, automáticamente irá adicionar as bibliotecas do ESP8266. #include <ESP8266WiFi.h> #include <WiFiServer.h> #elif defined ESP32//Se estiver usando ESP32, fara a mesma operaçao. #include <WiFi.h> #endif WiFiServer sv(555);//Cria o objeto servidor na porta 555 WiFiClient cl;//Cria o objeto cliente. void setup() { Serial.begin(115200);//Habilita a comm serial. WiFi.mode(WIFI_AP);//Define o WiFi como Acess_Point. WiFi.softAP("NodeMCU", "");//Cria a rede de Acess_Point. sv.begin();//Inicia o servidor TCP na porta declarada no começo. } void loop() { tcp();//Funçao que gerencia os pacotes e clientes TCP. } void tcp() { if (cl.connected())//Detecta se há clientes conectados no servidor. { if (cl.available() > 0)//Verifica se o cliente conectado tem dados para serem lidos. { String req = ""; while (cl.available() > 0)//Armazena cada Byte (letra/char) na String para formar a mensagem recebida. { char z = cl.read(); req += z; } //Mostra a mensagem recebida do cliente no Serial Monitor. Serial.print("\nUm cliente enviou uma mensagem"); Serial.print("\n...IP do cliente: "); Serial.print(cl.remoteIP()); Serial.print("\n...IP do servidor: "); Serial.print(WiFi.softAPIP()); Serial.print("\n...Mensagem do cliente: " + req + "\n"); //Envia uma resposta para o cliente cl.print("\nO servidor recebeu sua mensagem"); cl.print("\n...Seu IP: "); cl.print(cl.remoteIP()); cl.print("\n...IP do Servidor: "); cl.print(WiFi.softAPIP()); cl.print("\n...Sua mensagem: " + req + "\n"); } } else//Se nao houver cliente conectado, { cl = sv.available();//Disponabiliza o servidor para o cliente se conectar. delay(1); } }
Colando para funcionar
Devo lembrar que o IP padrão do ESP em modo Acess_Point é 192.168.4.1
1-) Precisamos nos conectar na rede WiFi criada pelo micro controlador.
2-) Logo, iremos adicionar o servidor com seu IP e PORTA no aplicativo. Lembre-se que você pode usar qualquer aplicativo ou programa de computador para isso.
3-) Após incluir os dados do servidor no aplicativo, podemos conectar-se e enviar os dados.
Obs: Também há dados disponíveis no Serial monitor, que o micro controlador escreveu, olhe como ficou.
Entendendo a fundo
Software
-Função WiFiClient::connected()
if (cl.connected())//Detecta se há clientes conectados no servidor. { }
Esta função retorna se há cliente conectado em nosso servidor. Também irá retornar que há clientes até que todos dados sejam lidos do buffer, se não, continuará aparecendo clientes conectados até que todos dados sejam lidos.
-Função WiFiClient::available()
if (cl.available() > 0)//Verifica se o cliente conectado tem dados para serem lidos. { }
Esta função, retorna a quantidade de bytes disponiveis para a leitura no buffer do cliente. Pode ser usada para detectar se há dados, e também para efetuar a leitura byte a byte do buffer, afim de montar a String final.
-Função WiFiClient::print()
cl.print();
Usada para enviar a String para o cliente. Há várias maneiras de mandar uma informação para o cliente, desde write(), printf() até print() e println().
-Função WiFiServer::available()
cl = sv.available();//Disponabiliza o servidor para o cliente se conectar.
Esta função, obtem um cliente que esta conectado ao servidor e tem dados disponiveis para a leitura. Pode ser entendida a grosso modo que diz ao cliente que há um servidor disponivel para enviar dados.
Desafio
O desafio desta vez, é tentar conectar multiplos clientes ao mesmo tempo em seu servidor. Este código não permite isto, então faça alterações e estude sobre as bibliotecas usadas para permitir multiplas conexões!
Fechamento
Neste tutorial, você aprendeu a efetuar uma troca simples de mensagens entre o Cliente (nosso celular) e o Servidor (ESP), pode ser usada de mesma forma para comunicação entre dois micro controladores. Na parte 3 deste material, aplicaremos as aulas passadas em um aplicativo em Android ou PC para se comunicar com nosso ESP8266/32. Não se esqueça de comentar sobre duvidas, elogios e criticas! Também aceitamos sugestões sobre a terceira parte deste material.