无法读取 Azure IoT 中心 MQTT 订阅消息数据

Unable to read Azure IoT hub MQTT subscription message data

我已按照此处概述的步骤成功将我的 ESP8266 Arduino 项目连接到 Azure IoT 中心:

https://azure.microsoft.com/en-gb/documentation/articles/iot-hub-mqtt-support/

我使用的MQTT库是以下库:

https://github.com/Imroy/pubsubclient

使用代码我已经能够将事件发布到 azure。尝试读取传递给设备的消息时出现问题。

代码如下:

http://pastebin.com/7AVLQfFh

当我使用 Azure 设备资源管理器向设备发送消息时,我得到以下结果:


如您所见,有效负载长度与消息中的字符数相同,但字符不同。而且,如果我改变发送的字符串,那么结果中的值是相同的。

作为健全性检查,我针对不同的 MQTT 服务 (Adafruit IO) 尝试了代码,结果符合预期(这里的消息是 'ON' 或 'OFF'):

Azure MQTT 服务在将消息发送到设备时必须做一些不同的事情,我需要知道它做了什么不同的事情。

根据this documentation page, property_bag is RFC2396编码。

RFC 2396-encoded(<PropertyName1>)=RFC 2396-encoded(<PropertyValue1>)&RFC 2396-encoded(<PropertyName2>)=RFC 2396-encoded(<PropertyValue2>)…

但是,ABCD 纯文本与 URI 编码不一样吗……嗯,是的。

安装 stunnel (https://www.stunnel.org/index.html),在 8883/TCP 上打开到 IoT Hub 的 TLS 1.2 连接,然后将 MQTT.fx 或 Paho 指向它并用 Wireshark 嗅探流量,看看你得到了什么。

在通过 REST 与 IoT Hub 交谈时,我能够阅读纯 ASCII 文本的所有消息,所以不管这是什么,我认为它是特定于 MQTT 的。

如果您还没有这样做,您应该在他们的 GitHub 上打开一个问题。他们似乎反应很快:https://github.com/Azure/azure-iot-sdks/issues

就在几个小时前,我使用原始的 PubSubClient - link here 设法让消息从 Azure IoT 中心流向我的 ESP8266。您正在使用该库的分支,该分支已变得更加面向对象并且可能具有更多增强功能..但是如果您不是很喜欢使用较新的版本,我建议您获取原始版本并尝试一下。

如果您需要一些参考,我在 github 上有我的代码:link

一个重要提及:PubSubClient.h需要将#defineMQTT_MAX_PACKET_SIZE 128更改为#defineMQTT_MAX_PACKET_SIZE 256 或更多,如果你使用大数据包

此外,我还没有尝试发送任何消息,所以我不知道它会如何工作。

更新:我还写了一篇关于如何设置的简短博客post:link