NodeMCU 向所有客户端广播

NodeMCU broadcast to all clients

我想向连接到我的 esp8266 12f 接入点的所有客户端广播请求

我用它来为每个客户端创建一个连接,这意味着如果有 3 个客户端,它将创建 3 个连接。

for mac,ip in pairs(wifi.ap.getclient()) do

   srv= net.createConnection(net.TCP, 0)
   srv:on("receive", function(client, b_response) srv:close() collectgarbage() end)
   srv:on("connection", function(client, b_request) client:send(request) end)
   srv:connect(80, ip)

end

我尝试了广播 ip srv:connect(80, "255.255.255.255") 但没有发送任何内容

问题:-

我使用的是每个 srv 都会覆盖之前的 srv 所以如果它被延迟我无法得到响应,即使如此我可以用不同的名称命名每个 srv名称如 srv_1srv_2srv_3 但这会占用太多内存。

我想要什么

只创建一个连接?

您的代码使用的是 TCP,它本质上是一个单一连接的点对点协议。没有 "broadcast" TCP 连接这样的东西。 TCP 使用广播根本不起作用。这就好比以车为船。

如果您要发送少量信息,您可以尝试使用 UDP。缺点是 UDP 不可靠——你不能确定你的消息是否收到了——你需要更多的代码来接收响应,如果你想要的话,你需要建立一个可靠性机制(重传如果没有收到答案,检测重传以防答案被丢弃)如果你关心的话。

我建议您查看 MQTT 协议 - 它旨在简化与多个客户端的通信。它是轻量级的,MQTT 客户端 运行 在 NodeMCU 和 Arduino 处理器上运行良好。有 an MQTT client built into NodeMCU's LUA implementation.

缺点是您需要一个 MQTT 代理,您的所有 NodeMCU 都将连接到该代理。经纪人通常 运行 在功能更强大的处理器上(Raspberry Pi 是一个不错的选择)或在外部互联网上(Adafruit 在 https://io.adafruit.com/), although there are some implementations that run on an ESP8266.

提供经纪人