Свойства сообщения теряются после маршрутизации через Azure IoT edgeHub

Я не уверен, что это ошибка или я что-то упускаю. Я также создал проблему на 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: {}

person Zotac386    schedule 20.12.2018    source источник
comment
вы пропустили добавление вывода на консоль ?!   -  person silent    schedule 21.12.2018
comment
Добавлен вывод консоли. Выходные данные ясно показывают, что сообщение получено модулем. Так что маршрутизация на основе свойств сообщения работает. Однако при попытке извлечь свойства в модуле они кажутся пустыми.   -  person Zotac386    schedule 21.12.2018
comment
Я не эксперт по питону, поэтому не уверен, что должен делать get_internals (). Не могли бы вы просто сделать print(len(map_properties))?   -  person silent    schedule 21.12.2018
comment
Карта имеет тип IotHubMap, поэтому, к сожалению, len () не работает. Вот что говорится в документации: Map_GetInternals: извлекает полный список ключей и значений из карты в значениях и ключах. Также записывает размер списка в count. ссылка на документы   -  person Zotac386    schedule 21.12.2018


Ответы (1)


Проблема известна и отслеживается на github: https://github.com/Azure/azure-iot-sdk-python/issues/244.

person Zotac386    schedule 27.06.2019