2017-07-01 3 views
0

Ich versuche, ein Broadcast-Paket an einen bestimmten Port zu senden, aber es scheint, dass der Code einige seltsame Fehler gibt, für die ich keinen Fix finden kann. Ich habe versucht mit net.socket: connect() und dann den Aufruf der "send()" -Methode, die nicht funktioniert, dann sagte ich, dass ich die net.socket: on ('Verbindung') und verwenden sollte sende da, da nehme ich an net.socket: connect() ist nicht synchron. Aber das gab einen seltsamen Fehler zu ...NodeMCU stürzt beim Versuch ab, net.socket aufzurufen: connect()

Für diesen Code:

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 

ich die folgende Fehlermeldung:

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

Linie 24 ist die srv: connect Linie.

Danach habe ich versucht, für das Verbindungsereignis hören, zuerst zu sehen, ob es so funktioniert:

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 

ich die folgende Fehlermeldung:

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

Linie 24 ist die srv: on ('Verbindung') Linie.

Was scheint hier zu geschehen? Es gibt nicht viele Google-Ergebnisse, da viele andere Leute die Arduino-IDE-Version verwenden (übrigens, ist das noch nodemcu oder brauchst du eine andere Firmware für das ESP8266?). Ich bekomme eine Broadcast-IP, und es verbindet sich mit dem AP. Ich habe hier nicht den WLAN-Verbindungsteil gepostet, weil es funktioniert, ich habe es verwendet, um mqtt und http-Verbindungen zu testen, die funktionierten.

Der Build, den ich benutze, Lua 5.1.4 auf SDK 2.1.0 (116b762), hat das Netz Modul enthalten.

Antwort

1

Ihre Versuche sind alle fehlgeschlagen, weil Sie nicht davon ausgehen, dass UDP ein verbindungsloses Protokoll ist. Daher gibt es keine connect() oder on('connection'... für UDP.

Der erste Versuch ist fehlgeschlagen, weil send() auf einem Socket und nicht auf der Verbindung aufgerufen werden muss. Der zweite Fehler trat auf, weil der Rückrufname connection nur für TCP, nicht für UDP verfügbar ist.

versuchen, etwas wie folgt aus:

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 

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

+0

Das hat geklappt! Vielen Dank Mann :), ich begann wirklich die Hoffnung zu verlieren zu denken, dass es ein Plattform-Bug war. – Azurium

+0

Ich wusste, UDP ist verbindungslos, aber nicht wirklich die nodemcu-Methode in Frage, da ich von einigen Google-Ergebnissen inspiriert wurde, und auch, scheint wie jemand, vielleicht Sie :), bearbeitet gerade die Dokumentation Wiki mit der Aufmerksamkeitsbox, wo es _This sagt wird sich in kommenden Releases ändern, so dass net.createConnection immer eine unverschlüsselte TCP-Verbindung erstellen wird. Ich habe den Wayback-Rechner benutzt, um zu bestätigen, dass ich nicht träume :)). Ich habe den createUDPSocket-Teil in der Dokumentation vermisst. Danke nochmal! – Azurium

+0

Vertraue nicht den Quellen, zu denen dich G führen könnte. Unsere API-Dokumentation (diejenige, die zu Ihrer Firmware-Filiale passt) ist die einzige Quelle der Wahrheit. –

Verwandte Themen