Azure IoT 中心设备消息和路由筛选器
Azure IoTHub DeviceMessage and route filter
我使用 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,那么我就不会收到任何消息。
伙计们,有什么想法吗?
路由无效,因为未设置内容编码类型。您代码中的所有 "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 Hub通信。
如果您使用的是第三方库(如 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
URL编码
devices/{MY_DEVICE_ID}/messages/events/$.ct=application/json&$.ce=utf-8
在这里您可以找到更多信息:
https://azure.microsoft.com/it-it/blog/iot-hub-message-routing-now-with-routing-on-message-body/
我使用 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,那么我就不会收到任何消息。
伙计们,有什么想法吗?
路由无效,因为未设置内容编码类型。您代码中的所有 "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 Hub通信。
如果您使用的是第三方库(如 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
URL编码
devices/{MY_DEVICE_ID}/messages/events/$.ct=application/json&$.ce=utf-8
在这里您可以找到更多信息: https://azure.microsoft.com/it-it/blog/iot-hub-message-routing-now-with-routing-on-message-body/