Пишу функцию сердцебиения для устройств. Следующий фрагмент кода создает конверт сообщения с помощью пакета 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;
}
В Центре Интернета вещей, которому принадлежит это устройство, у меня есть два следующих маршрута для тестирования:
+-----------------+----------------+--------------------------------------+------------+---------+
| 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
- это концентратор событий, у которого есть выделенная группа потребителей для этих контрольных событий. Последним в цепочке является приложение-функция, которое потребляет от этого концентратора событий и печатает только тело того, что оно получает, для целей отладки.
Однако, когда я просматриваю метрики в своем Центре Интернета вещей, он говорит, что ноль сообщений направляется в концентратор событий, а все отправленные сообщения «осиротели».
В разделе «Встроенные конечные точки» я также добавил дополнительную группу потребителей под названием heartbeats
.
Я попытался активировать резервный маршрут, а затем использовать модифицированный образец из Python SDK, который принимает только сообщения, я подключился к концентратору событий IoT Hub и могу найти там сообщения, но мне вообще не удается заставить маршрутизацию работать. Я также вижу, что потерянные сообщения возвращаются к 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;
}
Маршрутизация тела, похоже, не работает, несмотря на указанные выше исправления