NodeMCU广播给所有客户端

时间:2018-10-27 13:26:57

标签: tcp lua broadcast esp8266 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,但这会占用太多内存。

我想要的

仅创建一个连接?

1 个答案:

答案 0 :(得分:1)

您的代码使用的是TCP,它本质上是一个单连接的点对点协议。没有所谓的“广播” TCP连接。 TCP根本无法使用广播工作。就像试图将汽车当作船来使用。

如果要发送少量信息,则可以尝试使用UDP。缺点是UDP不可靠-无法确定已收到消息-如果需要,您将需要更多代码来接收响应,并且需要建立可靠性机制(重新传输)如果没有收到答案,请检查重传,以防万一答案丢失了。

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

缺点是您需要一个所有NodeMCU都将连接到的MQTT代理。尽管https://io.adafruit.com/,代理通常在更强大的处理器(Raspberry Pi是一个不错的选择)上运行,或者在Internet外部(Adafruit在there are some implementations that run on an ESP8266提供代理)上运行,尽管{{3}}。