如何在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,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,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>

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...