NodeMCU вылетает при попытке вызвать net.socket: connect ()

Я пытаюсь отправить широковещательный пакет на определенный порт, но мне кажется, что код выдает странные ошибки, исправить которые я не могу. Я пробовал использовать net.socket: connect (), а затем вызвать метод send (), который не сработал, затем я сказал, что должен использовать net.socket: on ('connection') и отправить туда, поскольку я полагаю, что net.socket: 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

Я получаю следующую ошибку:

ПАНИКА: незащищенная ошибка при вызове Lua API (init.lua: 24: попытка вызвать метод connect (нулевое значение))

Строка 24 - это строка srv: connect.

После этого я сначала попытался прослушать событие подключения, чтобы проверить, работает ли оно таким образом:

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

Я получаю следующую ошибку:

ПАНИКА: незащищенная ошибка при вызове Lua API (init.lua: 24: недопустимое имя обратного вызова)

Строка 24 - это строка srv: on ('connection').

Что, кажется, здесь происходит? В Google не так много результатов, так как многие другие люди используют версию Arduino-IDE (кстати, это все еще nodemcu или вам нужна другая прошивка для ESP8266?). Я получаю широковещательный IP-адрес, и он подключается к точке доступа. Я не публиковал здесь часть подключения к Wi-Fi, потому что она работает, я использовал ее для проверки подключений mqtt и http, которые работали.

В сборке, которую я использую, Lua 5.1.4 на SDK 2.1.0 (116b762), включен модуль net.


person Azurium    schedule 01.07.2017    source источник


Ответы (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

person Marcel Stör    schedule 01.07.2017
comment
Это сработало! Большое спасибо, чувак :), я действительно начинал терять надежду, думая, что это ошибка платформы. - person Azurium; 02.07.2017
comment
Я знал, что UDP не поддерживает соединение, но на самом деле не подвергал сомнению метод nodemcu, так как меня вдохновили некоторые результаты Google, а также, похоже, кто-то, возможно, вы :), просто отредактировал вики документации с этим окном внимания, где говорится: Это изменится в следующих выпусках, так что net.createConnection всегда будет создавать незашифрованное TCP-соединение. Я использовал машину Wayback, чтобы подтвердить, что я не сплю :)). Я пропустил часть createUDPSocket в документации thoug. Спасибо еще раз! - person Azurium; 02.07.2017
comment
Не верьте источникам, к которым вас может привести большая буква G. Наша документация по API (соответствующая вашей ветке прошивки) - единственный источник правды. - person Marcel Stör; 02.07.2017