设备管理入门 (.NET/Node)

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

Note

本文中所述的功能仅可在 IoT 中心的标准层中使用。 有关基本和标准 IoT 中心层的详细信息,请参阅如何选择合适的 IoT 中心层

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

  • 处理从 IoT 中心发送的方法请求。
  • 在设备上启动相应的设备特定操作。
  • 通过向 IoT 中心报告的属性,提供状态更新。

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

本教程演示如何:

  • 使用 Azure 门户创建 IoT 中心,以及如何在 IoT 中心创建设备标识。
  • 创建包含重新启动该设备的直接方法的模拟设备应用。 直接方法是从云中调用的。
  • 创建一个 .NET 控制台应用,其通过 IoT 中心在模拟设备应用上调用重新启动直接方法。

本教程结束时,用户会有一个 Node.js 控制台设备应用,以及一个 .NET (C#) 控制台后端应用:

dmpatterns_getstarted_device.js,它使用先前创建的设备标识连接到 IoT 中心,接收重新启动直接方法,模拟物理重新启动,并报告上次重新启动的时间。

TriggerReboot,它在模拟设备应用中调用直接方法、显示响应以及显示更新的报告属性。

要完成本教程,需要以下各项:

  • Visual Studio 2015 或 Visual Studio 2017。
  • Node.js 版本 4.0.x 或更高版本;
    准备开发环境介绍了如何在 Windows 或 Linux 上安装本教程所用的 Node.js。
  • 有效的 Azure 帐户。 如果没有帐户,可以创建一个试用帐户,只需几分钟即可完成。

创建 IoT 中心

创建模拟设备应用要连接到的 IoT 中心。 以下步骤说明如何使用 Azure 门户来完成此任务。

  1. 登录到 Azure 门户

  2. 选择“新建” > “物联网” > “IoT 中心”。

    Azure 门户跳转栏

  3. 在“IoT 中心”窗格中,输入 IoT 中心的以下信息:

    • 名称:创建 IoT 中心的名称。 如果输入的名称有效,则显示一个绿色复选标记。

    Important

    IoT 中心将公开为 DNS 终结点,因此,命名时请务必避免包含任何敏感信息。

    • 定价和缩放级别:对于本教程,请选择F1 - 免费级别。 有关详细信息,请参阅定价和缩放层

    • 资源组:创建用于托管 IoT 中心的资源组,或使用现有的资源组。 有关详细信息,请参阅使用资源组管理 Azure 资源

    • 位置:选择最近的位置。

    • 固定仪表板:选中此选项可以方便地从仪表板访问 IoT 中心。

      IoT 中心窗口

  4. 单击“创建”。 创建 IoT 中心可能需要数分钟的时间。 可在“通知”窗格中监视进度。

  5. 新的 IoT 中心就绪以后,请在 Azure 门户中单击其磁贴,打开其属性窗口。 创建 IoT 中心以后,即可找到将设备和应用程序连接到 IoT 中心时需要使用的重要信息。 记下“主机名”,并单击“共享访问策略”。

    新建 IoT 中心窗口

  6. 在“共享访问策略”中,单击“iothubowner”策略,然后记下“iothubowner”窗口中的 IoT 中心连接字符串。 有关详细信息,请参阅“IoT 中心开发人员指南”中的访问控制

    共享访问策略

创建设备标识

本部分使用名为 iothub-explorer 的 Node.js 工具为本教程创建设备标识。 设备 ID 区分大小写。

  1. 在命令行环境中运行以下命令:

    npm install -g iothub-explorer@latest

  2. 然后,运行以下命令登录到中心。 将 {iot hub connection string} 替换为前面复制的 IoT 中心连接字符串:

    iothub-explorer login "{iot hub connection string}"

  3. 最后,以下使用命令创建名为 myDeviceId 的新设备标识:

    iothub-explorer create myDeviceId --connection-string

    Important

    收集的日志中可能会显示设备 ID 用于客户支持和故障排除,因此,在为日志命名时,请务必避免包含任何敏感信息。

记下结果中的设备连接字符串。 设备应用使用此设备连接字符串以设备身份连接到 IoT 中心。

若要以编程方式创建设备标识,请参阅 IoT 中心入门

使用直接方法在设备上触发远程重新启动

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

  1. 在 Visual Studio 中,使用“控制台应用(.NET Framework)”项目模板将 Visual C# Windows 经典桌面项目添加到新解决方案。 确保 .NET Framework 版本为 4.5.1 或更高。 TriggerReboot

    新的 Visual C# Windows 经典桌面项目

  2. 在“解决方案资源管理器”中,右键单击“TriggerReboot”项目,并单击“管理 NuGet 包”。

  3. 在“NuGet 包管理器”窗口中,选择“浏览”,搜索 microsoft.azure.devices,选择“安装”以安装 Microsoft.Azure.Devices 包,并接受使用条款。 此过程会下载、安装 Azure IoT 服务 SDK NuGet 包及其依赖项并添加对它的引用。

    “NuGet 包管理器”窗口

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

     using Microsoft.Azure.Devices;
     using Microsoft.Azure.Devices.Shared;
    
  5. 将以下字段添加到 Program 类。 将占位符值替换为在“创建 IoT 中心”部分中为中心创建的 IoT 中心连接字符串。

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

    public static async Task QueryTwinRebootReported()
    {
        Twin twin = await registryManager.GetTwinAsync(targetDevice);
        Console.WriteLine(twin.Properties.Reported.ToJson());
    }
    
  7. 将以下方法添加到 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.");
    }
    
  8. 最后,在 Main 方法中添加以下行:

    registryManager = RegistryManager.CreateFromConnectionString(connString);
    StartReboot().Wait();
    QueryTwinRebootReported().Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  9. 生成解决方案。

创建模拟设备应用程序

在本部分,用户需

  • 创建一个 Node.js 控制台应用,用于响应通过云调用的直接方法
  • 触发模拟的设备重启
  • 使用报告属性,允许通过设备孪生查询标识设备及其上次重启的时间
  1. 新建名为 manageddevice的空文件夹。 在 manageddevice 文件夹的命令提示符处,使用以下命令创建 package.json 文件。 接受所有默认值:

    npm init
    
  2. manageddevice 文件夹的命令提示符处,运行下述命令以安装 azure-iot-device 设备 SDK 包和 azure-iot-device-mqtt 包:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. manageddevice 文件夹中,利用文本编辑器创建新的 dmpatterns_getstarted_device.js 文件。
  4. dmpatterns_getstarted_device.js 文件开头添加以下“require”语句:

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. 添加 connectionString 变量,并使用它创建一个客户端实例。 将连接字符串替换为设备连接字符串。

    var connectionString = 'HostName={youriothostname};DeviceId=myDeviceId;SharedAccessKey={yourdevicekey}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. 添加以下函数,实现设备上的直接方法

    var onReboot = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, 'Reboot started', function(err) {
            if (!err) {
                console.error('An error occured when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        // Report the reboot before the physical restart
        var date = new Date();
        var patch = {
            iothubDM : {
                reboot : {
                    lastReboot : date.toISOString(),
                }
            }
        };
    
        // Get device Twin
        client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                console.log('twin acquired');
                twin.properties.reported.update(patch, function(err) {
                    if (err) throw err;
                    console.log('Device reboot twin state reported')
                });  
            }
        });
    
        // Add your device's reboot API for physical restart.
        console.log('Rebooting!');
    };
    
  7. 添加以下代码,打开与 IoT 中心的连接并启动直接方法侦听器:

    client.open(function(err) {
        if (err) {
            console.error('Could not open IotHub client');
        }  else {
            console.log('Client opened.  Waiting for reboot method.');
            client.onDeviceMethod('reboot', onReboot);
        }
    });
    
  8. 保存并关闭 dmpatterns_getstarted_device.js 文件。

    Note

    为简单起见,本教程不实现任何重试策略。 在生产代码中,应该按 MSDN 文章 Transient Fault Handling(暂时性故障处理)中所述实施重试策略(例如指数性的回退)。

运行应用

现在,已准备就绪,可以运行应用。

  1. manageddevice 文件夹的命令提示符处,运行以下命令以开始侦听重新启动直接方法。

    node dmpatterns_getstarted_device.js
    
  2. 运行 C# 控制台应用 TriggerReboot。 右键单击“TriggerReboot”项目,选择“调试”,并选择“启动新实例”。

  3. 可以在控制台中看到设备对直接方法的响应。

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

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

设备维护时段

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

后续步骤

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

若要继续完成 IoT 中心和设备管理模式(如远程无线固件更新)的入门内容,请参阅:

教程:如何进行固件更新

若要了解如何扩展 IoT 解决方案并在多个设备上计划方法调用,请参阅 Schedule and broadcast jobs (计划和广播作业)教程。