Тайм-аут TCP-соединения NodeMCU

Я пробую Elecrow ESP8266 и использую прошивку NodeMCU (nodemcu_integer_0.9.6-dev_20150704.bin). Мой код подключения выглядит так:

function foo()
  conn = net.createConnection(net.TCP, 0)      
  conn:on("connection", function() 
    text = "some text\r\n"
    conn:send(text)
  end)
  conn:connect(5000,"192.168.240.1")
end

Это в функции. Мой первый вопрос: когда мы выйдем из этой функции? Должен ли я явно иметь оператор «выход»? Я понимаю, что NodeMCU управляется событиями, и вызов для подключения происходит после логики, обрабатывающей «соединение» (в этот момент я что-то отправляю). Я согласен с этим, но мне интересно, как и когда мы выйдем из «foo».

Другое дело, как мне реализовать тайм-аут на этом? Я бы хотел, чтобы тайм-аут и выход, когда это произойдет.

Спасибо за любые советы.


person Bill Hamlin    schedule 07.12.2016    source источник
comment
Как вы думаете, почему вы не выходите из функции foo()?   -  person gre_gor    schedule 07.12.2016
comment
Также 0.9.6 старая и глючная. Используйте сборку с сайта nodemcu-build.com.   -  person gre_gor    schedule 07.12.2016


Ответы (1)


В этом фрагменте кода между функцией foo() и end вы определяете функцию foo(), не выполняя ее в данный момент.

Этот код будет выполняться, когда эта функция вызывается в другом коде с помощью функции foo().

Когда вы вызываете foo() и выполняется код foo(), когда вы вызываете foo() и выполняется код foo(), вы сначала

conn = net.createConnection(net.TCP, 0)

создать (в настоящем) сокет и присвоить его переменной conn. conn — это сокет с этого момента.

Затем,

conn:on("connection", function() 
  text = "some text\r\n"
  conn:send(text)
end)

вы назначаете функцию обратного вызова, которая будет выполняться в (будущем) событии, когда сокет установит соединение.

Затем,

conn:connect(5000,"192.168.240.1")

вы просите плагин попробовать соединение и выполнение функции foo() заканчивается (и foo() возвращается)

В воображаемой временной шкале все могло бы пойти так.

Когда интерпретатор читает код [функция foo() ... end], функция foo() определяется, но не выполняется.

0us foo() Код foo() начинает выполняться, потому что мы вызываем foo()

20us net.create... Сокет создан

40us conn:on... Определенная функция обратного вызова назначается сокету

60us conn:connect.. Сокет начинает попытку подключения

65 мкс Функция foo() завершается и возвращается, и выполняется "другой код"

120 мкс Сокет устанавливает соединение и запускается функция обратного вызова

125 us Код обратного вызова:

text = "some text\r\n"
conn:send(text)

выполняется параллельно с "другим кодом"

Будущее событие «сокет подключен» запускает в будущем обратный вызов, назначенный в настоящем, с помощью conn: on ()

person Mitxel    schedule 07.12.2016