NodeMCU向所有客户端广播

我想向连接到我的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,但这会占用太多内存。

我想要的

只创建一个连接?

点赞
用户2670348
用户2670348

您的代码正在使用TCP协议,这是一种本质上是单连接,点对点传输协议。没有所谓的“广播”TCP连接。TCP根本无法使用广播。这就像试图将汽车用作船一样。

如果您要发送少量信息,可以尝试使用UDP。缺点是UDP不可靠 - 您无法确定消息是否已收到 - 如果您想要回应,您需要编写更多的代码来接收回应,并且需要构建可靠性机制(如果未收到答案,将进行重传,并检测是否已丢弃答案),如果您在意的话。

我建议您尝试一下MQTT协议 - 它旨在使与多个客户端通信变得容易。它是轻量级的,MQTT客户端在NodeMCU和Arduino处理器上运行良好。NodeMCU的LUA实现中内置了 [MQTT客户端](https://nodemcu.readthedocs.io/en/master/en/modules/mqtt/)。

缺点是您需要一个MQTT代理,所有NodeMCU都将连接到该代理。代理通常在更有能力的处理器上运行(例如树莓派是一个不错的选择)或在Internet上外部运行(Adafruit在https://io.adafruit.com/上提供代理),尽管[一些实现可以在ESP8266上运行](https://github.com/martin-ger/uMQTTBroker)。

2018-10-27 14:29:02