使用 IoT 中心发送云到设备的消息(Node.js)

Azure IoT 中心是一项完全托管的服务,可帮助在数百万台设备与解决方案后端之间实现可靠且安全的双向通信。

本文将向您介绍如何操作:

  • 通过 IoT 中心将云到设备的消息从解决方案后端发送到单个设备

  • 在设备上接收云到设备的消息

  • 请求来自您的解决方案后端的传递确认(反馈),用于从 IoT 中心发送到设备的消息。

注释

本文中所述的功能仅在 IoT 中心的标准层中可用。 有关基本层和标准/免费 IoT 中心层的详细信息,请参阅 为解决方案选择正确的 IoT 中心层和大小

本文结束时,将运行两个 Node.js 控制台应用:

注释

IoT 中心通过 Azure IoT 设备 SDK 支持许多设备平台和语言(C、Java、Python 和 JavaScript)。

若要详细了解云到设备的消息,请参阅 从 IoT 中心发送云到设备的消息

先决条件

在模拟设备应用中接收消息

在本部分中,修改设备应用以从 IoT 中心接收云到设备的消息。

  1. 使用文本编辑器打开 SimulatedDevice.js 文件。 此文件位于您在将遥测数据从设备发送到 IoT 中心的快速入门中下载的 Node.js 示例代码的根文件夹下的 iot-hub\Quickstarts\simulated-device 文件夹中。

  2. 向设备客户端注册处理程序,以接收从 IoT 中心发送的消息。 请在创建设备客户端的行之后,添加对client.on的调用,如以下代码片段所示:

    var client = DeviceClient.fromConnectionString(connectionString, Mqtt);
    
    client.on('message', function (msg) {
      console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
      client.complete(msg, function (err) {
        if (err) {
          console.error('complete error: ' + err.toString());
        } else {
          console.log('complete sent');
        }
      });
    });
    

在此示例中,设备调用 完整的 函数,以通知 IoT 中心已处理消息,并且可以安全地从设备队列中删除该消息。 如果使用 MQTT 传输,则不需要调用 完成。 AMQP 和 HTTPS 需要它。

使用 AMQP 和 HTTPS,而不是 MQTT,设备还可以:

  • 暂时放弃消息,这会导致 IoT 中心将消息保留在设备队列中以供日后使用。
  • 将消息从设备队列中永久删除。

如果发生阻止设备完成、放弃或拒绝消息的情况,IoT 中心将在固定超时期限后再次将消息排成队列以供传递。 因此,设备应用中的消息处理逻辑必须是 幂等的,以便多次接收相同的消息会产生相同的结果。

有关云到设备的消息生命周期以及 IoT 中心如何处理云到设备的消息的详细信息,请参阅 从 IoT 中心发送云到设备的消息

注释

如果使用 HTTPS 而不是 MQTT 或 AMQP 作为传输, DeviceClient 实例不常检查来自 IoT 中心的消息(至少每 25 分钟)。 有关 MQTT、AMQP 和 HTTPS 支持之间的差异的详细信息,请参阅云到设备通信指南选择通信协议

获取 IoT 中心连接字符串

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

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

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

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

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

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

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

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

发送云到设备的消息

在本部分中,你将创建一个 Node.js 控制台应用,用于将云到设备的消息发送到模拟设备应用。 需要从设备获取设备 ID,并获取 IoT 中心连接字符串。

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

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

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

  4. require 文件的开头添加以下语句:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. 将以下代码添加到 SendCloudToDeviceMessage.js 文件。 将“{iot 中心连接字符串}”和“{device id}”占位符值替换为前面记录的 IoT 中心连接字符串和设备 ID:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. 添加以下函数以将作结果打印到控制台:

    function printResultFor(op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res.constructor.name);
      };
    }
    
  7. 添加以下函数以将传递反馈消息打印到控制台:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. 添加以下代码以向设备发送消息,并在设备确认云到设备消息时处理反馈消息:

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFeedbackReceiver(receiveFeedback);
        var message = new Message('Cloud to device message.');
        message.ack = 'full';
        message.messageId = "My Message ID";
        console.log('Sending message: ' + message.getData());
        serviceClient.send(targetDevice, message, printResultFor('send'));
      }
    });
    
  9. 保存并关闭 SendCloudToDeviceMessage.js 文件。

运行应用程序

现在可以运行应用程序了。

  1. simulated-device 文件夹中的命令提示符处运行以下命令,将遥测数据发送到 IoT 中心并侦听云到设备的消息:

    node SimulatedDevice.js
    

    运行模拟设备应用

  2. sendcloudtodevicemessage 文件夹中的命令提示符处,运行以下命令以发送云到设备的消息并等待确认反馈:

    node SendCloudToDeviceMessage.js
    

    运行应用以发送云到设备命令

    注释

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

后续步骤

本文介绍了如何发送和接收云到设备的消息。