通过 Node.js 使用 IoT 设备上的直接方法

Azure IoT 中心是一项完全托管的服务,可在数百万个设备和一个解决方案后端之间实现安全可靠的双向通信。 以前的教程(IoT 中心入门使用 IoT 中心发送云到设备的消息 )介绍了 IoT 中心的设备到云和云到设备的基本消息传递功能。 用户还可以通过 IoT 中心从云调用设备上的非持久方法。 直接方法表示与设备进行的请求-答复式交互,类似于 HTTPS 调用,因为它们不管是成功还是失败,速度都非常快(在用户指定的超时过后),会让用户知道调用的状态。 调用设备上的直接方法更详细地介绍了各种直接方法,指导用户何时使用直接方法而不是云到设备消息或所需属性。

Note

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

本教程演示如何:

  • 使用 Azure 门户创建 IoT 中心,以及如何在 IoT 中心创建设备标识。
  • 创建一个模拟设备应用,该应用包含可通过云调用的直接方法。
  • 创建一个控制台应用,该应用通过 IoT 中心调用模拟设备应用中的直接方法。

本教程结束时,会创建两个 Node.js 控制台应用:

  • CallMethodOnDevice.js,用于在模拟设备应用上调用方法并显示响应。
  • SimulatedDevice.js,可使用前面创建的设备标识连接到 IoT 中心,并响应通过云调用的方法。

Note

Azure IoT SDK 文章介绍了 Azure IoT SDK,这些 SDK 可用于构建在设备和解决方案后端运行的应用程序。

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

  • Node.js 版本 4.0.x 或更高版本。
  • 有效的 Azure 帐户。 (如果没有帐户,只需花费几分钟就能创建一个帐户。)

创建 IoT 中心

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

  1. 登录到 Azure 门户

  2. 选择“创建资源” > “物联网” > “IoT 中心”。

    Azure 门户跳转栏

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

    • 订阅:选择需要将其用于创建此 IoT 中心的订阅。

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

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

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

    Important

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

    IoT 中心基本信息窗口

  4. 选择“下一步: 大小和规模”,以便继续创建 IoT 中心。

  5. 选择“定价和缩放层”。 就本文来说,请选择“F1 - 免费”层(前提是此层在订阅上仍然可用)。 有关详细信息,请参阅定价和缩放层

    IoT 中心大小和规模窗口

  6. 选择“查看 + 创建”。

  7. 查看 IoT 中心信息,然后单击“创建”。 创建 IoT 中心可能需要数分钟的时间。 可在“通知”窗格中监视进度。

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

  9. 在“共享访问策略”中,选择 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 中心入门

创建模拟设备应用程序

在本部分,用户需创建一个 Node.js 控制台应用,用于响应通过云调用的方法。

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

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

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

    'use strict';
    
    var Mqtt = require('azure-iot-device-mqtt').Mqtt;
    var DeviceClient = require('azure-iot-device').Client;
    
  5. 添加 connectionString 变量,并使用它创建 DeviceClient 实例。 将 {device connection string} 替换为在“创建设备标识”部分生成的设备连接字符串:

    var connectionString = '{device connection string}';
    var client = DeviceClient.fromConnectionString(connectionString, Mqtt);
    
  6. 添加以下函数,实现设备上的方法:

    function onWriteLine(request, response) {
        console.log(request.payload);
    
        response.send(200, 'Input was written to log.', function(err) {
            if(err) {
                console.error('An error ocurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.' );
            }
        });
    }
    
  7. 打开与 IoT 中心的连接并开始初始化方法侦听器:

    client.open(function(err) {
        if (err) {
            console.error('could not open IotHub client');
        }  else {
            console.log('client opened');
            client.onDeviceMethod('writeLine', onWriteLine);
        }
    });
    
  8. 保存并关闭 SimulatedDevice.js 文件。

Note

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

调用设备上的方法

在此部分中,会创建一个 Node.js 控制台应用,该应用在模拟设备应用上调用方法并随后显示响应。

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

    npm init
    
  2. callmethodondevice 文件夹的命令提示符处,运行以下命令以安装 azure-iothub 包:

    npm install azure-iothub --save
    
  3. 使用文本编辑器,在 callmethodondevice 文件夹中创建 CallMethodOnDevice.js 文件。
  4. CallMethodOnDevice.js 文件的开头添加以下 require 语句:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    
  5. 添加以下变量声明,并将占位符值替换为中心的 IoT 中心连接字符串:

    var connectionString = '{iothub connection string}';
    var methodName = 'writeLine';
    var deviceId = 'myDeviceId';
    
  6. 创建客户端,以便打开到 IoT 中心的连接。

    var client = Client.fromConnectionString(connectionString);
    
  7. 添加以下函数,以便调用设备方法并将设备响应输出到控制台:

    var methodParams = {
        methodName: methodName,
        payload: 'hello world',
        timeoutInSeconds: 30
    };
    
    client.invokeDeviceMethod(deviceId, methodParams, function (err, result) {
        if (err) {
            console.error('Failed to invoke method \'' + methodName + '\': ' + err.message);
        } else {
            console.log(methodName + ' on ' + deviceId + ':');
            console.log(JSON.stringify(result, null, 2));
        }
    });
    
  8. 保存并关闭 CallMethodOnDevice.js 文件。

运行应用

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

  1. simulateddevice 文件夹的命令提示符处运行以下命令,开始侦听从 IoT 中心发出的方法调用:

    node SimulatedDevice.js
    

  2. callmethodondevice 文件夹的命令提示符处运行以下命令,开始监视 IoT 中心:

    node CallMethodOnDevice.js 
    

  3. 此时会看到设备通过输出消息对方法进行响应,而调用该方法的应用程序则会显示来自设备的响应:

后续步骤

本教程中,在 Azure 门户中配置了新的 IoT 中心,并在 IoT 中心的标识注册表中创建了设备标识。 已通过此设备标识启用模拟设备应用的相关功能,使之能够响应通过云调用的方法。 还创建了一个应用,用于调用设备上的方法并显示来自设备的响应。

若要继续了解 IoT 中心入门知识并浏览其他 IoT 方案,请参阅:

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