• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
в си очень немного разбираюсь, вернее могу разобраться по примерам :) только проблема что не могу найти примерны как сделать на си страницу, которую отдавать по обращению через сеть к модулю
 
Сверху Снизу