我正在使用IoT Edge将Modbus设备连接到IoT Hub,并尝试实现协议+身份转换模块。
我从here示例开始
我有两个模块:
- ModbusClient,用于协议转换,C#
- 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' }
你能帮我理解我错在哪里吗?
先谢谢你了
1条答案
按热度按时间7z5jn7bk1#
添加到
ModbusClient
模块中的消息的自定义消息属性不会传播到IdentityTranslation
模块,这是因为您定义的消息路由没有指定应传播消息属性。为此,您必须更新消息路由以包含
$includeProperties
选项。更新消息路由后,自定义消息属性将被传播到
IdentityTranslation module
,并能够在消息的Properties
对象中访问它们。访问
IdentityTranslation
模块中的deviceId
属性。使用IoT Hub message routing从Azure存储中获取的引用。
有关标签更新,请检查此SO,有关更多信息,请参阅GitHub Code和MS Doc。