首页 > 解决方案 > 如何在 AP 模式下使用 ESP8266 一次向多个客户端发送数据

问题描述

所以我在 AP 模式下有一个 ESP8266(ESP-01)并且工作得相当好。我可以从客户端接收数据并使用 AJAX 来处理数据。当连接到单个客户端时,如果我从串行发送数据,它会显示在客户端网页上并且按预期工作。但是当我连接多个客户端时,只有最后一个连接的客户端获取数据,而旧的客户端保持静态。有没有办法一次将数据发送给多个客户端?

这是代码。

#include <ESP8266WiFi.h>
#include <DNSServer.h>
#include <ESP8266WebServer.h>

const byte DNS_PORT = 53;
IPAddress apIP(172, 217, 28, 1);
DNSServer dnsServer;
ESP8266WebServer webServer(80);

void handleRoot() {
  String html ="<!DOCTYPE html> <html style=\"text-align: center; background-color: #000000; border-style: solid; border-width: 5px; border-color: #FFFFFF;\"> <head> <title>EDNCS</title> <meta name=\"viewport\" content=\"width=device-width, minimumscale=1.0, maximum-scale=1.0, initial-scale=1\" /> </head> <body> <h1 style=\"color: #ff6600;\">Emergency Distributed Network Communication Service</h1> <p style=\"text-align: right; color: #ffff00;\">-Owned and maintained by Wolf Lusana.</p> <div style=\"color: #339966\"> <div> <strong><span style=\"color: #ff0000;\">Name: </span><input type=\"text\" id=\"name\"> <h2 span style=\"color: #ff6600;\">IMPORTANT BROADCASTS</h2> <div id=\"chatRoomDiv\" style=\"border:2px solid #ccc; width:300px; height: 300px; overflow-y: scroll; overscroll-behavior-x:unset; color:#FFFFFF; margin: 0 auto; display: flex; flex-direction: column-reverse;\"> <ul id=\"chatRoomList\" style=\"list-style-type: none; text-align: left;font-size: 14px; padding-left: 3px;\"></ul> </div> <br> <strong><span style=\"color: #ff0000;\">Message: </span> <input type=\"text\" id=\"message\"> <br><br> <button type=\"button\" onclick=\"sendData()\">CHAT</button> <button type=\"button\" >BROADCAST</button> <br> <script> function sendData() { var inputDataCH = document.getElementById(\"message\").value; var nameDataCH = document.getElementById(\"name\").value; var showDataCH = nameDataCH+\": \"+inputDataCH; if(nameDataCH==null||nameDataCH==\" \"||nameDataCH==\"\"||inputDataCH==null||inputDataCH==\" \"||inputDataCH==\"\"){ alert(\"Please enter your name and message. Thank you.\");} else{ var xhttpCH = new XMLHttpRequest(); xhttpCH.open(\"GET\", \"catchData?data=!\"+showDataCH, true); xhttpCH.send(); document.getElementById(\"message\").value = ''} } setInterval(function() { getData(); }, 500); function getData() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { updateChatRoom(this.responseText); } }; xhttp.open(\"GET\", \"throwData\", true); xhttp.send(); } function updateChatRoom(needData){ var ulCH = document.getElementById(\"chatRoomList\"); var liCH = document.createElement(\"li\"); var objDivCH = document.getElementById(\"chatRoomDiv\"); objDivCH.scrollTop = objDivCH.scrollHeight; liCH.appendChild(document.createTextNode(needData)); ulCH.appendChild(liCH); } </script> </html>";
  webServer.send(200, "text/html", html);
}

void handleData() {
 String dataChat = webServer.arg("data");  
 if(dataChat[0]=='!'){
  dataChat[0] = '%';
  Serial.println(dataChat);
  }
}

void handleThrow() {
  String throwData;
 if (Serial.available() > 0) {
  throwData = Serial.readString();
  }
 webServer.send(200, "text/plane", throwData); 
}

void setup() {
  Serial.begin(115200);
  WiFi.mode(WIFI_AP); 
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP("Emergency Network Service");
  dnsServer.start(DNS_PORT, "*", apIP);
  webServer.onNotFound([]() {
     handleRoot();
  });
  
  webServer.on("/",handleRoot);
  webServer.on("/catchData", handleData);
  webServer.on("/throwData", handleThrow);
  webServer.begin();
}

void loop() {
  dnsServer.processNextRequest();
  webServer.handleClient();
}

这是HTML代码

<!DOCTYPE html>
<html style="text-align: center; background-color: #000000; border-style: solid; border-width: 5px; border-color: #FFFFFF;">
    <head>
        <title>EDNCS</title>
        <meta name="viewport" content="width=device-width, minimumscale=1.0, maximum-scale=1.0, initial-scale=1" />
    </head>
    <body>
        <h1 style="color: #ff6600;">Emergency Distributed Network Communication Service</h1>
<p style="text-align: right; color: #ffff00;">-Owned and maintained by Wolf Lusana.</p>
<div style="color: #339966">
<p>Please enter your name before sending your message on the network.</p>
<div>
    <strong><span style="color: #ff0000;">Name: </span><input type="text" id="name">
<h2 span style="color: #ff6600;">IMPORTANT BROADCASTS</h2>
<div id="chatRoomDiv" style="border:2px solid #ccc; width:300px; height: 300px; overflow-y: scroll; overscroll-behavior-x:unset; color:#FFFFFF; margin: 0 auto; display: flex;
flex-direction: column-reverse;">
    <ul id="chatRoomList" style="list-style-type: none; text-align: left;font-size: 14px; padding-left: 3px;"></ul>
</div>
<br>
<strong><span style="color: #ff0000;">Message: </span> <input type="text" id="message"> 
<br><br>
<button type="button" onclick="sendData()">CHAT</button> <button type="button" >BROADCAST</button>
<br>

<script>
    function sendData() {
  var inputDataCH = document.getElementById("message").value;
  var nameDataCH = document.getElementById("name").value;
  var showDataCH = nameDataCH+": "+inputDataCH;
  if(nameDataCH==null||nameDataCH==" "||nameDataCH==""||inputDataCH==null||inputDataCH==" "||inputDataCH==""){
    alert("Please enter your name and message. Thank you.");}
  else{
    var xhttpCH = new XMLHttpRequest();
  xhttpCH.open("GET", "catchData?data=!"+showDataCH, true);
  xhttpCH.send();
  document.getElementById("message").value = ''}
  }


  setInterval(function() {
  getData();
  }, 500);
 
  function getData() {
    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        updateChatRoom(this.responseText);
      }
    };
    xhttp.open("GET", "throwData", true);
    xhttp.send();
  }

  function updateChatRoom(needData){
  var ulCH = document.getElementById("chatRoomList");
  var liCH = document.createElement("li");
  var objDivCH = document.getElementById("chatRoomDiv");
  objDivCH.scrollTop = objDivCH.scrollHeight;
  liCH.appendChild(document.createTextNode(needData));
  ulCH.appendChild(liCH);
  }

</script>

</html>

谢谢。

标签: ajaxarduinoesp8266nodemcuarduino-esp8266

解决方案


推荐阅读