MQTT/ESP8266/NodeMCU/Lua代码未发布



我在ESP8266…上的以下Lua代码有问题

function sendData(humidity,temperature)
    -- Setup MQTT client and events
    print("sendData() entered")
    print("Setting up mqtt.Client...")
    m = mqtt.Client(mqtt_client_id, 120, username, password)
    print("Attempting client connect...")
    m:connect(mqtt_broker_ip , mqtt_broker_port, 0, function(conn)
        print("Connected to MQTT")
        print("  IP: " .. mqtt_broker_ip)
        print("  Port: " .. mqtt_broker_port)
        print("  Client ID: " .. mqtt_client_id)
        print("  Username: " .. mqtt_username)
        payload = "Temp: " .. temperature .. " Hmdy: " .. humidity
        m:publish("pt/env",payload, 0, 0, function(conn)
            print("Going to deep sleep for " .. (DSLEEPTIME/1000) .. " seconds")
            node.dsleep(DSLEEPTIME*1000,4)             
        end)
    end)
end

正在使用以下命令成功调用代码。。。

-- Connect to network
wifi.setmode(wifi.STATION)
wifi.setphymode(wifi_signal_mode)
wifi.sta.config(wifi_SSID, wifi_password) 
wifi.sta.connect()
print("Attempting to connect...")
ip = wifi.sta.getip()
if ip ~= nil then
    print("Got IP: " .. ip)
    print("About to call sendData()...")
    sendData(humidity, temperature)
    print("Returned from sendData()...")
end

使用ESPlorer,我看到以下内容。。。

Attempting to connect...
Attempting to connect...
Attempting to connect...
Attempting to connect...
Attempting to connect...
Attempting to connect...
Got IP: 192.168.0.39
About to call sendData()...
sendData() entered
Setting up mqtt.Client...
Attempting client connect...
Returned from sendData()...

所以它基本上进入了sendData(...),我看到了行的输出。。。

print("Attempting client connect...")

但我从未在m:connect(...)块中看到日志记录,例如…

print("Connected to MQTT")

它似乎只是立即返回。

MQTT代理是一个运行Mosquito的Raspberry Pi,我已经在Android手机和平板电脑上的应用程序中测试过它。我在手机和平板电脑之间双向成功发布/订阅。

我是Lua的新手,只了解MQTT的基本知识,我不知道m:connect(...)块有什么问题,如果有人能帮忙,我将不胜感激。

更新:问题已解决-很抱歉没有尽快返回此线程。问题只是因为我在RPi上运行的Mosquitto版本(它符合MQTT v3.1)。NodeMCU MQTT库支持MQTT v3.1.1,并且不向后兼容。从本质上讲,尽管我确实做了一些更改,但我的代码并没有太大问题——这只是因为MQTT版本不兼容。

您没有告诉我们您使用的NodeMCU版本。警告:不要使用上提供的任何预构建的0.9.x二进制文件https://github.com/nodemcu/nodemcu-firmware/releases.根据构建您自己的固件http://nodemcu.readthedocs.io/en/dev/en/build/.

我总是帮助剥离一个失败的函数,并利用所有可用的回调函数。我可以确认dev分支将数据发送到cloudmqtt.com的近2个月的固件上的以下工作:

function sendData(humidity, temperature)
    print("Setting up mqtt.Client...")
    m = mqtt.Client("SO-36667049", 120, "user", "password")
    print("Attempting client connect...")
    m:connect("m20.cloudmqtt.com", 12703, 0, 0,
        function(conn)
            print("Connected to MQTT")
            payload = "Temp: " .. temperature .. " Hmdy: " .. humidity
            m:publish("topic", payload, 0, 0, 
                function(client) 
                    print("Message sent") 
                end)
        end,
        function(client, reason)
            print("Connection failed, reason: " .. reason)
        end)
end

差异:

  • m:connect明确定义了安全y/n和自动连接y/n。如果只设置了所有可选参数的子集,我总是感到困惑。您的0m:connect中被解释为secure还是autoreconnect?我对Lua的了解还不足以说明我为什么要显式地对它进行编码
  • 对于失败的连接尝试,请使用函数的额外回调。看见http://nodemcu.readthedocs.org/en/dev/en/modules/mqtt/#connection-失败原因代码的失败回调原因代码
  • 回调函数中的变量不要使用与"父"函数中相同的名称。请注意如何使用m:connect(..., function(conn),然后在该函数中再次使用m:publish(..., function(conn)。您不与代码中的conn对象交互,因此不会造成任何危害。然而,这可能会在其他项目中影响你

您的代码看起来不错。如果m:connect失败,则不会发生任何事情,因为您没有为失败的连接尝试提供回调函数。

此外,您也不会检查m:connect的成功返回值。

请参阅http://nodemcu.readthedocs.org/en/dev/en/modules/mqtt/#mqttclientconnect

并检查您的连接尝试是否失败。

最新更新