You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP8266 Socket服务器如何向多个客户端推送AIS/GPS数据?

解决ESP8266 Socket服务器多客户端数据推送问题

你的代码当前只能服务单个客户端,核心问题是loop()中通过server.available()获取单个客户端后,进入阻塞式的while(client.connected())循环,无法响应新的连接请求。要实现同时向2个客户端推送AIS/GPS数据,需要维护一个客户端连接列表,循环处理所有连接和数据推送。

修改后的完整代码

#include "ESP8266WiFi.h"

const int port = 8888;
WiFiServer server(port);
const int maxClients = 2; // 设定最大支持2个客户端
WiFiClient clients[maxClients]; // 存储客户端连接的数组
String newHostname = "AISnode";
// 请在这里补充你的WiFi账号密码
const char* ConSSID = "你的WiFi名称";
const char* PassWord = "你的WiFi密码";

void setup() {
  Serial.begin(38400);

  // GetSSID(); // 假设这个函数是你用来获取WiFi信息的,需确保它能正确设置ConSSID和PassWord
  delay(2000);

  WiFi.hostname("NodeMCU");
  WiFi.mode(WIFI_STA);
  WiFi.begin(ConSSID, PassWord);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.print(".");
  }
  Serial.println("\nWiFi已连接");
  server.begin();
  Serial.printf("服务器已启动,端口:%d\n", port);
}

void loop() {
  // 1. 处理新的客户端连接
  WiFiClient newClient = server.available();
  if (newClient) {
    // 遍历数组找空位,添加新客户端
    for (int i = 0; i < maxClients; i++) {
      if (!clients[i]) { // 该位置无有效连接
        clients[i] = newClient;
        Serial.printf("新客户端连接,当前连接数:%d\n", getConnectedClientsCount());
        break;
      }
    }
  }

  // 2. 推送串口收到的AIS/GPS数据给所有在线客户端
  if (Serial.available() > 0) {
    // 先读取完整的串口数据(避免分开发送)
    String data = Serial.readStringUntil('\n');
    // 遍历所有客户端发送数据
    for (int i = 0; i < maxClients; i++) {
      if (clients[i] && clients[i].connected()) {
        clients[i].println(data);
        // 确保数据发送完成
        clients[i].flush();
      }
    }
  }

  // 3. 清理断开的客户端连接
  for (int i = 0; i < maxClients; i++) {
    if (clients[i] && !clients[i].connected()) {
      clients[i].stop();
      Serial.printf("客户端断开连接,当前连接数:%d\n", getConnectedClientsCount());
    }
  }

  delay(10); // 短暂延迟,避免占用过多CPU资源
}

// 辅助函数:统计当前在线客户端数量
int getConnectedClientsCount() {
  int count = 0;
  for (int i = 0; i < maxClients; i++) {
    if (clients[i] && clients[i].connected()) {
      count++;
    }
  }
  return count;
}

关键改动说明

  • 维护客户端连接列表:用WiFiClient数组存储最多2个客户端连接,避免阻塞单个连接的处理
  • 非阻塞式处理:去掉原代码中阻塞的while(client.connected())循环,改为在每次loop()中轮询处理新连接、数据推送和断开清理
  • 批量数据推送:读取完整的串口数据后,遍历所有在线客户端统一发送,保证数据完整性
  • 连接状态管理:定期检查客户端连接状态,清理无效连接,释放数组位置给新客户端

注意事项

  • 请确保补充你的WiFi账号密码到ConSSID和PassWord变量中
  • 如果你的GetSSID()函数负责自动获取WiFi信息,需保证它能正确赋值给ConSSID和PassWord
  • 若需要支持更多客户端,只需修改maxClients的值即可

内容的提问来源于stack exchange,提问作者Aad Bloem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 01:37:33