自定义预配置解决方案

Azure IoT 套件提供的预配置解决方案演示了套件中的服务协同工作,以提供端到端解决方案。 从这个起点出发,可以根据具体情况在不同方面扩展和定制解决方案。 以下部分介绍了这些常见的自定义点。

查找源代码

预配置解决方案的源代码可在以下存储库中的 GitHub 上获取:

提供了预配置解决方案的源代码,用于演示使用 Azure IoT 套件实现 IoT 解决方案的端到端功能的模式和做法。 您可以在 GitHub 存储库中找到有关如何构建和部署解决方案的更多信息。

更改预配置规则

远程监视解决方案包括三个 Azure 流分析 作业,用于处理解决方案中的设备信息、遥测和规则逻辑。

远程监控预配置解决方案演练中,详细介绍了三个流分析作业及其语法。

可以直接编辑这些作业以更改逻辑,或添加特定于方案的逻辑。 可按如下找到流分析任务:

  1. 转到 Azure 门户

  2. 导航到与 IoT 解决方案同名的资源组。

  3. 选择要修改的 Azure 流分析作业。

  4. 通过在命令集中选择 “停止 ”来停止作业。

  5. 编辑输入、查询和输出。

    简单的修改是更改 Rules 作业的查询,以使用“<”而不是“>”。 编辑规则时,解决方案门户仍显示 “>” ,但请注意,由于基础作业的更改,行为是如何翻转的。

  6. 开始工作

注释

远程监视仪表板取决于特定数据,因此更改作业可能会导致仪表板失败。

添加自己的规则

除了更改预配置的 Azure 流分析作业之外,还可以使用 Azure 门户添加新作业或向现有作业添加新查询。

自定义设备

最常见的扩展活动之一是使用特定于方案的设备。 有多种方法可用于处理设备。 这些方法包括更改模拟设备以匹配方案,或使用 IoT 设备 SDK 将物理设备连接到解决方案。

有关添加设备的分步指南,请参阅 Iot Suite 连接设备 文章和 远程监视 C SDK 示例。 此示例旨在与远程监视预配置解决方案配合使用。

创建自己的模拟设备

包含在 远程监视解决方案源代码中,是一个 .NET 模拟器。 此模拟器是作为解决方案的一部分预配的模拟器,你可以对其进行更改以发送不同的元数据、遥测,以及响应不同的命令和方法。

远程监视预配置解决方案中的预配置模拟器模拟冷却设备发出温度和湿度遥测数据。 创建 GitHub 存储库分支后,可以在 Simulator.WebJob 项目中修改模拟器。

模拟设备的可用位置

默认位置集位于美国华盛顿西雅图/雷德蒙德。 可以在 SampleDeviceFactory.cs中更改这些位置。

将所需的属性更新处理程序添加到模拟器

可以在解决方案门户中为设备设置所需属性的值。 当设备检索所需属性值时,设备负责处理属性更改请求。 若要通过所需属性添加对属性值更改的支持,需要向模拟器添加处理程序。

模拟器包含 SetPointTempTelemetryInterval 属性的处理程序,可以通过在解决方案门户中设置所需值来更新这些属性。

以下示例演示了 CoolerDevice 类中 SetPointTemp 期望属性的处理程序:

protected async Task OnSetPointTempUpdate(object value)
{
    var telemetry = _telemetryController as ITelemetryWithSetPointTemperature;
    telemetry.SetPointTemperature = Convert.ToDouble(value);

    await SetReportedPropertyAsync(SetPointTempPropertyName, telemetry.SetPointTemperature);
}

此方法更新遥测点温度,然后通过设置报告属性将更改报告回 IoT 中心。

可以按照前面的示例中的模式为自己的属性添加自己的处理程序。

还必须将所需属性绑定到处理程序,如以下示例中 来自 CoolerDevice 构造函数所示:

_desiredPropertyUpdateHandlers.Add(SetPointTempPropertyName, OnSetPointTempUpdate);

请注意, SetPointTempPropertyName 是定义为“Config.SetPointTemp”的常量。

向模拟器添加对新方法的支持

可以自定义模拟器以添加对新 方法(直接方法)的支持。 需要两个关键步骤:

  • 模拟器必须在预配置解决方案中通知 IoT 中心,其中包含该方法的详细信息。
  • 模拟器必须包含代码,以处理从解决方案资源管理器中的 设备详细信息 面板或通过作业调用方法时的方法调用。

远程监视预配置解决方案使用 报告的属性 将受支持的方法的详细信息发送到 IoT 中心。 解决方案后端维护每个设备支持的所有方法的列表,以及方法调用的历史记录。 可以在解决方案门户中查看有关设备和调用方法的信息。

若要通知 IoT 中心设备支持某个方法,设备必须将该方法的详细信息添加到报告属性中的 SupportedMethods 节点:

"SupportedMethods": {
  "<method signature>": "<method description>",
  "<method signature>": "<method description>"
}

方法签名具有以下格式: <method name>--<parameter #0 name>-<parameter #1 type>-...-<parameter #n name>-<parameter #n type> 例如,若要指定 InitiateFirmwareUpdate 方法需要名为 FwPackageURI 的字符串参数,请使用以下方法签名:

InitiateFirmwareUpate--FwPackageURI-string: "description of method"

有关受支持的参数类型的列表,请参阅基础结构项目中的 CommandTypes 类。

若要删除方法,请将方法签名设置为 null 报告属性中。

注释

解决方案后端仅在从 设备收到设备信息 消息时更新有关受支持方法的信息。

Common 项目中 SampleDeviceFactory 类中的以下代码示例演示如何将方法添加到设备发送的报告属性中的 SupportedMethods 列表中:

device.Commands.Add(new Command(
    "InitiateFirmwareUpdate",
    DeliveryType.Method,
    "Updates device Firmware. Use parameter 'FwPackageUri' to specifiy the URI of the firmware file, e.g. https://iotrmassets.blob.core.windows.net/firmwares/FW20.bin",
    new[] { new Parameter("FwPackageUri", "string") }
));

此代码片段添加 InitiateFirmwareUpdate 方法的详细信息,包括解决方案门户中显示的文本以及所需方法参数的详细信息。

模拟器在模拟器启动时将报告的属性(包括受支持的方法列表)发送到 IoT 中心。

将处理程序添加到模拟器代码中,以支持每个方法。 可以在 Simulator.WebJob 项目中的 CoolerDevice 类中看到现有处理程序。 以下示例显示了 InitiateFirmwareUpdate 方法的处理程序:

public async Task<MethodResponse> OnInitiateFirmwareUpdate(MethodRequest methodRequest, object userContext)
{
    if (_deviceManagementTask != null && !_deviceManagementTask.IsCompleted)
    {
        return await Task.FromResult(BuildMethodRespose(new
        {
            Message = "Device is busy"
        }, 409));
    }

    try
    {
        var operation = new FirmwareUpdate(methodRequest);
        _deviceManagementTask = operation.Run(Transport).ContinueWith(async task =>
        {
            // after firmware completed, we reset telemetry
            var telemetry = _telemetryController as ITelemetryWithTemperatureMeanValue;
            if (telemetry != null)
            {
                telemetry.TemperatureMeanValue = 34.5;
            }

            await UpdateReportedTemperatureMeanValue();
        });

        return await Task.FromResult(BuildMethodRespose(new
        {
            Message = "FirmwareUpdate accepted",
            Uri = operation.Uri
        }));
    }
    catch (Exception ex)
    {
        return await Task.FromResult(BuildMethodRespose(new
        {
            Message = ex.Message
        }, 400));
    }
}

方法处理程序名称必须以 On 后跟方法的名称开头。 methodRequest 参数包含通过解决方案后端方法调用传递的任何参数。 返回值的类型必须为 Task<MethodResponse>BuildMethodResponse 实用工具方法可帮助你创建返回值。

在方法处理程序中,可以:

  • 启动异步任务。
  • 请从 IoT 中心中的 设备孪生 中检索所需的属性。
  • 使用 CoolerDevice 类中的 SetReportedPropertyAsync 方法更新单个报告属性。
  • 通过创建 TwinCollection 实例并调用 Transport.UpdateReportedPropertiesAsync 方法更新多个报告的属性。

前面的固件更新示例执行以下步骤:

  • 检查设备是否能够接受固件更新请求。
  • 异步启动固件更新作,并在作完成后重置遥测数据。
  • 立即返回“FirmwareUpdate 已接受”消息,以指示设备已接受请求。

生成和使用你自己的(物理)设备

Azure IoT SDK 提供用于将许多设备类型(语言和作系统)连接到 IoT 解决方案的库。

修改仪表板限制

仪表板下拉列表中显示的设备数

默认值为 200。 可以在 DashboardController.cs中更改此数字。

必应地图控件中显示的图钉数

默认值为 200。 可以在 TelemetryApiController.cs中更改此数字。

遥测图的时间段

默认值为 10 分钟。 可以在 TelmetryApiController.cs中更改此值。

反馈

您希望在此文档中看到涵盖的定制内容吗? 向 用户语音添加功能建议,或对本文发表评论。

后续步骤

若要详细了解自定义预配置解决方案的选项,请参阅: