0

我正在尝试像这样将 ESP8266 安全地连接到云或本地计算机上的 MQTT Azure 协议网关代理(两者都尝试过)(不重要 - 连接正常工作):

m = mqtt.Client("{deviceId}", "3600", "{iotHub}/{deviceId}", "{SASToken}")
...
m:on("message", function(conn, top, data)
  print(data) -- EMPTY string here!
end)
  ...
m:connect({IP}, 8883, 1, function(conn)
  m:subscribe("devices/{deviceId}/messages/devicebound/#", 1, function(conn) 
    ...
  end)
end)

ESP 连接到服务器并成功完成握手。当我发布一些数据时,我可以在服务器上正确读取它,没关系。我订阅主题没有问题。当我将云到设备消息中的数据从服务器发送到 ESP 到订阅主题时,会调用“on message”事件,但传递给函数的数据属性是 EMPTY 字符串。

我正在使用基于 1.4.0 SDK 的最新 NodeMCU 主版本(尝试了整数和浮点版本)。我无法打开调试,因为我还没有 NodeMCU 开发人员。

我试过以下:

  • 开发版 - 无济于事
  • 高达 32kB 的可用内存 - 无济于事
  • 使用 WireShark 捕获的数据包:数据包包含一定长度的加密数据,因此它不为空且数据包大小小于 2kB 缓冲区大小

有人可以告诉我哪里可能出现问题或如何调试它以获取更多信息?我会接受任何想法。谢谢你。

编辑:我试过调试模式,输出没有什么有趣的:

enter mqtt_socket_received.
MQTT_DATA: type: 3, qos: 0, msg_id: 0, pending_id: 0
enter deliver_publish.
string
userdata: 3fff3e88
devices/ESP/messages/devicebound
          <- here should be printed data
On
leave deliver_publish.
receive, queue size: 0
leave mqtt_socket_received.
enter mqtt_socket_timer.
timer, queue size: 0
keep_alive_tick: 71
leave mqtt_socket_timer.
enter mqtt_socket_received.
MQTT_DATA: type: 7, qos: 1, msg_id: 8813, pending_id: 0
receive, queue size: 0
leave mqtt_socket_received.
4

1 回答 1

0

这可能很愚蠢,但有时 lua 在某些函数中需要特定的名称。为此更改 function(conn, top, data) function(conn, topic, data)

我以前曾在 lua 中使用 mqtt 进行过密码保护,但我不得不放弃它,因为我也没有收到消息内容,但我认为我的原因是我收到/发送的消息量很大。我还将经纪人从 mosquitto 更改为 mosca。

我希望您能尽快找到解决方法,并请分享它,我们也许可以使用它:)

于 2016-05-07T14:39:39.550 回答