首页 > 解决方案 > Azure IoT 中心中的消息路由只会导致孤立消息

问题描述

我正在为设备编写心跳功能。以下代码使用适用于设备的 Azure SDK 构造消息信封:

private Message constructHeartbeatEnvelope(final HeartbeatEvent heartbeat) throws JsonProcessingException {
    String jsonString = mapper.writeValueAsString(heartbeat);
    System.out.println(jsonString);
    final Message message = new Message(jsonString.getBytes(StandardCharsets.UTF_8));
    message.setProperty("type", "heartbeat");
    message.setContentTypeFinal("application/json");
    message.setExpiryTime(HEARTBEAT_INTERVAL);
    return message;
}

在此设备所属的 IoT Hub 中,我有以下两条路由用于测试目的:

+-----------------+----------------+--------------------------------------+------------+---------+
|      Name       |  Data Source   |            Routing Query             |  Endpoint  | Enabled |
+-----------------+----------------+--------------------------------------+------------+---------+
| heartbeat-route | DeviceMessages | $body.type.name = 'heartbeat/device' | events-dev | true    |
| events-dev-type | DeviceMessages | $type = 'heartbeat'                  | events-dev | true    |
+-----------------+----------------+--------------------------------------+------------+---------+

邮件正文如下所示:

{
    "created": 1568104629007,
    "type": {
        "name": "heartbeat/device",
        "version": "1.0"
    },
    "origin": "iothubdeviceid",
    "content": {
        // heartbeat metadata
    },
    "originId": "S1"
}

回退路由被禁用。

端点是一个事件中心,events-dev它有一个专门的消费者组来处理这些心跳事件。最后一个是函数应用程序,它从这个事件中心消费,并且只打印它接收到的内容的主体以用于调试目的。

但是,当我在 IoT 中心查看指标时,它显示零消息被路由到事件中心,并且所有发送的消息都是“孤立的”。

在内置端点下,我还添加了一个名为heartbeats.

我尝试激活回退路由,然后使用仅接收消息的 Python SDK 中的修改示例,我连接到 IoT 中心事件中心,我可以在那里找到消息,但我根本无法让路由工作。我还看到指标中的孤立消息返回到 0,并且路由到回退的消息上升。heartbeats执行此方法时,我也没有收到有关消费者组的任何消息,仅在$Default.

我在这里做错了什么?

解决方案:

根据下面的回复,以下方法起到了作用:

删除$以过滤用户添加的属性:

+-----------------+----------------+--------------------------------------+------------+---------+
|      Name       |  Data Source   |            Routing Query             |  Endpoint  | Enabled |
+-----------------+----------------+--------------------------------------+------------+---------+
| heartbeat-route | DeviceMessages | $body.type.name = 'heartbeat/device' | events-dev | true    |
| events-dev-type | DeviceMessages | type = 'heartbeat'                   | events-dev | true    |
+-----------------+----------------+--------------------------------------+------------+---------+

在邮件信封上手动设置内容编码:

private Message constructHeartbeatEnvelope(final HeartbeatEvent heartbeat) throws JsonProcessingException {
    String jsonString = mapper.writeValueAsString(heartbeat);
    System.out.println(jsonString);
    final Message message = new Message(jsonString.getBytes(StandardCharsets.UTF_8));
    message.setProperty("type", "heartbeat");
    message.setContentTypeFinal("application/json");
    message.setContentEncoding("utf-8"); // <---- This line
    message.setExpiryTime(HEARTBEAT_INTERVAL);
    return message;
}

尽管进行了上述修复,身体路由似乎不起作用

标签: azureazure-iot-hubazure-eventhubazure-iot-sdk

解决方案


以下是修复:

  1. 类型= '心跳'
  2. 为 utf-8 设置消息 ContentEcoding

在此处查看更多详细信息。


推荐阅读