Azure IoT中心中的邮件路由只会产生孤立的邮件

时间:2019-09-10 09:21:01

标签: azure azure-iot-hub azure-eventhub azure-iot-sdk

我正在为设备编写心跳功能。以下代码片段使用适用于设备的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中心中,我有以下两条路由用于测试:

+-----------------+----------------+--------------------------------------+------------+---------+
|      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;
}

尽管进行了上述修复,车身布线似乎仍无法正常工作

1 个答案:

答案 0 :(得分:1)

以下是解决方法:

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

查看更多详细信息here