设备管理入门(Node.js)

本文介绍如何创建:

  • dmpatterns_getstarted_device.js:使用直接方法来重新启动设备并报告上次重新启动时间的模拟设备应用。 从云调用直接方法。

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

先决条件

  • IoT 中心。 使用 CLIAzure 门户创建一个。

  • 已注册的设备。 在 Azure 门户中注册一个。

  • Node.js 版本 10.0.x 或更高版本。 准备开发环境 描述了如何在 Windows 或 Linux 上为本文安装 Node.js。

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

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

本部分的操作:

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

  • 触发模拟设备重启。

  • 使用报告的属性启用设备孪生查询,以标识设备及其上次重新启动的时间。

  1. 创建名为 manageddevice 的空文件夹。 在 manageddevice 文件夹中,在命令提示符处使用以下命令创建 package.json 文件。 接受所有默认值:

    npm init
    
  2. manageddevice 文件夹中的命令提示符处运行以下命令,安装 azure-iot-device 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 变量并将其用于创建 客户端 实例。 将 {yourdeviceconnectionstring} 占位符值替换为在 IoT 中心注册设备时看到的设备连接字符串:

    var connectionString = '{yourdeviceconnectionstring}';
    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 occurred 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 文件。

注释

为简单起见,本文不实现重试策略。 在生产代码中,应实施重试策略(如指数退避),如本文中建议的 暂时性故障处理

获取 IoT 中心连接字符串

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

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

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

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

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

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

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

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

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

在本部分中,你将创建一个 Node.js 控制台应用,该应用使用直接方法在设备上启动远程重启。 应用使用设备孪生查询来发现该设备的最后一次重新启动时间。

  1. 创建名为 triggerrebootondevice 的空文件夹。 在 triggerrebootondevice 文件夹中,在命令提示符处使用以下命令创建 package.json 文件。 接受所有默认值:

    npm init
    
  2. triggerrebootondevice 文件夹中的命令提示符处运行以下命令,安装 azure-iothub Device SDK 包和 azure-iot-device-mqtt 包:

    npm install azure-iothub --save
    
  3. 使用文本编辑器,在 triggerrebootondevice 文件夹中创建 dmpatterns_getstarted_service.js 文件。

  4. dmpatterns_getstarted_service.js 文件的开头添加以下“require”语句:

    'use strict';
    
    var Registry = require('azure-iothub').Registry;
    var Client = require('azure-iothub').Client;
    
  5. 添加以下变量声明,并将 {iothubconnectionstring} 占位符值替换为之前在 获取 IoT 中心连接字符串中复制的 IoT 中心连接字符串

    var connectionString = '{iothubconnectionstring}';
    var registry = Registry.fromConnectionString(connectionString);
    var client = Client.fromConnectionString(connectionString);
    var deviceToReboot = 'myDeviceId';
    
  6. 添加以下函数以调用设备方法以重新启动目标设备:

    var startRebootDevice = function(twin) {
    
        var methodName = "reboot";
    
        var methodParams = {
            methodName: methodName,
            payload: null,
            timeoutInSeconds: 30
        };
    
        client.invokeDeviceMethod(deviceToReboot, methodParams, function(err, result) {
            if (err) {
                console.error("Direct method error: "+err.message);
            } else {
                console.log("Successfully invoked the device to reboot.");  
            }
        });
    };
    
  7. 添加以下函数以查询设备并获取上次重新启动时间:

    var queryTwinLastReboot = function() {
    
        registry.getTwin(deviceToReboot, function(err, twin){
    
            if (twin.properties.reported.iothubDM != null)
            {
                if (err) {
                    console.error('Could not query twins: ' + err.constructor.name + ': ' + err.message);
                } else {
                    var lastRebootTime = twin.properties.reported.iothubDM.reboot.lastReboot;
                    console.log('Last reboot time: ' + JSON.stringify(lastRebootTime, null, 2));
                }
            } else 
                console.log('Waiting for device to report last reboot time.');
        });
    };
    
  8. 添加以下代码以调用触发重新启动直接方法的函数,并查询上次重新启动时间:

    startRebootDevice();
    setInterval(queryTwinLastReboot, 2000);
    
  9. 保存并关闭 dmpatterns_getstarted_service.js 文件。

运行应用

现在,你已准备好运行应用。

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

    node dmpatterns_getstarted_device.js
    
  2. triggerrebootondevice 文件夹中的命令提示符处,运行以下命令以触发远程重新启动并查询设备孪生以查找上次重新启动时间。

    node dmpatterns_getstarted_service.js
    
  3. 你将在控制台中看到对重新启动直接方法的设备响应和重新启动状态。

    下面显示了对服务发送的重新启动直接方法的设备响应:

    受管理设备应用输出

    下面显示了触发重启的服务,并轮询设备孪生体以获取上次重启时间:

    triggerrebootondevice 应用输出

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

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

设备维护窗口

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

后续步骤

本文使用直接方法在设备上触发远程重启。 你利用报告的属性报告设备的上次重启时间,并查询设备孪生以便从云端发现设备的上次重启时间。

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