Hoje quero te apresentar um
exemplo de WebSocket utilizando ESP32 e NodeJS. Neste caso, o Node no lado do
servidor, uma das melhores opções de linguagem para isso, acredito eu. Vou,
portanto, te mostrar a instalação e configuração do NodeJS, através de um
exemplo bem simples.
RECURSOS USADOS
- ESP32
- Led
- Resistor 330 ohm
- Protoboard
- Jumpers
- Computador WebSocket Server
INSTALAÇÃO DO NODE
Primeiro é necessário que o
Node esteja instalado na sua máquina.
Baixe a versão compatível com
o seu sistema operacional.
Após o download finalizar
execute o instalador.
É recomendado desativar o
antivírus (caso exista) para evitar problemas na instalação.
Siga a instalação padrão...
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
Vá em Configurações avançadas
do sistema
Vá em Variáveis de Ambiente
Em Variáveis do sistema,
procure por Path e clique em Editar
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:
1. npm install
2. node websocket.js
1. npm install
2. node websocket.js
Conceda a permissão de acesso
do Firewall
Pronto, uma mensagem será
exibida informando a porta em que o servidor está utilizando.
MONTAGEM
CÓDIGO
Bibliotecas necessárias
WebSocket Client ESP32
Fluxograma ESP32
Código ESP32
Declarações e Variáveis
#include <ArduinoWebsockets.h> const char* ssid = "NOME_REDE"; // Nome da rede const char* password = "SENHA_REDE"; // Senha da rede const char* websockets_server_host = "192.168.3.144"; // IP do servidor websocket const int 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;
Setup
void setup() { // Iniciamos a serial com velocidade de 115200 Serial.begin(115200); // Definimos o pino como saída pinMode(led, OUTPUT); // Conectamos o wifi WiFi.begin(ssid, password); // Enquanto não conectar printamos um "." while(WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(1000); } // Exibimos "WiFi Conectado" Serial.println("Connected to Wifi, Connecting to server.");
// Tentamos conectar com o websockets server bool connected = client.connect(websockets_server_host, websockets_server_port, "/"); // Se foi possível conectar if(connected) { // Exibimos mensagem de sucesso Serial.println("Connected!"); // Enviamos uma msg "Hello Server" para o servidor client.send("Hello Server"); } // Se não foi possível conectar else { // Exibimos mensagem de falha Serial.println("Not Connected!"); return; } // Iniciamos o callback onde as mesagens serão recebidas client.onMessage([&](WebsocketsMessage message) { // Exibimos a mensagem recebida na serial Serial.print("Got Message: "); Serial.println(message.data()); // Ligamos/Desligamos o led de acordo com o comando if(message.data().equalsIgnoreCase("ON")) digitalWrite(led, HIGH); else if(message.data().equalsIgnoreCase("OFF")) digitalWrite(led, LOW); }); }
Loop
void loop() { // De tempo em tempo, o websockets client checa por novas mensagens recebidas if(client.available()) client.poll(); delay(300); }
Código Node
Fluxograma 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 = http.createServer();
server.listen e wsServer
//Server irá escutar na porta definida em 'port' server.listen(port, () => { //Server está pronto console.log(`Server está executando na porta ${port}`); }); //Cria o WebSocket server wsServer = new WebSocketServer({ httpServer: server });
wsServer.on
//Chamado quando um client deseja conectar wsServer.on('request', (request) => { //Estado do led: false para desligado e true para ligado let state = false; //Aceita a conexão do client let client = request.accept(null, request.origin); //Chamado quando o client envia uma mensagem client.on('message', (message) => { //Se é uma mensagem string utf8 if (message.type === 'utf8') { //Mostra no console a mensagem console.log(message.utf8Data); } });
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 client.sendUTF(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 client.on('close', () => { console.log("Conexão fechada"); //Remove o intervalo de envio de estado clearInterval(interval); }); });
4 Comentários
Gracias por las explicaciones excelentes
ResponderExcluirCadê a pasta onde está o código NodeEchoWebSocket?
ResponderExcluirFunciona com esp8266?
ResponderExcluirFernando, me tornei membro no seu canal do Youtube, parabéns pela sua paciência e didática, eu preciso de uma recomendação por onde posso começar nos seus vídeos para desenvolver um sistema de controle distribuído usando Mesh com ESP32, preciso criar um banco de dados confiável, rápido para trocar informações com essa rede ESP32(Mesh), pretendo utilizar vários ESP32 no formato IOs Digital e Analógico e guardar essas informações no banco de dados e através de um ESP32(Master) programar a lógica e comandar/ler os ESP32 (slaves), preciso que seja rápido por que pretendo acionar dispositivos em função das variáveis recebidas, a ideia é toda informação estar alocada em uma matriz em um banco de dados e um ESP32 gerenciar essa atualização de dados, que podem ser acessados por outros dispositivos, inclusive para um painel supervisório, onde possa mostrar online todas as variáveis e poder enviar setpoints e comandos através do supervisório. Bom, não sei se fui claro, sou da área de automação, e seria algo parecido com SDCD com acionaamento wireless. Grato! Aguardo seu retorno, duque.julio@gmail.com.
ResponderExcluir