在远程监视预配置解决方案中创建自定义规则

介绍

在预配置解决方案中,可以配置 在设备遥测值达到特定阈值时触发的规则将动态遥测与远程监视预配置解决方案 配合使用介绍了如何将自定义遥测值(如 ExternalTemperature )添加到解决方案。 本文介绍如何为解决方案中的动态遥测类型创建自定义规则。

本教程使用简单的 Node.js 模拟设备生成动态遥测,以发送到预配置解决方案后端。 然后,在 RemoteMonitoring Visual Studio 解决方案中添加自定义规则,并将此自定义后端部署到 Azure 订阅。

若要完成本教程,需要:

  • 有效的 Azure 订阅。 如果没有帐户,只需几分钟即可创建免费试用帐户。 有关详细信息,请参阅 Azure 免费试用
  • Node.js 版本 0.12.x 或更高版本以创建模拟设备。
  • Visual Studio 2015 或 Visual Studio 2017 使用新规则修改预配置解决方案后端。

部署解决方案

如果尚未在帐户中预配远程监视预配置解决方案:

  1. 使用 Azure 帐户凭据登录到 azureiotsuite.com,然后单击 + 创建解决方案。
  2. 远程监视 磁贴上单击 选择
  3. 输入 解决方案名称 用于您的远程监测预先配置解决方案。
  4. 选择要用于配置解决方案的 区域订阅
  5. 单击 创建解决方案 开始预配过程。 此过程通常需要几分钟才能完成。

等待预配过程完成

  1. 单击您解决方案的 预配 状态磁贴。
  2. 请在 Azure 服务部署到您的 Azure 订阅中时注意预配状态
  3. 预配完成后,状态将更改为 就绪
  4. 单击该磁贴,在右侧窗格中查看解决方案的详细信息。

注释

如果在部署预配置的解决方案时遇到问题,请查看 azureiotsuite.com 站点 权限,以及 常见问题解答。 如果问题仍然存在,请在 门户上创建服务请求

有没有哪些你期望在解决方案中看到但未列出的详细信息? 请向我们提供有关 User Voice平台的功能建议。

记下为部署选择的解决方案名称。 本教程稍后需要此解决方案名称。

配置 Node.js 模拟设备

  1. 在远程监控仪表板上,单击 + 添加设备,然后添加 自定义设备。 记下 IoT 中心主机名、设备 ID 和设备密钥。 在准备 remote_monitoring.js 设备客户端应用程序时,本教程稍后需要用到它们。

  2. 确保在开发计算机上安装 Node.js 0.12.x 或更高版本。 在命令提示符或 shell 中运行 node --version 以检查版本。 有关使用包管理器在 Linux 上安装 Node.js 的信息,请参阅 通过包管理器安装 Node.js。

  3. 安装 Node.js后,将 最新版本的 azure-iot-sdk-node 存储库克隆到开发计算机。 始终使用 分支获取最新版本的库和示例。

  4. azure-iot-sdk-node 存储库的本地副本中,将以下两个文件从节点/设备/示例文件夹复制到开发计算机上的空文件夹:

    • packages.json
    • remote_monitoring.js
  5. 打开 remote_monitoring.js 文件并查找以下变量定义:

    var connectionString = "[IoT Hub device connection string]";
    
  6. [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 ... =="
    
  7. 保存文件。 在包含这些文件的文件夹中的 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遥测的新规则:

  1. 如果尚未这样做,请使用以下 Git 命令将 azure-iot-remote-monitoring 存储库克隆到本地计算机上的合适位置:

    git clone https://github.com/Azure/azure-iot-remote-monitoring.git
    
  2. 在 Visual Studio 中,从 azure-iot-remote-monitoring 存储库的本地副本打开RemoteMonitoring.sln文件。

  3. 打开文件 Infrastructure\Models\DeviceRuleBlobEntity.cs并添加 ExternalTemperature 属性,如下所示:

    public double? Temperature { get; set; }
    public double? Humidity { get; set; }
    public double? ExternalTemperature { get; set; }
    
  4. 在同一文件中,添加 ExternalTemperatureRuleOutput 属性,如下所示:

    public string TemperatureRuleOutput { get; set; }
    public string HumidityRuleOutput { get; set; }
    public string ExternalTemperatureRuleOutput { get; set; }
    
  5. 打开文件 Infrastructure\Models\DeviceRuleDataFields.cs,并在现有 Humidity 属性后添加以下 ExternalTemperature 属性:

    public static string ExternalTemperature
    {
    

    get { return “ExternalTemperature”; } }

  1. 在同一文件中,更新 _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 订阅。

  1. 打开以管理员身份运行的命令提示符,并导航到您本地副本的 azure-iot-remote-monitoring 存储库的根目录。

  2. 若要部署更新的解决方案,请运行以下命令,将 {deployment name} 替换为前面记录的预配置解决方案部署的名称:

    build.cmd cloud release {deployment name}
    

更新流分析作业

部署完成后,可以更新流分析作业以使用新的规则定义。

  1. 在 Azure 门户中,导航到包含预配置解决方案资源的资源组。 在部署过程中,此资源组与您为解决方案指定的名称相同。

  2. 导航到 {deployment name}-Rules 流分析任务。

3.单击“ 停止 ”可停止流分析作业运行。 (必须等待流式处理作业停止,然后才能编辑查询)。

4.单击 “查询”。 编辑查询以包含 ExternalTemperatureSELECT 语句。 以下示例显示了包含新 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
```
  1. 单击“ 保存 ”以更改更新的规则查询。

  2. 单击“ 开始” 以再次启动流分析作业。

在仪表板中添加新规则

现在可以将 ExternalTemperature 规则添加到解决方案仪表板中的设备。

  1. 导航到解决方案门户。

2. 导航到 “设备” 面板。

3.找到创建的用于发送 ExternalTemperature 遥测的自定义设备,然后在 “设备详细信息 ”面板上单击“ 添加规则”。

4. 在数据字段中选择 ExternalTemperature

  1. 阈值 设置为 56。 然后单击“ 保存”并查看规则

  2. 返回到仪表板以查看警报历史记录。

  3. 在保持打开的控制台窗口中,启动 Node.js 控制台应用,以开始发送 ExternalTemperature 遥测数据。

8. 请注意,“ 警报历史记录 ”表显示触发新规则时的新警报。  

其他信息

更改运算符 > 更为复杂,超出了本教程中所述的步骤。 虽然可以将流分析作业更改为使用任意喜欢的运算符,但要在解决方案门户中体现该运算符的变化是一项更复杂的任务。

后续步骤

了解如何创建自定义规则后,可以了解有关预配置解决方案的详细信息: