Azure Service Bus队列无消息仅显示请求:IoT Hub路由故障排查
我来帮你梳理下这个问题,结合你给出的信息,咱们一步步排查可能的原因:
首先分析两条路由规则的问题
第一条规则:$._eventtype="meeting"
这条规则肯定匹配不到消息,因为$指代的是IoT Hub消息的系统属性(比如$connectionDeviceId、$enqueuedTime这类),而你的_eventtype字段是在消息体(body)里,系统属性里根本没有这个字段,所以这条规则直接无效,可以删掉或者改成和第二条一致的格式。
第二条规则:$body._eventtype="meeting"
这条语法本身是对的,但实际没生效,大概率是下面这些原因:
可能的原因及解决方法
消息的内容类型未正确设置
IoT Hub要解析消息体并匹配$body相关的规则,要求设备发送消息时必须设置contentType为application/json,contentEncoding为utf-8。如果设备没设置这两个属性,IoT Hub无法识别body的JSON结构,自然匹配不到规则。
你可以检查设备代码里的消息配置,比如:var message = new Message(Encoding.UTF8.GetBytes(jsonPayload)); message.ContentType = "application/json"; message.ContentEncoding = "utf-8"; await deviceClient.SendEventAsync(message);Service Bus终结点的权限不足
虽然你看到Service Bus队列有成功请求,但要确认IoT Hub是否拥有向该队列发送消息的权限。可以去Service Bus队列的**访问控制(IAM)**页面,添加IoT Hub的托管身份为Azure Service Bus Data Sender角色;如果用的是SAS政策,要确保政策拥有Send权限。路由规则的“启用路由到终结点”未开启
去IoT Hub的路由规则详情页,确认“启用路由到终结点”选项是勾选状态,有时候不小心没开启,规则就不会生效。实际发送的消息和示例有差异
可能设备实际发送的消息里,_eventtype字段的位置、拼写或者大小写和示例不一致?比如字段名写成了eventType(首字母大写),或者嵌套在某个子对象里?你可以去IoT Hub的“消息路由”->“测试路由”功能,把实际发送的消息粘贴进去测试,看规则是否能匹配。查看IoT Hub路由日志定位具体错误
这是最直接的排查方式:进入IoT Hub的监控->日志,筛选RouteMessageFailed事件,查看详细的错误信息,里面会明确告诉你失败原因(比如规则不匹配、终结点权限不足、消息格式错误等)。
内容的提问来源于stack exchange,提问作者Durrahan




