• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Поддержка mqtt в nodemcu

Victor

Administrator
Команда форума
Разработчики NodeMCU сделали новую ветку, в которой реализовали поддержку mqtt.
Код mqtt основан на этом проекте.

В этой ветке появился такой пример
Connect to MQTT Broker
Код:
mqtt = net.createConnection(net.TCP, 0)
-- for secure: mqtt = net.createConnection(net.TCP, 1)

-- init mqtt client with keepalive timer 30sec
mqtt:mqtt("clientid", 30, "user", "password")

-- on publish message receive event
mqtt:on("receive", function(conn, topic, data)
  print(topic .. ":" )
  if data ~= nil then
    print(data)
  end
end)

-- on connection event (all event inherit from net module)
mqtt:on("sent", function(con) print("sent") end)
mqtt:on("connection", function(con) print("connected") end)
mqtt:on("disconnection", function(con) print("disconnected") end)
mqtt:on("reconnection", function(con) print("reconnect") end)
mqtt:connect(1883,"192.168.11.118", function(conn) print("connected") end)
-- subscribe topic with qos = 0
mqtt:subscribe("/topic",0, function(conn) print("subscribe success") end)
-- publish a message
mqtt:send("/topic","hello",0,0, function(conn) print("sent") end)
 

pvvx

Активный участник сообщества
Всё те-же баги, т.к. используется espconn:

1) espconn_server_close устанавливает таймер os_timer_setfn(&psclose->pcommon.ptimer, espconn_sclose_cb, psclose); os_timer_arm(&psclose->pcommon.ptimer, TCP_FAST_INTERVAL, 0);

2) Пока работает таймер, на соединение с внешней стороны, приходит disconnect. Lwip закрывает соединение и уничтожает pcb структуру, на которую у espconn храниться указатель.

3) Отрабатывает таймер и запускает espconn_sclose_cb. Она берет запомненный указатель на уже несуществующую структуру и что-то сравнивает по данному указателю в памяти heap, где уже могут находиться данные от других процедур или lwip открыл и записал туда структуру нового соединения (это часто по распределению памяти). Т.к. espconn_sclose_cb ничего нужного там не находит, то запускает таймер снова: os_timer_arm(&psclose_cb->pcommon.ptimer, TCP_FAST_INTERVAL, 0); И так по кругу п.п. 3, пока не совпадут байты. Если байты в памяти совпадут с желаемыми у данной процедуры, и там распределено новое соединение, то она закроет это соединение. :)

А пока espconn_sclose_cb крутит таймер, пользователь открывает новое соединение в espconn. И там происходит аналогичное. При 4-ом зависшей на таймере espconn_sclose_cb больше соединений не открыть - лимит espconn. :)

Пользуйтесь на здоровье этой Lua сами :)
 

pvvx

Активный участник сообщества
Неужели этот баг не пофиксить? Исходники же есть..
Попробуйте. Заплатка выходит больше исходника espconn :) Алгоритмические ошибки бывают неизлечимыми...
Тем, кто хоть немного владеет СИ эта espconn не требуется, т.к. легче напрямую работать с Lwip.. Я вообще вырезал espconn из исходников. Памяти стало больше :)
 
Последнее редактирование:

NeoroN

Member
надеюсь автор nodemcu напишет прямую работу с Lwip когда поймет ущербность espconn.
 

skylocker

Member
надеюсь автор nodemcu напишет прямую работу с Lwip когда поймет ущербность espconn.
Для этого ему нужно открыть глаза - описать ситуацию в правильных терминах.
Я попытаюсь прям на github, но не факт, что опишу правильно (в СИ не спец), отпишите и Вы ему, плз.
 

MSW

New member
Тем, кто хоть немного владеет СИ эта espconn не требуется, т.к. легче напрямую работать с Lwip.. Я вообще вырезал espconn из исходников. Памяти стало больше
Не могла бы Вы написать пример как можно её вырезать и работать с Lwip
в си очень немного разбираюсь, вернее могу разобраться по примерам :) только проблема что не могу найти примерны как сделать на си страницу, которую отдавать по обращению через сеть к модулю
 
Сверху Снизу