Azure IoTHub DeviceMessage和路由筛选器

时间:2018-07-03 17:22:38

标签: python azure mqtt azure-iot-hub

我使用 python paho.mqtt 将消息发送到云 我设置了端点和路由。当我将查询字符串设置为 true 时,一切正常

messageDict = {}
systemPropertiesDict = {"contentType": "application/json", "contentEncoding": "utf-8", "iothub-message-source": "deviceMessages", "iothub-enqueuedtime": "2017-05-08T18:55:31.8514657Z"}
messageDict = {"systemProperties": systemPropertiesDict}
messageDict["appProperties"] = {}
body = '{id:1}'
messageDict["body"] = body
root = {"message":messageDict}
msg = json.dumps(root, indent=2).encode('utf-8')
print("Message to send", msg)
self.client.publish(topicName, msg)

但是,如果我将查询字符串设置为 $ body.id = 1 ,则不会收到任何消息。

有什么主意吗?

3 个答案:

答案 0 :(得分:2)

该路由不起作用,因为未设置内容编码类型。您代码中的所有“ systemProperties”实际上都是消息正文,而不是系统属性。用此方法设置的内容编码类型无效。

在主题中添加“ $ .ct = application%2Fjson&$。ce = utf-8”。然后它将如下所示:

devices/{yourDeviceId}/messages/events/$.ct=application%2Fjson&$.ce=utf-8

但是要使路由查询适用于您的消息,您需要使用以下查询字符串:$ body.message.body.id = 1

要进行两次编辑:

首先,将body = '{id:1}'更改为body = {"id":1},以使id为字符串。

第二,将topicName的值更改为此:

devices/{yourDeviceId}/messages/events/$.ct=application%2Fjson&$.ce=utf-8

如果可能,建议使用Azure IoT SDK for Python与Azure IoT中心进行通信。

答案 1 :(得分:0)

使用直接MQTT协议时,以下链接可帮助您获得属性:

Using the MQTT protocol directly

IoT Hub message routing: now with routing on message body

Using the MQTT protocol directly with property_bag

Azure IoT Hub Tester

.Net ReflectorMicrosoft.Azure.Devices.Client程序集中

从当前版本的Microsoft.Azure.Device.Client(版本1.17.0):

enter image description here

enter image description here

答案 2 :(得分:0)

如果您正在使用第三方库(例如paho-mqtt),则必须指定内容类型和消息的编码。 IoT中心以内容类型“ application / json”和内容编码来路由消息:“ utf-8”或“ utf-16”或“ utf-32”。 使用MQTT协议,您可以使用$ .ct和$ .ce设置此信息。

主题示例:

devices/{MY_DEVICE_ID}/messages/events/%24.ct=application%2fjson&%24.ce=utf-8

的网址编码

devices/{MY_DEVICE_ID}/messages/events/$.ct=application/json&$.ce=utf-8

在这里您可以找到更多信息: transformed rectanlge