0

我是一名 C# .net Xamarin 开发人员,他现在被困在将 MQTT 客户端移植到 ESP8266MOD wifi 芯片上,因为应该这样做的人没有这样做。

无论如何,我对任何东西都一无所知,我已经用文件、gpio、http、i2c、mqtt、net、node、tmr、uart、wifi 刷新了一个自定义 NodeMCU 构建,该版本是从 Fightanic 构建的。我正在关注foobarflies 的一个简单的 MQTT 项目

我已将以下文件上传到新刷新的芯片:

-- 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");

我得到.......

esplorer 抢

看来我应该看到 application.lua 中的一些字符串,例如“ping”或“successfully subscribed”,但我什么也没得到。就像 application.lua 没有运行一样。

任何帮助,将不胜感激。提前致谢。

- 标记

更新

我直接在连接对象之前添加了一个字符串并打印了它,因此它似乎锁定了正在处理该连接对象的连接对象。

4

1 回答 1

0

仅仅为了理解它的实际作用,就很难涉足这么多代码。在这里,我们更喜欢最小、完整和可验证的示例

您似乎了解您复制粘贴的代码背后的逻辑,对吧?该教程实际上非常好 - 但它是从 2015 年 10 月 7 日开始的。因为它是相当老的故障和错误是可以预料的。与此同时,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)并且只是默默地假设连接到代理,而不是先连接然后发布。

于 2017-04-14T19:29:33.363 回答