通过Azure IoT EdgeHub路由后,消息属性似乎丢失了

时间:2018-12-20 07:30:43

标签: azure azure-iot-edge azure-iot-sdk

我不确定这是否是错误或缺少什么。几天前,我还在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: {}

1 个答案:

答案 0 :(得分:0)