模块之间的Azure IoT Edge路由消息:不传播自定义消息属性

q9yhzks0  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(101)

我正在使用IoT Edge将Modbus设备连接到IoT Hub,并尝试实现协议+身份转换模块。
我从here示例开始
我有两个模块:

  1. ModbusClient,用于协议转换,C#
  2. IdentityTranslation,在NodeJS中
    以下是在部署文件中定义路由的方式:
    “ModbusClientToIdentityTranslation”:“FROM /messages/modules/ModbusClient/outputs/modbusOutput INTO BrokeredEndpoint("/modules/IdentityTranslation/inputs/input1\”)",
    “IdentityTranslationToIoTHub”:“FROM /messages/modules/IdentityTranslation/outputs/* INTO $upstream”
    我想在ModbusClient转换的消息中添加一个具有deviceId值的属性,并在IdentityTranslation模块中读取该属性。
    下面是两个模块中的代码片段:
  • ModbusClient
Message message = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(out_message)));
message.Properties.Add("content-type", "application/edge-modbus-json");
message.Properties.Add("deviceId", deviceId);

Console.WriteLine("deviceId " + message.Properties["deviceId"]);
await ioTHubModuleClient.SendEventAsync("modbusOutput", message);
  • 身份翻译
moduleClient.on('inputMessage', function (inputName, msg) {
  console.log("new message received", msg);
  if (modbusClient) {
    // Identity Translation configured, wrap message for IoT device
    const message = msg.getBytes().toString('utf8');
    const sensorMsg = new Message(message);
    console.log("sensorMsg ", sensorMsg);
    if(sensorMsg.Keys.Contains("deviceId")){
       console.log("deviceId ", sensorMsg.Properties["deviceId"]);
    }
    modbusClient.sendEvent(sensorMsg);
}

当消息到达IdentityTranslation模块时,Properties为空,无法获取deviceId值。
这是接收到的消息的内容

new message received Message {
  data:
   <Buffer 7b 22 50 75 62 6c 69 73 68 54 69 6d 65 73 74 61 6d 70 22 3a 22 32 30 32 33 2d 30 36 2d 32 37 20 31 34 3a 34 39 3a 33 30 22 2c 22 43 6f 6e 74 65 6e 74 ... >,
  properties:
   Properties { propertyList: [ [Object], [Object], [Object] ] },
  messageId: '',
  to: '',
  expiryTimeUtc: undefined,
  lockToken: '',
  correlationId: '',
  userId: '',
  contentEncoding: 'utf-8',
  contentType: 'application/json' }

你能帮我理解我错在哪里吗?
先谢谢你了

7z5jn7bk

7z5jn7bk1#

添加到ModbusClient模块中的消息的自定义消息属性不会传播到IdentityTranslation模块,这是因为您定义的消息路由没有指定应传播消息属性。
为此,您必须更新消息路由以包含$includeProperties选项。

"ModbusClientToIdentityTranslation": "FROM /messages/modules/ModbusClient/outputs/modbusOutput INTO BrokeredEndpoint("/modules/IdentityTranslation/inputs/input1") WITH $includeProperties"

更新消息路由后,自定义消息属性将被传播到IdentityTranslation module,并能够在消息的Properties对象中访问它们。
访问IdentityTranslation模块中的deviceId属性。

var msg = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(out_message)));
msg.Properties.Add("content-type", "application/edge-modbus-json");
msg.Properties.Add("deviceId", deviceId);

await ioTHubModuleClient.SendEventAsync("modbusOutput", msg);

var route = new EdgeRouteSpecification.Builder()
    .WithSource("/messages/modules/ModbusClient/outputs/modbusOutput")
    .WithTarget(new EdgeModuleEndpoint.Builder()
        .WithModuleId("IdentityTranslation")
        .WithInputName("input")
        .Build())
    .WithPropagateProperties(true)
    .Build();

await ioTHubModuleClient.AddRouteAsync(route);

使用IoT Hub message routing从Azure存储中获取的引用。

有关标签更新,请检查此SO,有关更多信息,请参阅GitHub CodeMS Doc

相关问题