【问题标题】:MQTT / ESP8266 / NodeMCU / Lua code not publishingMQTT / ESP8266 / NodeMCU / Lua 代码未发布
【发布时间】:2016-04-16 16:58:51
【问题描述】:

我对 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 版本不兼容。

【问题讨论】:

  • 我猜你的连接尝试失败了,所以什么也没有发生。你预计会发生什么?
  • 你解决了吗,结案了?
  • @MarcelStör:我在原始问题的末尾添加了更新/评论,解释了问题的原因。感谢您提供帮助 - 我确实根据您的建议修改了我的代码,但我不得不“清理”我的 RPi 以强制下载更新版本的 Mosquitto 以使工作正常。
  • 啊,很高兴知道。您不想将其添加为自我接受的答案吗?恕我直言,无需将其显示在未解决的 NodeMCU 问题列表中。
  • @MarcelStör:当然。当我查看我为解决问题所做的工作时,我会添加一个答案(我现在不记得确切)我目前正在努力解决我应该尽快解决的 C++ / Arduino ESP8266 问题. :)

标签: lua mqtt esp8266 nodemcu


【解决方案1】:

您没有告诉我们您使用的 NodeMCU 版本。警告:不要使用https://github.com/nodemcu/nodemcu-firmware/releases 提供的任何预构建的 0.9.x 二进制文件。按照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。如果只设置了所有可选参数的一个子集,它总是让我感到困惑。 m:connect 中的0 是解释为secure 还是autoreconnect?我不太了解 Lua,无法说明我为什么要明确编码。
  • 使用额外的回调函数来处理失败的连接尝试。有关失败原因代码,请参阅 http://nodemcu.readthedocs.org/en/dev/en/modules/mqtt/#connection-failure-callback-reason-codes
  • 不要在回调函数中使用与“父”函数中相同的变量名。请注意您如何使用m:connect(..., function(conn),然后在该函数中再次使用m:publish(..., function(conn)。您不会与代码中的 conn 对象进行交互,因此不会造成任何伤害。但是,这可能会在其他项目中影响您。

【讨论】:

    【解决方案2】:

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

    你也不检查 m:connect 的返回值是否成功。

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

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

    【讨论】:

    • 同意,我应该提供各种回调是有道理的,但是,我对 Lua 的新手理解再次阻碍了我,因为我真的不明白如何去做吧。我将尝试使用“失败”回调来查看是否可以找到原因并缩小问题范围。我主要担心的是代码被破坏了,但如果你认为没问题,那么问题可能出在 wifi 方面或超时。
    • 您可以简单地将 m:connect 调用放入 print() 以查看它返回的内容。
    • 谢谢 - 我没有想到这一点,但它除了空白行外不打印任何内容。我还尝试了 nodemcu mqtt 文档页面中的“内联”m:connect 示例,提供内联连接/失败的功能,但都没有被调用。开始怀疑我的 nodemcu 构建是否损坏,尽管我 99.99% 确定我在上次构建时包含了 MQTT 库......我必须检查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 2016-09-20
    • 2017-05-22
    • 2020-06-26
    • 2018-02-27
    • 2017-12-12
    • 1970-01-01
    相关资源
    最近更新 更多