我正在尝试开发一种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 IOT集线器-> Azure功能-> AC
答案 0 :(得分:1)
因此,请按照以下邮件路由显示的示例进行操作。
Routing on Message Body 如果要在$ body.property上进行路由 您必须将属性添加到设备正在发送的主体有效负载中(此处未显示设备代码,仅在此处显示门户网站查询)。
您可以通过...进行测试
Routing on system property Iot Hub将在每条消息上分配此属性,因此只需在Portal端进行设置即可。(只需在查询中提供设备名称,以便快速进行操作即可在Portal端进行测试)
正如Matthijs在回应中所说,App Property ,下面的快照显示了设备C#示例代码。然后,您必须编写与app属性匹配的查询。
在目标端进行验证。在我的示例中,目标是Blob容器。
答案 1 :(得分:0)
您可以按设备ID过滤事件,但更具扩展性的方法是添加appProperty。如果要将所有AC事件发送到其他端点,则可以在AC发送的消息中添加一个appProperty。示例:
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函数仍将处理这些事件。另一个也许更可靠的选择是仅将摄像机消息发送到特定路由。但是任何一个都可以!
答案 2 :(得分:0)
我想出了答案。感谢@Matthijs van der Veer的提示。 1.首先禁用后备规则。现在我有两条路线
我转而使用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();
};