Azure IoT Hub路由至非默认Event Hub时缺失D2C消息系统属性
Azure IoT Hub自定义路由到Event Hub缺失IoTHub系统属性的原因及解决办法
差异原因
默认内置Event Hub端点是IoT Hub的原生输出通道,它会自动将设备消息的系统属性(比如设备ID、入队时间、消息ID等)封装成IoTHub对象,嵌入到消息体的JSON结构中,这是IoT Hub对默认端点的特殊处理逻辑。
而自定义路由规则指向的专用Event Hub,默认只会传递设备发送的原始消息体,系统属性不会自动注入到消息内容里——这些属性其实是以Event Hub消息的**应用属性(Application Properties)**形式存在的,并非消息体的一部分,所以你在消息体里看不到IoTHub对象。
解决办法
方法1:启用消息增强(Message Enrichment)
通过IoT Hub的消息增强功能,把需要的系统属性主动添加到消息体中,还原类似默认端点的IoTHub结构:
- 登录Azure门户,进入你的IoT Hub,选择左侧菜单的「消息路由」,切换到「增强」标签页
- 点击「添加增强」,设置增强名称,然后在「键」的下拉菜单里选择需要的系统属性(比如
iothub-connection-device-id、iothub-enqueuedtime等) - 在「值」里直接使用系统属性的变量(如
${iothub-connection-device-id}),然后在「目标路径」里指定消息体中的位置,比如$.IoTHub.DeviceId,这样这些属性就会被写入到消息体的IoTHub对象下 - 保存配置后,路由到专用Event Hub的消息就会包含完整的
IoTHub属性结构
方法2:在Stream Analytics中直接读取应用属性
如果不需要修改消息体,也可以在Stream Analytics的查询语句中直接提取Event Hub消息的应用属性,无需依赖消息体里的IoTHub对象:
SELECT GetMetadataPropertyValue(input, 'iothub-connection-device-id') AS DeviceId, GetMetadataPropertyValue(input, 'iothub-enqueuedtime') AS EnqueuedTime, * INTO output FROM input
这样就能直接获取到原本在IoTHub对象里的系统属性,满足处理需求
内容的提问来源于stack exchange,提问作者Jan Bartels
相关产品推荐
相关产品推荐

