WEBSOCKETS
Por Fernando Koyanagi
Intenção dessa aula
1. Apresentar um exemplo de WebSocket
utilizando ESP32 e NodeJS.
2. Apresentar instalação e configuração do
NodeJS.
Demonstração
Recursos usados
• ESP32
• Led
• Resistor 330 ohm
• Protoboard
• Jumpers
• Computador WebSocket Server
Links onde
comprei os
componentes
Em [Link]
[Link]
Instagram
fernandok_oficial
Telegram
fernandok_oficial
Instalação do Node
Primeiro é necessário que o Node esteja instalado na sua máquina.
Acesse:
[Link]
Baixe a versão compatível com o seu sistema operacional.
Instalação do Node
Após o download finalizar execute o instalador.
É recomendado desativar o antivírus (caso exista) para evitar problemas na instalação.
Instalação do Node
Siga a instalação padrão...
Instalação do Node Variáveis de Ambiente
Para que o sistema reconheça o comando node é necessário adicionar o local
onde o node foi instalado às variáveis de ambiente do sistema.
Clique com o botão direito em Computador e selecione Propriedades
Instalação do Node Variáveis de Ambiente
Vá em Configurações avançadas do sistema
Instalação do Node Variáveis de Ambiente
Vá em Variáveis de Ambiente
Instalação do Node Variáveis de Ambiente
Em Variáveis do sistema, procure por Path e clique em Editar
Instalação do Node Variáveis de Ambiente
Clique em Novo
Digite: C:\Program Files\nodejs (ou o local onde o node está instalado)
Clique em OK
E por fim reinicie a máquina
Iniciando servidor
Abra o prompt de comando dentro da pasta onde está o código
NodeEchoWebSocket e execute:
node [Link]
Iniciando servidor
Conceda a permissão de acesso do Firewall
Iniciando servidor
Pronto, uma mensagem será exibida informando a porta em que o
servidor está utilizando.
Montagem
Montagem
Código
Bibliotecas necessárias
• WebSocket Client ESP32
[Link]
Fluxograma ESP32
Setup Loop
Código ESP32 Declarações e Variáveis
#include <ArduinoWebsockets.h> // Bilioteca WebSockets
const char* ssid = "NOME_REDE"; // Nome da rede
const char* password = "SENHA_REDE"; // Senha da rede
const char* websockets_server_host = "[Link]"; // IP do servidor websocket
const uint16_t websockets_server_port = 8080; // Porta de conexão do servidor
// Utilizamos o namespace de websocket para podermos utilizar a classe WebsocketsClient
using namespace websockets;
// Objeto websocket client
WebsocketsClient client;
// Led
const int led = 23;
Código ESP32 Setup
void setup()
{
// Iniciamos a serial com velocidade de 115200
[Link](115200);
// Definimos o pino como saída
pinMode(led, OUTPUT);
// Conectamos o wifi
[Link](ssid, password);
// Enquanto não conectar printamos um "."
while([Link]() != WL_CONNECTED)
{
[Link](".");
delay(1000);
}
// Exibimos "WiFi Conectado"
[Link]("Connected to Wifi, Connecting to server.");
Código ESP32 Setup
// Tentamos conectar com o websockets server
bool connected = [Link](websockets_server_host, websockets_server_port, "/");
if(connected) // Se foi possível conectar
{
[Link]("Connected!"); // Exibimos mensagem de sucesso
// Enviamos uma msg "Hello Server" para o servidor
[Link]("Hello Server");
} // Se não foi possível conectar
else
{
[Link]("Not Connected!"); // Exibimos mensagem de falha
}
// Iniciamos o callback onde as mesagens serão recebidas
[Link]([&](WebsocketsMessage message)
{
// Exibimos a mensagem recebida na serial
[Link]("Got Message: ");
[Link]([Link]());
// Ligamos/Desligamos o led de acordo com o comando
if([Link]().equalsIgnoreCase("ON"))
digitalWrite(led, HIGH);
else
if([Link]().equalsIgnoreCase("OFF"))
digitalWrite(led, LOW);
});
}
Código ESP32 Setup
// Tentamos conectar com o websockets server
bool connected = [Link](websockets_server_host, websockets_server_port, "/");
if(connected) // Se foi possível conectar
{
[Link]("Connected!"); // Exibimos mensagem de sucesso
// Enviamos uma msg "Hello Server" para o servidor
[Link]("Hello Server");
} // Se não foi possível conectar
else
{
[Link]("Not Connected!"); // Exibimos mensagem de falha
}
// Iniciamos o callback onde as mesagens serão recebidas
[Link]([&](WebsocketsMessage message)
{
// Exibimos a mensagem recebida na serial
[Link]("Got Message: ");
[Link]([Link]());
// Ligamos/Desligamos o led de acordo com o comando
if([Link]().equalsIgnoreCase("ON"))
digitalWrite(led, HIGH);
else
if([Link]().equalsIgnoreCase("OFF"))
digitalWrite(led, LOW);
});
}
Código ESP32 Loop
void loop()
{
// De tempo em tempo, o websockets client
checa por novas mensagens recebidas
if([Link]())
[Link]();
delay(1);
}
Código
Fluxograma Node
Código Node Declarações e variáveis
var WebSocketServer = require('websocket').server;
var http = require('http');
// Porta que o server irá escutar
const port = 8080;
// Cria o server
var server = [Link]();
Código Node [Link] e wsServer
// Server irá escutar na porta definida em 'port'
[Link](port, () => {
// Server está pronto
[Link](`Server está executando na porta ${port}`);
});
// Cria o WebSocket server
wsServer = new WebSocketServer({
httpServer: server
});
Código Node [Link]
// Chamado quando um client deseja conectar
[Link]('request', (request) => {
// Estado do led: false para desligado e true para ligado
let state = false;
// Aceita a conexão do client
let client = [Link](null, [Link]);
// Chamado quando o client envia uma mensagem
[Link]('message', (message) => {
// Se é uma mensagem string utf8
if ([Link] === 'utf8') {
// Mostra no console a mensagem
[Link](message.utf8Data);
}
});
Código Node Envios para os clients e evento de conexão fechada
// Cria uma função que será executada a cada 1 segundo
(1000 millis) para enviar o estado do led
let interval = setInterval(() => {
// Envia para o client "ON" ou "OFF" dependendo do
estado atual da variável state
[Link](state? "ON" : "OFF");
// Inverte o estado
state = !state;
}, 1000);// Tempo entre chamadas => 1000 millis = 1 segundo
// Chamado quando a conexão com o client é fechada
[Link]('close', () => {
[Link]("Conexão fechada");
// Remove o intervalo de envio de estado
clearInterval(interval);
});
});
Em [Link]
Download arquivos PDF e INO do código fonte
35