2017-07-01 37 views
0

我正在尝试向某个端口发送广播数据包,但似乎代码给出了一些我无法找到修复程序的奇怪错误。 我试过使用net.socket:connect(),然后调用“send()”方法,这没有奏效,然后我说我应该使用net.socket:on('connection')和发送那里,因为我想net.socket:connect()不同步。但是,这给了一个奇怪的错误太...当尝试调用net.socket时,NodeMCU崩溃:connect()

对于此代码:

function sendBroadcastPacket() 
    bip = wifi.sta.getbroadcast() 
    srv = net.createConnection(net.UDP,0) 
    print('Trying to connect on: ', bip) 
    srv:connect('9001', bip) 
    srv:send("Broadcast packet from: "..NODE_ID, function(sent) 
      print("Broadcasted packet! "..sent) 
     end) 
end 

我收到以下错误:

PANIC: unprotected error in call to Lua API (init.lua:24: attempt to call method 'connect' (a nil value))

第24行是SRV:连接线。

之后,我试图监听连接事件首先,看看它的工作是这样:

function sendBroadcastPacket() 
    bip = wifi.sta.getbroadcast() 
    srv = net.createConnection(net.UDP,0) 
    print('Trying to connect on: ', bip) 
    srv:on('connection', function(sck, c) 
     sck:send("Broadcast packet from: "..NODE_ID, function(sent) 
      print("Broadcasted packet! "..sent) 
     end) 
    end) 

    srv:connect('9001', bip) 
end 

我收到以下错误:

PANIC: unprotected error in call to Lua API (init.lua:24: invalid callback name)

第24行是SRV: ('连接')一行。

这里似乎在发生什么?谷歌的搜索结果并不多,因为很多其他人都使用Arduino-IDE版本(顺便说一下,这仍然是nodemcu还是你需要ESP8266的不同固件?)。 我正在获取广播IP,并且它连接到AP。我没有在这里发布无线连接部分,因为它的工作原理,我用它来测试mqtt和http连接的工作。

我正在使用的版本,SDK 2.1.0(116b762)上的Lua 5.1.4,包含net模块。

回答

1

您的尝试都失败了,因为您似乎认为UDP是无连接协议。因此,对于UDP,没有connect()on('connection'...

第一次尝试失败,因为send()需要在套接字上而不是在连接上调用。第二次失败,因为connection回叫名称仅适用于TCP,不适用于UDP。

尝试这样:

function sendBroadcastPacket() 
    local port = 9001 
    local bip = wifi.sta.getbroadcast() 
    print(string.format("Broadcasting to %s:%d", bip, port)) 
    net.createUDPSocket():send(port, bip, "foo bar") 
end 

文档:https://nodemcu.readthedocs.io/en/latest/en/modules/net/#netudpsocket-module

+0

这工作!非常感谢:),我真的开始失去希望,认为这是一个平台错误。 – Azurium

+0

我知道UDP是无连接的,但并没有真正质疑nodemcu方法,因为我得到了一些谷歌搜索结果的启发,而且,看起来像某人,也许你:),只是编辑了文档wiki,并在那里注明了_This将在即将发布的版本中发生变化,以便net.createConnection将始终创建未加密的TCP连接。我使用Wayback机器来确认我不是在做梦:))。我错过了文档中的createUDPSocket部分。 再次感谢! – Azurium

+0

不要相信大G可能带给你的来源。我们的API文档(与您的固件分支相匹配的文档)是唯一真实的来源。 –

相关问题