将遥测数据发送到 iotDevice 的 Azure 函数
Azure function to send telemetry data to iotDevice
我正在尝试开发一个 azure 函数,该函数从一个内置 eventhub 处理它接收消息,并将结果发送到在 Azure IoT 中心配置的另一个 IoT 设备。
下面是代码:
module.exports = 函数(上下文,IoTHubMessages){
var Mqtt = require('azure-iot-device-mqtt').Mqtt;
var DeviceClient = require('azure-iot-device').Client
var Message = require('azure-iot-device').Message
var connectionString = '{connectionstring of the target device}';
var acRoom1 = DeviceClient.fromConnectionString(connectionString, Mqtt);
var totalPerson = 0;
var events = IoTHubMessages.length;
context.log(JSON.stringify(IoTHubMessages));
context.log(Array.isArray(IoTHubMessages));
context.log(`Number of entries: ${IoTHubMessages.length}`);
IoTHubMessages.forEach(message => {
context.log(`Processed message: ${JSON.stringify(message)}`);
totalPerson = totalPerson + message.personCount;
context.log(`Total count: ${totalPerson}`);
});
var avgPersonCount = Math.round( totalPerson / events );
context.log(`Average person count: ${avgPersonCount}`);
var temp = 24;
if ( avgPersonCount > 5){
temp = 20;
}
else if ((avgPersonCount>2) && (avgPersonCount <= 5)){
temp = 22;
}
else {
temp = 24;
}
var msg = new Message(`Setting temperature to ${temp} C`);
context.log('Sending message: ' + msg.getData());
context.log(`Temeperature set to ${temp} C`);
acRoom1.sendEvent(msg);
context.done();
};
我遇到的问题是我发送到设备的事件再次返回到这个 azure 函数。我相信,我需要在消息路由中做一些事情,但不确定需要做什么。
整个解决方案(我想实现的)的流程如下
相机 --> Azure 物联网中心 --> Azure 函数 --> AC
您可以按设备 ID 过滤事件,但更具可扩展性的方法是添加 appProperty。如果您想将所有 AC 事件发送到不同的端点,您可以将 appProperty 添加到 AC 发送的消息中。示例:
var msg = new Message(`Setting temperature to ${temp} C`);
msg .properties.add('eventType', 'AC');
context.log('Sending message: ' + msg.getData());
context.log(`Temeperature set to ${temp} C`);
acRoom1.sendEvent(msg);
之后,您可以转到您的 IoT 中心并添加新路由。您可以将这些事件路由到不同的端点,如下所示:
因为你的相机不发送这个 appProperty,它将依赖回退路由,你的 Azure Functions 仍然会处理这些事件。另一个可能更可靠的选择是仅将相机消息发送到特定路由。但两者都行!
所以请按照下面的示例显示消息路由。
Routing on Message Body 如果您在 $body.property 上路由
您必须在设备发送的主体负载中添加 属性(此处未显示设备代码,此处仅显示门户查询)。
您可以通过...
进行测试
Routing on system property
Iot Hub 将在每条消息上分配此 属性,因此只需在 Portal 端进行设置。(只需在查询中提供设备名称,为了快速,您可以在 Portal 端使用它进行测试)
App Property 正如 Matthijs 在他的回复中所说,下面的快照显示了设备 C# 示例代码。然后你必须编写与应用匹配的查询 属性.
在目标端验证 在我的示例中,目标是 Blob 容器。
我找到了答案。感谢@Matthijs van der Veer 的提示。
1.首先禁用回退规则。现在我有一条 2 条路线
我换成了 azure-iothub 包,而不是 azure-iot-device 包。
module.exports = function (context, IoTHubMessages) {
var Client = require('azure-iothub').Client;
var Message = require('azure-iot-common').Message;
var connectionString = '{connection-string-policy-service}';
var targetDevice = '{destination-deviceid}';
var serviceClient = Client.fromConnectionString(connectionString);
serviceClient.open(function (err) {
if (err) {
context.log('Could not connect: ' + err.message);
}
});
var totalPerson = 0;
var events = IoTHubMessages.length;
context.log(JSON.stringify(IoTHubMessages));
context.log(`Number of entries: ${IoTHubMessages.length}`);
IoTHubMessages.forEach(message => {
context.log(`Processed message: ${JSON.stringify(message)}`);
totalPerson = totalPerson + message.personCount;
context.log(`Total count: ${totalPerson}`);
});
var avgPersonCount = Math.round( totalPerson / events );
context.log(`Average person count: ${avgPersonCount}`);
var temp = 24;
if ( avgPersonCount > 5){
temp = 20;
}
else if ((avgPersonCount>2) && (avgPersonCount <= 5)){
temp = 22;
}
else {
temp = 24;
}
var msg = new Message(`Setting temperature to ${temp} C`);
msg .properties.add('eventType', 'AC');
context.log('Sending message: ' + msg.getData());
context.log(`Temeperature set to ${temp} C`);
serviceClient.send(targetDevice, msg);
context.done();
};
我正在尝试开发一个 azure 函数,该函数从一个内置 eventhub 处理它接收消息,并将结果发送到在 Azure IoT 中心配置的另一个 IoT 设备。 下面是代码:
module.exports = 函数(上下文,IoTHubMessages){
var Mqtt = require('azure-iot-device-mqtt').Mqtt;
var DeviceClient = require('azure-iot-device').Client
var Message = require('azure-iot-device').Message
var connectionString = '{connectionstring of the target device}';
var acRoom1 = DeviceClient.fromConnectionString(connectionString, Mqtt);
var totalPerson = 0;
var events = IoTHubMessages.length;
context.log(JSON.stringify(IoTHubMessages));
context.log(Array.isArray(IoTHubMessages));
context.log(`Number of entries: ${IoTHubMessages.length}`);
IoTHubMessages.forEach(message => {
context.log(`Processed message: ${JSON.stringify(message)}`);
totalPerson = totalPerson + message.personCount;
context.log(`Total count: ${totalPerson}`);
});
var avgPersonCount = Math.round( totalPerson / events );
context.log(`Average person count: ${avgPersonCount}`);
var temp = 24;
if ( avgPersonCount > 5){
temp = 20;
}
else if ((avgPersonCount>2) && (avgPersonCount <= 5)){
temp = 22;
}
else {
temp = 24;
}
var msg = new Message(`Setting temperature to ${temp} C`);
context.log('Sending message: ' + msg.getData());
context.log(`Temeperature set to ${temp} C`);
acRoom1.sendEvent(msg);
context.done();
};
我遇到的问题是我发送到设备的事件再次返回到这个 azure 函数。我相信,我需要在消息路由中做一些事情,但不确定需要做什么。
整个解决方案(我想实现的)的流程如下
相机 --> Azure 物联网中心 --> Azure 函数 --> AC
您可以按设备 ID 过滤事件,但更具可扩展性的方法是添加 appProperty。如果您想将所有 AC 事件发送到不同的端点,您可以将 appProperty 添加到 AC 发送的消息中。示例:
var msg = new Message(`Setting temperature to ${temp} C`);
msg .properties.add('eventType', 'AC');
context.log('Sending message: ' + msg.getData());
context.log(`Temeperature set to ${temp} C`);
acRoom1.sendEvent(msg);
之后,您可以转到您的 IoT 中心并添加新路由。您可以将这些事件路由到不同的端点,如下所示:
因为你的相机不发送这个 appProperty,它将依赖回退路由,你的 Azure Functions 仍然会处理这些事件。另一个可能更可靠的选择是仅将相机消息发送到特定路由。但两者都行!
所以请按照下面的示例显示消息路由。
Routing on Message Body 如果您在 $body.property 上路由
您必须在设备发送的主体负载中添加 属性(此处未显示设备代码,此处仅显示门户查询)。
您可以通过...
进行测试App Property 正如 Matthijs 在他的回复中所说,下面的快照显示了设备 C# 示例代码。然后你必须编写与应用匹配的查询 属性.
在目标端验证 在我的示例中,目标是 Blob 容器。
我找到了答案。感谢@Matthijs van der Veer 的提示。
1.首先禁用回退规则。现在我有一条 2 条路线
我换成了 azure-iothub 包,而不是 azure-iot-device 包。
module.exports = function (context, IoTHubMessages) { var Client = require('azure-iothub').Client; var Message = require('azure-iot-common').Message; var connectionString = '{connection-string-policy-service}'; var targetDevice = '{destination-deviceid}'; var serviceClient = Client.fromConnectionString(connectionString); serviceClient.open(function (err) { if (err) { context.log('Could not connect: ' + err.message); } }); var totalPerson = 0; var events = IoTHubMessages.length; context.log(JSON.stringify(IoTHubMessages)); context.log(`Number of entries: ${IoTHubMessages.length}`); IoTHubMessages.forEach(message => { context.log(`Processed message: ${JSON.stringify(message)}`); totalPerson = totalPerson + message.personCount; context.log(`Total count: ${totalPerson}`); }); var avgPersonCount = Math.round( totalPerson / events ); context.log(`Average person count: ${avgPersonCount}`); var temp = 24; if ( avgPersonCount > 5){ temp = 20; } else if ((avgPersonCount>2) && (avgPersonCount <= 5)){ temp = 22; } else { temp = 24; } var msg = new Message(`Setting temperature to ${temp} C`); msg .properties.add('eventType', 'AC'); context.log('Sending message: ' + msg.getData()); context.log(`Temeperature set to ${temp} C`); serviceClient.send(targetDevice, msg); context.done(); };