ESP8266 com WebSockets

A ideia de usar o websocket é evitar espera ocupada, além de usar toda a infraestrutura criada para requisições HTTP (uso de portas 80, 443, segurança, etc).

Se o servidor suportar websocket, o ESP8266 (ou até mesmo um browser) pode se conectar via um HTTP request e manter essa conexão para trocas de dados. Logo, o dispositivo não precisa ficar perguntando a cada segundo para o servidor, através de uma chamada REST por exemplo, se houve mudança no estado do dispositivo (ex: ligaram a luz pela web). Como a conexão fica aberta, o servidor pode avisar o dispositivo através da conexão mantida aberta. 

O protocolo MQTT é até melhor que websockets para esse tipo de aplicação IoT. Contudo, como MQTT é um protocolo totalmente diferente que HTTP, não é possivel usar as portas padrões do HTTP (ou seja, vão ser necessárias configurações nos firewalls dos brokers MQTT para aceitar conexões em outras portas que não 80 e 443), além da segurança ter de ser implementada via TLS nativo e não por SSL (essa parte pra mim ainda não está totalmente clara, porque SSL não funciona para MQTT de forma transparente)

Quer testar? Então vamos lá:

Pré-requisito é já estar usando o ESP8266 através da IDE do Arduino. Mais detalhes aqui: https://github.com/esp8266/Arduino

Primeiro, você vai ter que montar um servidor que forneça um serviço de websockets, para você criar métodos que tratem o envio e recebimento de mensagens. Eu segui esse exemplo (link) que é muito útil, pois já é direcionado ao gerenciamento de dispositivos IoT. Ficou com preguiça de codificar, subi aqui https://github.com/odelot/WebsocketHome/

Esse exemplo é bem simples. Você pode criar dispositivos via pagina do browser, que são mantidos em uma sessão que dura enquanto o servidor estiver de pé. Todo mundo que se conecta recebe todos os dispositivos existentes. Você pode alterar o status do dispositivo direto na pagina WEB e essa alteração é enviada para todo mundo que está conectado no websocket.

No lado do ESP8266** vamos usar a biblioteca de acesso a websockets https://github.com/Links2004/arduinoWebSockets. Nela, você configura um callback que lidará com todas as mensagens que o dispositivo receber. No exemplo abaixo, ele se conecta ao websocket, fica escutando as mensagens e printando na porta serial e, depois de se conectar, ele adiciona um novo dispositivo chamado “luz”. Depois que o esp8266 adiciona esse dispositivo, podemos alterar seu status direto no browser que as alterações são enviadas a todas as conexões ativas, inclusive o esp8266. Veja o vídeo para entender melhor.

**(você pode usar o arduino tb, conectado na internet via ESP8266, EthernetShield, etc.. mas aconselho esquecer o arduino para conexões com internet e programar direto para o ESP8266. Não tem desculpas rs, o ESP8266 é mais potente e mais barato que o Arduino, e você usa a mesma IDE e bibliotecas para programa-lo)

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WebSocketsClient.h>
#include <Hash.h>
ESP8266WiFiMulti WiFiMulti;
WebSocketsClient webSocket;
//callback de gerenciamento das mensagens recebidas via websocket
void webSocketEvent(WStype_t type, uint8_t * payload, size_t lenght) {

   switch(type) {
        case WStype_DISCONNECTED:
             Serial.printf("[WSc] Disconnected!\n");
             break;
        case WStype_CONNECTED:
        {
             Serial.printf("[WSc] Connected to url: %s\n", payload); 
         }
        break;
        case WStype_TEXT:
              Serial.printf("[WSc] get text: %s\n", payload);
              break;
        case WStype_BIN:
              Serial.printf("[WSc] get binary lenght: %u\n", lenght);
              hexdump(payload, lenght);
              break;
   }
}
//variavel de controle para enviar mensagem somente uma vez
bool send = false;

void setup() { 
   Serial.begin(115200);
   //preencha com sua rede wifi e senah
   WiFiMulti.addAP("ssid", "wifipass");
 
   while(WiFiMulti.run() != WL_CONNECTED) {
      delay(100);
   }
   //preencha com o IP do servidor 
   char* serverIP = "192.168.1.131"; 
   webSocket.begin(serverIP, 8080, "/WebsocketHome/actions"); 
   webSocket.onEvent(webSocketEvent);
}
void loop() {
    webSocket.loop();
    if (send==false) {
       String msg ("{ \"action\":\"add\", \"name\":\"luz\", \"type\":\"Lights\", \"description\":\"desc\"}");
       send = webSocket.sendTXT (msg); 
    } 
}
Anúncios

Deixe um comentário

Arquivado em Arduino, Automação Doméstica, Eletrônica, ESP8266, Geek, Java

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s