ESP32 - WebSocket

Neste tutorial, vamos aprender o que é o WebSocket, por que precisamos usá-lo para controlar o ESP32 de forma fluida e como usar o WebSocket com o ESP32. Em um exemplo prático, vamos aprender a criar um aplicativo de chat entre o navegador e o ESP32, que permite:

ESP32 websocket

O que é o WebSocket do ESP32?

Agora você pode estar se perguntando: "O que é o WebSocket?" É bem simples: o WebSocket é uma tecnologia que permite que um navegador converse diretamente com um servidor web em tempo real.

  • Sem o WebSocket, você precisa atualizar a página para receber novidades. Isso não é muito conveniente.
  • Com o WebSocket, a página e o servidor ficam conectados o tempo todo. Isso significa que eles podem trocar informações instantaneamente, sem precisar recarregar a página.

Você provavelmente encontra o WebSocket em aplicativos web do dia a dia, como jogos online, mensagens instantâneas e atualizações do mercado de ações.

Por que precisamos do WebSocket para controlar o ESP32 de forma fluida?

Imagine que você quer controlar seu carrinho de controle remoto usando uma interface web no celular ou no computador. Sem o WebSocket, toda vez que você quisesse mudar a direção ou a velocidade do carrinho, precisaria atualizar a página web. É como ter que apertar um botão de "recarregar" toda vez que quer que seu comando chegue ao carrinho.

Agora, com o WebSocket, é como ter uma conexão contínua e direta entre o seu celular ou computador e o carrinho. Você não precisa mais atualizar a página toda vez que quer guiar o carrinho ou ajustar a velocidade. É como se o carrinho estivesse sempre ouvindo seus comandos em tempo real, sem atrasos causados por recarregamentos constantes da página.

Em geral, o WebSocket permite que você:

  • Envie dados do navegador para o ESP32 sem recarregar a página.
  • Envie dados do ESP32 para o navegador sem recarregar a página.

Isso permite uma comunicação bidirecional em tempo real.

Benefícios do WebSocket com o ESP32:

  • Controle em Tempo Real: O WebSocket permite comunicação instantânea com o ESP32, garantindo respostas rápidas aos comandos para uma experiência de uso fluida.
  • Conexão Persistente: Mantenha uma ligação contínua sem atualizar a página de controle, criando uma linha de comunicação sempre pronta para instruções imediatas.
  • Eficiência: Tenha respostas rápidas sem a necessidade de recarregar a página o tempo todo, melhorando a satisfação e a eficiência de uso.

Chat Web com o ESP32 via WebSocket

O conteúdo da página web (HTML, CSS, JavaScript) fica armazenado separadamente em um arquivo index.h. Assim, teremos dois arquivos de código no Arduino IDE:

  • Um arquivo .ino, que é o código do ESP32 e cria um servidor web e um servidor WebSocket
  • Um arquivo .h, que contém o conteúdo da página web.

Passos Rápidos

  • Se esta é a primeira vez que você usa o ESP32, veja como configurar o ambiente para ESP32 no Arduino IDE.
  • Conecte a placa ESP32 ao seu PC por um cabo micro USB
  • Abra o Arduino IDE no seu PC.
  • Selecione a placa ESP32 correta (por exemplo, ESP32 Dev Module) e a porta COM.
  • Abra o Library Manager clicando no ícone Library Manager na barra de navegação à esquerda do Arduino IDE.
  • Pesquise por “DIYables ESP32 WebServer” e encontre a biblioteca Web Server criada pela DIYables.
  • Clique no botão Install para instalar a biblioteca Web Server.
ESP32 Web Server library
  • No Arduino IDE, crie um novo sketch e dê um nome a ele, por exemplo, newbiely.com.ino
  • Copie o código abaixo e abra no Arduino IDE
/* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-websocket */ #include <DIYables_ESP32_WebServer.h> #include "index.h" // WiFi credentials const char WIFI_SSID[] = "YOUR_WIFI_SSID"; const char WIFI_PASSWORD[] = "YOUR_WIFI_PASSWORD"; // Create web server instance DIYables_ESP32_WebServer server; DIYables_ESP32_WebSocket* webSocket; // Web Page handlers void handleHome(WiFiClient& client, const String& method, const String& request, const QueryParams& params, const String& jsonData) { // HTML_CONTENT from the index.h file server.sendResponse(client, HTML_CONTENT); } // WebSocket event handlers void onWebSocketOpen(net::WebSocket& ws) { Serial.println("New WebSocket connection"); // Send welcome message const char welcome[] = "Connected to ESP32 WebSocket Server!"; } void onWebSocketMessage(net::WebSocket& ws, const net::WebSocket::DataType dataType, const char* message, uint16_t length) { Serial.print("WebSocket Received ("); Serial.print(length); Serial.print(" bytes): "); Serial.println(message); // Broadcast response to all connected clients using the library if (webSocket != nullptr) { String response = "Received: " + String((char*)message); webSocket->broadcastTXT(response); Serial.print("WebSocket sent ("); Serial.print(response.length()); Serial.print(" bytes): "); Serial.println(response); } } void onWebSocketClose(net::WebSocket& ws, const net::WebSocket::CloseCode code, const char* reason, uint16_t length) { Serial.println("WebSocket client disconnected"); } void setup() { Serial.begin(9600); delay(1000); Serial.println("ESP32 Web Server and WebSocket Server"); // Configure web server routes server.addRoute("/", handleHome); // Start web server with WiFi connection server.begin(WIFI_SSID, WIFI_PASSWORD); // Enable WebSocket functionality webSocket = server.enableWebSocket(81); if (webSocket != nullptr) { // Set up WebSocket event handlers webSocket->onOpen(onWebSocketOpen); webSocket->onMessage(onWebSocketMessage); webSocket->onClose(onWebSocketClose); } else { Serial.println("Failed to start WebSocket server"); } } void loop() { // Then handle HTTP requests server.handleClient(); // Handle WebSocket server.handleWebSocket(); }
  • Modifique as informações de WiFi (SSID e senha) no código para corresponder às credenciais da sua rede.
  • Crie o arquivo index.h no Arduino IDE da seguinte forma:
    • Clique no botão logo abaixo do ícone do Serial Monitor e escolha New Tab, ou use as teclas Ctrl+Shift+N.
    Arduino IDE 2 adds file
    • Dê ao arquivo o nome index.h e clique no botão OK
    Arduino IDE 2 adds file index.h
    • Copie o código abaixo e cole no index.h.
    /* * Este código de ESP32 foi desenvolvido por pt.newbiely.com * Este código de ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp32/esp32-websocket */ const char *HTML_CONTENT = R"=====( <!DOCTYPE html> <!-- saved from url=(0019)http://192.168.0.2/ --> <html><head><meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <title>ESP32 WebSocket</title> <meta name="viewport" content="width=device-width, initial-scale=0.7"> <link rel="icon" href="https://diyables.io/images/page/diyables.svg"> <style> /* Add some basic styling for the chat window */ body { font-size: 16px; } .chat-container { width: 400px; margin: 0 auto; padding: 10px; } .chat-messages { height: 250px; overflow-y: auto; border: 1px solid #444; padding: 5px; margin-bottom: 5px; } .user-input { display: flex; margin-bottom: 20px; } .user-input input { flex: 1; border: 1px solid #444; padding: 5px; } .user-input button { margin-left: 5px; background-color: #007bff; color: #fff; border: none; padding: 5px 10px; cursor: pointer; } .websocket { display: flex; align-items: center; margin-bottom: 5px; } .websocket button { background-color: #007bff; color: #fff; border: none; padding: 5px 10px; cursor: pointer; } .websocket .label { margin-left: auto; } </style> <script> var ws; var wsm_max_len = 4096; /* bigger length causes uart0 buffer overflow with low speed smart device */ function update_text(text) { var chat_messages = document.getElementById("chat-messages"); chat_messages.innerHTML += text + '<br>'; chat_messages.scrollTop = chat_messages.scrollHeight; } function send_onclick() { if(ws != null) { var message = document.getElementById("message").value; if (message) { document.getElementById("message").value = ""; ws.send(message + "\n"); update_text('<span style="color:navy">' + message + '</span>'); // You can send the message to the server or process it as needed } } } function connect_onclick() { if(ws == null) { ws = new WebSocket("ws://" + window.location.host + ":81"); document.getElementById("ws_state").innerHTML = "CONNECTING"; ws.onopen = ws_onopen; ws.onclose = ws_onclose; ws.onmessage = ws_onmessage; } else ws.close(); } function ws_onopen() { document.getElementById("ws_state").innerHTML = "<span style='color:blue'>CONNECTED</span>"; document.getElementById("bt_connect").innerHTML = "Disconnect"; document.getElementById("chat-messages").innerHTML = ""; } function ws_onclose() { document.getElementById("ws_state").innerHTML = "<span style='color:gray'>CLOSED</span>"; document.getElementById("bt_connect").innerHTML = "Connect"; ws.onopen = null; ws.onclose = null; ws.onmessage = null; ws = null; } function ws_onmessage(e_msg) { e_msg = e_msg || window.event; // MessageEvent console.log(e_msg.data); update_text('<span style="color:blue">' + e_msg.data + '</span>'); } </script> </head> <body> <div class="chat-container"> <h2>ESP32 WebSocket</h2> <div class="websocket"> <button class="connect-button" id="bt_connect" onclick="connect_onclick()">Connect</button> <span class="label">WebSocket: <span id="ws_state"><span style="color:blue">CLOSED</span></span></span> </div> <div class="chat-messages" id="chat-messages"></div> <div class="user-input"> <input type="text" id="message" placeholder="Type your message..."> <button onclick="send_onclick()">Send</button> </div> <div class="sponsor">Sponsored by <a href="https://amazon.com/diyables">DIYables</a></div> </div> </body></html> )=====";
    • Agora você tem o código em dois arquivos: newbiely.com.ino e index.h
    • Clique no botão Upload no Arduino IDE para fazer o upload do código para o ESP32.
    • Abra o Serial Monitor
    • Veja o resultado no Serial Monitor.
    ∞
    Newbiely | Arduino IDE 2.3.8
    ──
    ☐
    ✕
    File
    Edit
    Sketch
    Tools
    Help
    ESP32 Dev Module
    Newbiely.ino
    ···
    8 Serial.println("Hello World!");
    Output
    Serial Monitor
    Message (Enter to send message to 'ESP32 Dev Module' on 'COM15')
    New Line
    9600 baud
    Connecting to WiFi... Connected to WiFi ESP32 Web Server's IP address IP address: 192.168.0.2
    Ln 11, Col 1
    ESP32 Dev Module on COM15
    2
    • Anote o endereço IP exibido e digite esse endereço na barra de endereços de um navegador no seu celular ou PC.
    • Você verá a página web como abaixo:
    ESP32 websocket web browser
    • Clique no botão CONNECT para conectar a página ao ESP32 via WebSocket.
    • Digite algumas palavras e envie-as ao ESP32.
    • Você verá a resposta do ESP32.
    ESP32 websocket chat server

    ※ Nota:

    • Se você modificar o conteúdo HTML no index.h e não mexer em nada no arquivo newbiely.com.ino, ao compilar e fazer o upload do código para o ESP32, o Arduino IDE não vai atualizar o conteúdo HTML.
    • Para fazer o Arduino IDE atualizar o conteúdo HTML nesse caso, faça uma alteração no arquivo newbiely.com.ino (por exemplo, adicione uma linha vazia ou um comentário....)

    Explicação do Código Linha por Linha

    O código do ESP32 acima contém uma explicação linha por linha. Leia os comentários no código!

Como o Sistema Funciona

O código do ESP32 funciona criando um servidor web e um servidor WebSocket. O processo acontece assim:

  • Quando você digita o endereço IP do ESP32 em um navegador, é feita uma requisição da página web (Interface do Usuário) ao ESP32.
  • O servidor web do ESP32 responde enviando o conteúdo da página web (HTML, CSS, JavaScript).
  • Em seguida, o seu navegador exibe a página web.
  • Quando você clica no botão CONNECT, o código JavaScript embutido na página web estabelece uma conexão WebSocket com o servidor WebSocket no ESP32.
  • Com a conexão WebSocket estabelecida, quando você digita algo e clica no botão SEND, o código JavaScript envia esse texto ao ESP32 pela conexão WebSocket, em segundo plano.
  • Ao receber o valor do ângulo, o servidor WebSocket envia uma resposta de volta à página web.

Você pode conhecer outros exemplos de WebSocket com ESP32 abaixo:

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!