You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Azure Service Bus队列无消息仅显示请求:IoT Hub路由故障排查

排查IoT Hub消息路由到Service Bus队列失败的问题

我来帮你梳理下这个问题,结合你给出的信息,咱们一步步排查可能的原因:

首先分析两条路由规则的问题

第一条规则:$._eventtype="meeting"

这条规则肯定匹配不到消息,因为$指代的是IoT Hub消息的系统属性(比如$connectionDeviceId$enqueuedTime这类),而你的_eventtype字段是在消息体(body)里,系统属性里根本没有这个字段,所以这条规则直接无效,可以删掉或者改成和第二条一致的格式。

第二条规则:$body._eventtype="meeting"

这条语法本身是对的,但实际没生效,大概率是下面这些原因:


可能的原因及解决方法

  • 消息的内容类型未正确设置
    IoT Hub要解析消息体并匹配$body相关的规则,要求设备发送消息时必须设置contentTypeapplication/jsoncontentEncodingutf-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

火山引擎 最新活动