NodeMCU ESP8266MOD Esplorer MQTT простой MQTT от foobarflies
Я - разработчик на C# .net Xamarin, который сейчас застрял, портируя MQTT-клиент на Wi-Fi-чип ESP8266MOD, потому что парень, который должен был это делать, не сделал этого.
Так или иначе, не зная ничего, я прошил собственную сборку NodeMCU из fightanic с файлом, gpio, http, i2c, mqtt, net, node, tmr, uart, wifi. Я слежу за простым MQTT-проектом от foorbarflies.
Я загрузил следующие файлы в недавно прошитый чип:
-- file : config.lua
local module = {}
module.SSID = {}
module.SSID["xxxxx xxxxxxx"] = "xxxxxxxxxxxxxxxxx"
module.HOST = "mqtt.xxxxxxxxxxx.com"
module.PORT = 1883
module.ID = node.chipid()
module.ENDPOINT = "nodemcu/"
return module
-- file: setup.lua
local module = {}
local function wifi_wait_ip()
if wifi.sta.getip()== nil then
print("IP unavailable, Waiting...")
else
tmr.stop(1)
print("\n====================================")
print("ESP8266 mode is: " .. wifi.getmode())
print("MAC address is: " .. wifi.ap.getmac())
print("IP is "..wifi.sta.getip())
print("====================================")
app.start()
end
end
local function wifi_start(list_aps)
if list_aps then
for key,value in pairs(list_aps) do
if config.SSID and config.SSID[key] then
wifi.setmode(wifi.STATION);
wifi.sta.config(key,config.SSID[key])
wifi.sta.connect()
print("Connecting to " .. key .. " ...")
--config.SSID = nil -- can save memory
tmr.alarm(1, 2500, 1, wifi_wait_ip)
end
end
else
print("Error getting AP list")
end
end
function module.start()
print("Configuring Wifi ...")
wifi.setmode(wifi.STATION);
wifi.sta.getap(wifi_start)
end
return module
-- file : application.lua
local module = {}
m = nil
-- Sends a simple ping to the broker
local function send_ping()
m:publish(config.ENDPOINT .. "ping","id=" .. config.ID,0,0)
end
-- Sends my id to the broker for registration
local function register_myself()
m:subscribe(config.ENDPOINT .. config.ID,0,function(conn)
print("Successfully subscribed to data endpoint")
end)
end
local function mqtt_start()
m = mqtt.Client(config.ID, 120)
-- register message callback beforehand
m:on("message", function(conn, topic, data)
if data ~= nil then
print(topic .. ": " .. data)
-- do something, we have received a message
end
end)
-- Connect to broker
m:connect(config.HOST, config.PORT, 0, 1, function(con)
register_myself()
-- And then pings each 1000 milliseconds
tmr.stop(6)
tmr.alarm(6, 1000, 1, send_ping)
end)
end
function module.start()
mqtt_start()
end
return module
-- file : test.lua
app = require("application")
config = require("config")
setup = require("setup")
setup.start()
Я отправил команду dofile("test.lua");
и я получаю.......
Кажется, я должен увидеть некоторые строки из application.lua, такие как "ping" или "успешно подписан", но я ничего не получаю. Это как application.lua не работает.
Любая помощь будет оценена. Заранее спасибо.
-- Отметка
Обновить
Я добавил строку непосредственно перед объектом подключения, и она распечаталась, так что теперь кажется, что она запирает объект подключения, работающий над этим.
1 ответ
На самом деле очень сложно разобраться в таком большом количестве кода, просто чтобы понять, что он на самом деле делает. Здесь мы предпочитаем минимальные, полные и проверяемые примеры.
Кажется, вы понимаете логику кода, который вы вставили, правильно? Этот урок действительно хорош - но с 7 октября 2015 года. Поскольку он довольно старый, можно ожидать глюков и ошибок. За это время многое изменилось в прошивке NodeMCU.
Проблема, очевидно, должна быть в application.lua
, Чтобы понять NodeMCU MQTT, я предлагаю вам взглянуть на пример в нашей документации. Это говорит:
m:connect("192.168.11.118", 1883, 0, function(client)
print("connected")
-- Calling subscribe/publish only makes sense once the connection
-- was successfully established. You can do that either here in the
-- 'connect' callback or you need to otherwise make sure the
-- connection was established (e.g. tracking connection status or in
-- m:on("connect", function)).
-- publish a message with data = hello, QoS = 0, retain = 0
client:publish("/topic", "hello", 0, 0, function(client) print("sent") end)
Ваш send_ping()
однако вызывается асинхронно из таймера (tmr.alarm(6, 1000, 1, send_ping)
) и просто молча предполагает подключение к брокеру, а не подключение сначала, а затем публикацию.