Я не уверен, что это ошибка или я что-то упускаю. Я также создал проблему на GitHub несколько дней назад, но с резонанса пока нет.
Вот мой сценарий: я использую Raspberry Pi в качестве прозрачного шлюза IoT Edge с двумя настраиваемыми модулями в дополнение к edgeAgent и edgeHub. EdgeHub настроен для маршрутизации сообщений, поступающих от оконечного устройства, к одному из настраиваемых модулей по указанному ниже маршруту.
FROM /messages/* WHERE NOT IS_DEFINED($connectionModuleId) INTO BrokeredEndpoint(\"/modules/camera-capture/inputs/input1\")
В модуль я добавил функцию, которая прослушивает входящие сообщения на input1, и я могу видеть сообщения и распечатывать тело сообщения. В приложении листового устройства я отправляю сообщения через MQTT со свойствами приложения (см. Фрагмент кода 1). Когда я меняю маршрут на ...
FROM /messages/* WHERE (CameraState = 'true') INTO BrokeredEndpoint(\"/modules/camera-capture/inputs/input1\")
... только половина сообщений направляется в модуль, что указывает на то, что свойство обнаружено edgeHub и интерпретируется правильно. Однако, когда я пытаюсь извлечь свойства сообщения в модуле CameraCapture (см. Фрагмент кода 2), они кажутся пустыми (см. Вывод консоли).
Похоже, что свойства сообщения теряются после маршрутизации через пограничный концентратор. Тот же результат с использованием AMQP.
Вот как я отправляю сообщение (фрагмент 1):
client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
set_certificates(client)
message = IoTHubMessage("test message")
# send a message every two seconds
while True:
# add custom application properties
prop_map = message.properties()
if run_camera:
prop_map.add_or_update("CameraState", "true")
else:
prop_map.add_or_update("CameraState", "false")
client.send_event_async(message, send_confirmation_callback, None)
print("Message transmitted to IoT Edge")
time.sleep(2)
Это получатель (фрагмент 2):
def receive_message_callback(message, hubManager):
global RECEIVE_CALLBACKS
message_buffer = message.get_bytearray()
size = len(message_buffer)
print ( "Message received: %s" % message_buffer[:size].decode('utf-8'))
map_properties = message.properties()
key_value_pair = map_properties.get_internals()
print ("Key value pair: %s" % key_value_pair)
return IoTHubMessageDispositionResult.ACCEPTED
РЕДАКТИРОВАТЬ: добавлены журналы консоли:
Message received: test message
Key value pair: {}
Waiting...
Waiting...
Message received: test message
Key value pair: {}
print(len(map_properties))
? - person silent   schedule 21.12.2018