介绍
在预配置解决方案中,可以配置 在设备遥测值达到特定阈值时触发的规则。 将动态遥测与远程监视预配置解决方案 配合使用介绍了如何将自定义遥测值(如 ExternalTemperature )添加到解决方案。 本文介绍如何为解决方案中的动态遥测类型创建自定义规则。
本教程使用简单的 Node.js 模拟设备生成动态遥测,以发送到预配置解决方案后端。 然后,在 RemoteMonitoring Visual Studio 解决方案中添加自定义规则,并将此自定义后端部署到 Azure 订阅。
若要完成本教程,需要:
- 有效的 Azure 订阅。 如果没有帐户,只需几分钟即可创建免费试用帐户。 有关详细信息,请参阅 Azure 免费试用。
- Node.js 版本 0.12.x 或更高版本以创建模拟设备。
- Visual Studio 2015 或 Visual Studio 2017 使用新规则修改预配置解决方案后端。
部署解决方案
如果尚未在帐户中预配远程监视预配置解决方案:
- 使用 Azure 帐户凭据登录到 azureiotsuite.com,然后单击 + 创建解决方案。
- 在 远程监视 磁贴上单击 选择。
- 输入 解决方案名称 用于您的远程监测预先配置解决方案。
- 选择要用于配置解决方案的 区域 和 订阅。
- 单击 创建解决方案 开始预配过程。 此过程通常需要几分钟才能完成。
等待预配过程完成
- 单击您解决方案的 预配 状态磁贴。
- 请在 Azure 服务部署到您的 Azure 订阅中时注意预配状态。
- 预配完成后,状态将更改为 就绪。
- 单击该磁贴,在右侧窗格中查看解决方案的详细信息。
有没有哪些你期望在解决方案中看到但未列出的详细信息? 请向我们提供有关 User Voice平台的功能建议。
记下为部署选择的解决方案名称。 本教程稍后需要此解决方案名称。
配置 Node.js 模拟设备
在远程监控仪表板上,单击 + 添加设备,然后添加 自定义设备。 记下 IoT 中心主机名、设备 ID 和设备密钥。 在准备 remote_monitoring.js 设备客户端应用程序时,本教程稍后需要用到它们。
确保在开发计算机上安装 Node.js 0.12.x 或更高版本。 在命令提示符或 shell 中运行
node --version以检查版本。 有关使用包管理器在 Linux 上安装 Node.js 的信息,请参阅 通过包管理器安装 Node.js。安装 Node.js后,将 最新版本的 azure-iot-sdk-node 存储库克隆到开发计算机。 始终使用 主 分支获取最新版本的库和示例。
从 azure-iot-sdk-node 存储库的本地副本中,将以下两个文件从节点/设备/示例文件夹复制到开发计算机上的空文件夹:
- packages.json
- remote_monitoring.js
打开 remote_monitoring.js 文件并查找以下变量定义:
var connectionString = "[IoT Hub device connection string]";将 [IoT 中心设备连接字符串] 替换为设备连接字符串。 使用在步骤 1 中记下 IoT 中心主机名、设备 ID 和设备密钥的值。 设备连接字符串具有以下格式:
HostName={your IoT Hub hostname};DeviceId={your device id};SharedAccessKey={your device key}如果你的 IoT 中心主机名是 contoso 而设备 ID 是 mydevice,那么连接字符串看起来如下:
var connectionString = "HostName=contoso.azure-devices.net;DeviceId=mydevice;SharedAccessKey=2s ... =="保存文件。 在包含这些文件的文件夹中的 shell 或命令提示符中运行以下命令,以安装所需的包,然后运行示例应用程序:
npm install node remote_monitoring.js
观察动态遥测的实际运作
仪表板显示现有模拟设备的温度和湿度遥测数据:
如果选择在上一部分中运行的 Node.js 模拟设备,则会看到温度、湿度和外部温度遥测:
远程监视解决方案会自动检测其他外部温度遥测类型,并将其添加到仪表板上的图表。
验证Node.js控制台应用是否在将ExternalTemperature遥测数据发送到预先配置的解决方案后,您可以停止该应用。 保持控制台窗口打开,因为在将自定义规则添加到解决方案后,您需要再次运行此 Node.js 控制台应用程序。
规则存储位置
有关规则的信息保存在两个位置:
- DeviceRulesNormalizedTable 表 – 此表存储对解决方案门户定义的规则的规范化引用。 当解决方案门户显示设备规则时,它会查询此表以获取规则定义。
- DeviceRules blob – 此 Blob 存储为所有已注册设备定义的所有规则,并定义为对 Azure 流分析作业的引用输入。 在解决方案门户中更新现有规则或定义新规则时,会更新表和 Blob 以反映更改。 门户中显示的规则定义来自表存储,而流分析作业引用的规则定义则来自 Blob 存储。
更新 RemoteMonitoring Visual Studio 解决方案
以下步骤演示如何修改 RemoteMonitoring Visual Studio 解决方案,以包含使用模拟设备发送的ExternalTemperature遥测的新规则:
如果尚未这样做,请使用以下 Git 命令将 azure-iot-remote-monitoring 存储库克隆到本地计算机上的合适位置:
git clone https://github.com/Azure/azure-iot-remote-monitoring.git在 Visual Studio 中,从 azure-iot-remote-monitoring 存储库的本地副本打开RemoteMonitoring.sln文件。
打开文件 Infrastructure\Models\DeviceRuleBlobEntity.cs并添加 ExternalTemperature 属性,如下所示:
public double? Temperature { get; set; } public double? Humidity { get; set; } public double? ExternalTemperature { get; set; }在同一文件中,添加 ExternalTemperatureRuleOutput 属性,如下所示:
public string TemperatureRuleOutput { get; set; } public string HumidityRuleOutput { get; set; } public string ExternalTemperatureRuleOutput { get; set; }打开文件 Infrastructure\Models\DeviceRuleDataFields.cs,并在现有 Humidity 属性后添加以下 ExternalTemperature 属性:
public static string ExternalTemperature {
get { return “ExternalTemperature”; } }
在同一文件中,更新 _availableDataFields 方法以包括 ExternalTemperature ,如下所示:
private static List<string> _availableDataFields = new List<string> { Temperature, Humidity, ExternalTemperature };
7. 打开文件 Infrastructure\Repository\DeviceRulesRepository.cs并修改 BuildBlobEntityListFromTableRows 方法,如下所示:
```csharp
else if (rule.DataField == DeviceRuleDataFields.Humidity)
{
entity.Humidity = rule.Threshold;
entity.HumidityRuleOutput = rule.RuleOutput;
}
else if (rule.DataField == DeviceRuleDataFields.ExternalTemperature)
{
entity.ExternalTemperature = rule.Threshold;
entity.ExternalTemperatureRuleOutput = rule.RuleOutput;
}
```
重新生成并重新部署解决方案。
现在可以将更新的解决方案部署到 Azure 订阅。
打开以管理员身份运行的命令提示符,并导航到您本地副本的 azure-iot-remote-monitoring 存储库的根目录。
若要部署更新的解决方案,请运行以下命令,将 {deployment name} 替换为前面记录的预配置解决方案部署的名称:
build.cmd cloud release {deployment name}
更新流分析作业
部署完成后,可以更新流分析作业以使用新的规则定义。
在 Azure 门户中,导航到包含预配置解决方案资源的资源组。 在部署过程中,此资源组与您为解决方案指定的名称相同。
导航到 {deployment name}-Rules 流分析任务。
3.单击“ 停止 ”可停止流分析作业运行。 (必须等待流式处理作业停止,然后才能编辑查询)。
4.单击 “查询”。 编辑查询以包含 ExternalTemperature 的 SELECT 语句。 以下示例显示了包含新 SELECT 语句的完整查询:
```
WITH AlarmsData AS
(
SELECT
Stream.IoTHub.ConnectionDeviceId AS DeviceId,
'Temperature' as ReadingType,
Stream.Temperature as Reading,
Ref.Temperature as Threshold,
Ref.TemperatureRuleOutput as RuleOutput,
Stream.EventEnqueuedUtcTime AS [Time]
FROM IoTTelemetryStream Stream
JOIN DeviceRulesBlob Ref ON Stream.IoTHub.ConnectionDeviceId = Ref.DeviceID
WHERE
Ref.Temperature IS NOT null AND Stream.Temperature > Ref.Temperature
UNION ALL
SELECT
Stream.IoTHub.ConnectionDeviceId AS DeviceId,
'Humidity' as ReadingType,
Stream.Humidity as Reading,
Ref.Humidity as Threshold,
Ref.HumidityRuleOutput as RuleOutput,
Stream.EventEnqueuedUtcTime AS [Time]
FROM IoTTelemetryStream Stream
JOIN DeviceRulesBlob Ref ON Stream.IoTHub.ConnectionDeviceId = Ref.DeviceID
WHERE
Ref.Humidity IS NOT null AND Stream.Humidity > Ref.Humidity
UNION ALL
SELECT
Stream.IoTHub.ConnectionDeviceId AS DeviceId,
'ExternalTemperature' as ReadingType,
Stream.ExternalTemperature as Reading,
Ref.ExternalTemperature as Threshold,
Ref.ExternalTemperatureRuleOutput as RuleOutput,
Stream.EventEnqueuedUtcTime AS [Time]
FROM IoTTelemetryStream Stream
JOIN DeviceRulesBlob Ref ON Stream.IoTHub.ConnectionDeviceId = Ref.DeviceID
WHERE
Ref.ExternalTemperature IS NOT null AND Stream.ExternalTemperature > Ref.ExternalTemperature
)
SELECT *
INTO DeviceRulesMonitoring
FROM AlarmsData
SELECT *
INTO DeviceRulesHub
FROM AlarmsData
```
单击“ 保存 ”以更改更新的规则查询。
单击“ 开始” 以再次启动流分析作业。
在仪表板中添加新规则
现在可以将 ExternalTemperature 规则添加到解决方案仪表板中的设备。
- 导航到解决方案门户。
2. 导航到 “设备” 面板。
3.找到创建的用于发送 ExternalTemperature 遥测的自定义设备,然后在 “设备详细信息 ”面板上单击“ 添加规则”。
4. 在数据字段中选择 ExternalTemperature。
将 阈值 设置为 56。 然后单击“ 保存”并查看规则。
返回到仪表板以查看警报历史记录。
在保持打开的控制台窗口中,启动 Node.js 控制台应用,以开始发送 ExternalTemperature 遥测数据。
8. 请注意,“ 警报历史记录 ”表显示触发新规则时的新警报。
其他信息
更改运算符 > 更为复杂,超出了本教程中所述的步骤。 虽然可以将流分析作业更改为使用任意喜欢的运算符,但要在解决方案门户中体现该运算符的变化是一项更复杂的任务。
后续步骤
了解如何创建自定义规则后,可以了解有关预配置解决方案的详细信息: