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

时间:2016-04-16 16:58:52

标签: lua mqtt esp8266 nodemcu

我在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经纪人是运行Mosquitto的Raspberry Pi,我在Android手机和平板电脑上使用应用程序对其进行了测试。我在两个方向上成功地在手机和平​​板电脑之间发布/订阅。

我是Lua新手,只了解MQTT的基础知识,如果有人能提供帮助,我会对m:connect(...)块的错误感到茫然。

更新:问题已解决 - 抱歉没有尽快回复此主题。问题只是我在我的RPi上运行的Mosquitto版本(符合MQTT v3.1)。 NodeMCU MQTT库支持MQTT v3.1.1,并且不向后兼容。本质上我的代码没有太大的错误,虽然我做了一些更改 - 它只是归结为MQTT版本不兼容。

2 个答案:

答案 0 :(得分:1)

您没有告诉我们您使用的NodeMCU版本。警告:请勿使用https://github.com/nodemcu/nodemcu-firmware/releases处提供的任何预构建的0.9.x二进制文件。根据{{​​3}}构建您自己的固件。

我总是帮助剥离失败的函数并利用所有可用的回调函数。我可以确认以下对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。如果只设置了所有可选参数的子集,它总是让我感到困惑。您0中的m:connect被解释为secure还是autoreconnect?我不太清楚Lua为什么要明确地编码它。
  • 为失败的连接尝试使用额外的回调功能。有关失败原因代码,请参阅http://nodemcu.readthedocs.io/en/dev/en/build/
  • 不要在回调函数中使用与“父”函数中使用的相同名称。请注意您如何使用m:connect(..., function(conn),然后在该函数中再次使用m:publish(..., function(conn)。您不与代码中的conn对象进行交互,因此不会造成任何损害。但是,这可能会让你在其他项目中受到影响。

答案 1 :(得分:0)

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

另外,您无需检查m:connect的成功返回值。

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

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