你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

设备管理入门 (.NET)

后端应用可使用 Azure IoT 中心基元(例如设备孪生直接方法)来远程启动和监视设备上的设备管理操作。 本文介绍后端应用和设备应用如何协同工作,以便使用 IoT 中心发起远程设备重启操作并对其进行监视。

注意

本文所述的功能只能用于 IoT 中心的标准层。 有关 IoT 中心基本层和标准/免费层的详细信息,请参阅选择适合你的解决方案的 IoT 中心层

使用直接方法可从云中的后端应用启动设备管理操作(例如重新启动、恢复出厂设置以及固件更新)。 设备负责以下操作:

  • 处理从 IoT 中心发送的方法请求。

  • 在设备上启动相应的设备特定操作。

  • 通过向 IoT 中心 报告的属性,提供状态更新。

可以使用云中的后端应用运行设备克隆查询,以报告设备管理操作的进度。

本文介绍如何创建:

  • SimulateManagedDevice:一个模拟设备应用,它使用直接方法重新启动设备并报告上次重新启动时间。 直接方法是从云中调用的。

  • TriggerReboot:一个 .NET 控制台应用,它通过 IoT 中心调用模拟设备应用中的直接方法。 它显示响应和更新的报告属性。

先决条件

  • Visual Studio。

  • Azure 订阅中的 IoT 中心。 如果还没有中心,则可以按照创建 IoT 中心中的步骤进行操作。

  • 在 IoT 中心注册的设备。 如果 IoT 中心内没有设备,请按照注册设备中的步骤操作。

  • 确保已在防火墙中打开端口 8883。 本文中的设备示例使用 MQTT 协议,该协议通过端口 8883 进行通信。 在某些公司和教育网络环境中,此端口可能被阻止。 有关解决此问题的更多信息和方法,请参阅连接到 IoT 中心(MQTT)

使用直接方法创建设备应用

本部分的操作:

  • 创建一个 .NET 控制台应用,用于响应通过云调用的直接方法。

  • 触发模拟设备重新启动。

  • 通过报告的属性,设备孪生查询可标识设备及设备上次重新启动的时间。

重要

本文包括使用共享访问签名(也称为对称密钥身份验证)连接设备的步骤。 此身份验证方法便于测试和评估,但使用 X.509 证书对设备进行身份验证是一种更安全的方法。 若要了解详细信息,请参阅“安全最佳做法 > 连接安全性”。

若要创建模拟设备应用,请执行以下步骤:

  1. 打开 Visual Studio 并选择“创建新项目”,然后找到并选择“控制台应用(.NET Framework)”项目模板,然后选择“下一步”。

  2. 在“配置新项目”中,将项目命名为“SimulateManagedDevice”,然后选择“下一步”。

    显示如何命名新的 Visual Studio 项目的屏幕截图。

  3. 保留默认 .NET Framework 版本,然后选择“创建”。

  4. 在“解决方案资源管理器”中,右键单击新的“SimulateManagedDevice”项目,然后选择“管理 NuGet 程序包”。

  5. 选择“浏览”,然后搜索并选择“Microsoft.Azure.Devices.Client”。 选择“安装” 。

    显示如何安装 Microsoft.Azure.Devices.Client 包的屏幕截图。

    此步骤将下载、安装 Azure IoT 设备 SDK NuGet 包及其依赖项并添加对其的引用。

  6. 在 Program.cs 文件顶部添加以下 using 语句:

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    
  7. 将以下字段添加到 Program 类。 将 {device connection string} 占位符值替换为在 IoT 中心注册设备时看到的设备连接字符串:

    static string DeviceConnectionString = "{device connection string}";
    static DeviceClient Client = null;
    
  8. 添加以下函数,实现设备上的直接方法:

    static Task<MethodResponse> onReboot(MethodRequest methodRequest, object userContext)
    {
        // In a production device, you would trigger a reboot 
        //   scheduled to start after this method returns.
        // For this sample, we simulate the reboot by writing to the console
        //   and updating the reported properties.
        try
        {
            Console.WriteLine("Rebooting!");
    
            // Update device twin with reboot time. 
            TwinCollection reportedProperties, reboot, lastReboot;
            lastReboot = new TwinCollection();
            reboot = new TwinCollection();
            reportedProperties = new TwinCollection();
            lastReboot["lastReboot"] = DateTime.Now;
            reboot["reboot"] = lastReboot;
            reportedProperties["iothubDM"] = reboot;
            Client.UpdateReportedPropertiesAsync(reportedProperties).Wait();
        }
        catch (Exception ex)
        {
            Console.WriteLine();
            Console.WriteLine("Error in sample: {0}", ex.Message);
        }
    
        string result = @"{""result"":""Reboot started.""}";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. 最后,将以下代码添加到 Main 方法,打开与 IoT 中心的连接并初始化方法侦听器:

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        // setup callback for "reboot" method
        Client.SetMethodHandlerAsync("reboot", onReboot, null).Wait();
        Console.WriteLine("Waiting for reboot method\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        // as a good practice, remove the "reboot" handler
        Client.SetMethodHandlerAsync("reboot", null, null).Wait();
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  10. 在解决方案资源管理器中,右键单击解决方案,然后选择“设置启动项目”。

  11. 在“通用属性”>“启动项目”中,选择“单启动项目”,然后选择“SimulateManagedDevice”项目。 选择“确定”保存更改。

  12. 选择“生成”>“生成解决方案” 。

注意

为简单起见,本文不实现任何重试策略。 在生产代码中,应按暂时性故障处理中所述实现重试策略(例如指数退避)。

获取 IoT 中心连接字符串

在本文中,你将创建一项在设备上调用直接方法的后端服务。 若要通过 IoT 中心在设备上调用直接方法,服务需要“服务连接”权限。 默认情况下,每个 IoT 中心都使用名为“服务”的共享访问策略创建,该策略会授予此权限。

若要获取 service策略的 IoT 中心连接字符串,请执行以下步骤:

  1. Azure 门户中,选择“资源组”。 选择中心所在的资源组,然后从资源列表中选择中心。

  2. 在 IoT 中心的左侧窗格上,选择“共享访问策略”。

  3. 在策略列表中,选择“service”策略。

  4. 复制“主连接字符串”并保存该值。

屏幕截图显示如何在 Azure 门户中从 IoT 中心检索连接字符串。

有关 IoT 中心共享访问策略和权限的详细信息,请参阅访问控制和权限

创建服务应用以触发重新启动

在本部分中,会创建一个 .NET 控制台应用(使用 C#)以使用直接方法在设备上启动远程重新启动。 该应用使用设备孪生查询来搜索该设备的上次重新启动时间。

重要

本文介绍使用共享访问签名连接到服务的步骤。 虽然可使用此身份验证方法进行测试和评估,但使用 Microsoft Entra ID 或托管标识对设备进行身份验证是一种更安全的方法。 有关详细信息,请参阅安全最佳做法和云安全

  1. 打开 Visual Studio 并选择“创建新项目”。

  2. 在“创建新项目”中,找到并选择“控制台应用(.NET Framework)”项目模板,然后选择“下一步”。

  3. 在“配置新项目”中,将项目命名为“TriggerReboot”,然后选择“下一步”。

    显示如何配置新的 Visual Studio 项目的屏幕截图。

  4. 接受.NET Framework 的默认版本,然后选择“创建”以创建项目。

  5. 在“解决方案资源管理器”中,右键单击“TriggerReboot”项目,然后选择“管理 NuGet 程序包” 。

  6. 选择“浏览”,然后搜索并选择“Microsoft.Azure.Devices”。 选择“安装”以安装“Microsoft.Azure.Devices”包。

    显示如何安装 Microsoft.Azure.Devices 包的屏幕截图。

    此步骤将下载、安装 Azure IoT 服务 SDK NuGet 包及其依赖项并添加对其的引用。

  7. 在 Program.cs 文件顶部添加以下 using 语句:

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  8. 将以下字段添加到 Program 类。 将 {iot hub connection string} 占位符值替换为以前在获取 IoT 中心连接字符串中复制的 IoT 中心连接字符串。

    static RegistryManager registryManager;
    static string connString = "{iot hub connection string}";
    static ServiceClient client;
    static string targetDevice = "myDeviceId";
    
  9. 将以下方法添加到 Program 类。 此代码为重新启动的设备获取设备克隆,并输出报告的属性。

    public static async Task QueryTwinRebootReported()
    {
        Twin twin = await registryManager.GetTwinAsync(targetDevice);
        Console.WriteLine(twin.Properties.Reported.ToJson());
    }
    
  10. 将以下方法添加到 Program 类。 此代码使用直接方法在设备上启动重启。

    public static async Task StartReboot()
    {
        client = ServiceClient.CreateFromConnectionString(connString);
        CloudToDeviceMethod method = new CloudToDeviceMethod("reboot");
        method.ResponseTimeout = TimeSpan.FromSeconds(30);
    
        CloudToDeviceMethodResult result = await 
          client.InvokeDeviceMethodAsync(targetDevice, method);
    
        Console.WriteLine("Invoked firmware update on device.");
    }
    
  11. 最后,在 Main 方法中添加以下行:

    registryManager = RegistryManager.CreateFromConnectionString(connString);
    StartReboot().Wait();
    QueryTwinRebootReported().Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  12. 选择“生成”>“生成解决方案” 。

注意

本文仅针对设备的报告属性执行单个查询。 在生产代码中,我们建议通过轮询来检测报告属性是否更改。

运行应用

现在可以运行应用了。

  1. 若要运行 .NET 设备应用 SimulateManagedDevice,请在解决方案资源管理器中,右键单击“SimulateManagedDevice”项目,选择“调试”,然后选择“启动新实例”。 应用应开始侦听来自 IoT 中心的方法调用。

  2. 在设备已连接并等待方法调用之后,右键单击“TriggerReboot”项目,选择“调试”,然后选择“启动新实例”。

    应该会看到“正在重新启动”已写入 SimulatedManagedDevice 控制台,设备的报告属性(包括上次重新启动时间)已写入 TriggerReboot 控制台。

    运行的服务和设备应用

自定义和扩展设备管理操作

IoT 解决方案可扩展已定义的设备管理模式集,或通过使用设备孪生和云到设备方法基元启用自定义模式。 设备管理操作的其他示例包括恢复出厂设置、固件更新、软件更新、电源管理、网络和连接管理以及数据加密。

设备维护时段

通常情况下,将设备配置为在某一时间执行操作,以最大程度减少中断和停机时间。 设备维护时段是一种常用模式,用于定义设备应更新其配置的时间。 后端解决方案使用设备克隆所需属性在设备上定义并激活策略,以启用维护时段。 当设备收到维护时段策略时,它可以使用设备克隆报告属性报告策略状态。 然后,后端应用可以使用设备克隆查询来证明设备和每个策略的符合性。

后续步骤

本文使用直接方法触发设备上的远程重新启动。 使用报告属性报告设备上次重新启动时间,并查询设备孪生从云中发现设备上次重新启动时间。

若要继续了解 IoT 中心和设备管理模式(例如端到端基于映像的更新)入门内容,请参阅使用 Raspberry Pi 3 B+ 引用映像的 Azure IoT 中心设备更新一文

若要了解如何扩展 IoT 解决方案以及在多个设备上计划方法调用,请参阅计划和广播作业