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

简介

Azure IoT 中心是一项完全托管的服务,有助于在数百万台设备和单个解决方案后端之间实现安全可靠的双向通信。 IoT 中心入门 教程介绍了如何创建 IoT 中心和在其中预配设备标识,并介绍了如何编写用于发送设备到云消息的模拟设备应用。

Note

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

本教程是在 IoT 中心入门的基础上编写的。 其中了说明了如何:

  • 通过 IoT 中心,将云到设备的消息从解决方案后端发送到单个设备。
  • 在设备上接收云到设备的消息。
  • 通过解决方案后端,请求确认收到从 IoT 中心发送到设备的消息(反馈)。

可以在 IoT 中心开发人员指南中找到有关云到设备消息的详细信息。

在本教程结束时,会运行两个 Node.js 控制台应用:

  • SimulatedDevice,这是在 IoT 中心入门中创建的应用的修改版本,可连接到 IoT 中心并接收云到设备的消息。
  • SendCloudToDeviceMessage,它将云到设备消息通过 IoT 中心发送到模拟设备应用,然后接收其传送确认。

Note

IoT 中心通过 Azure IoT 设备 SDK 对许多设备平台和语言(包括 C、Java 和 Javascript)提供 SDK 支持。 有关如何将设备连接到本教程的代码以及通常如何连接到 Azure IoT 中心的分步说明,请参阅 Azure IoT 开发人员中心

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

  • Node.js 版本 4.0.x 或更高版本。

  • 有效的 Azure 帐户。 如果没有帐户,可以创建一个试用帐户,只需几分钟即可完成。

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

本部分介绍如何修改在 IoT 中心入门中创建的模拟设备应用,以接收来自 IoT 中心的“云到设备”消息。

  1. 使用文本编辑器打开 SimulatedDevice.js 文件。
  2. 修改 connectCallback 函数以处理 IoT 中心发来的消息。 在本示例中,设备始终调用 complete 函数,以通知 IoT 中心它已处理消息。 connectCallback 函数的新版本类似于以下代码片段:

    var connectCallback = function (err) {
      if (err) {
        console.log('Could not connect: ' + err);
      } else {
        console.log('Client connected');
        client.on('message', function (msg) {
          console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
          client.complete(msg, printResultFor('completed'));
        });
        // Create a message and send it to the IoT Hub every second
        setInterval(function(){
            var temperature = 20 + (Math.random() * 15);
            var humidity = 60 + (Math.random() * 20);            
            var data = JSON.stringify({ deviceId: 'myFirstNodeDevice', temperature: temperature, humidity: humidity });
            var message = new Message(data);
            message.properties.add('temperatureAlert', (temperature > 30) ? 'true' : 'false');
            console.log("Sending message: " + message.getData());
            client.sendEvent(message, printResultFor('send'));
        }, 1000);
      }
    };
    

    Note

    如果使用 HTTPS(而不使用 MQTT 或 AMQP)作为传输,则 DeviceClient 实例将不会频繁(频率低于每 25 分钟一次)检查 IoT 中心发来的消息。 有关 MQTT、AMQP 和 HTTPS 支持之间的差异,以及 IoT 中心限制的详细信息,请参阅 IoT 中心开发人员指南

发送云到设备的消息

在本部分中,会创建一个 Node.js 控制台应用,用于将云到设备的消息发送到模拟设备应用。 需要使用 IoT 中心入门教程中添加的设备的设备 ID。 还需要中心的 IoT 中心连接字符串(位于 Azure 门户)。

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

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

    npm install azure-iothub --save
    
  3. 通过文本编辑器,在 sendcloudtodevicemessage 文件夹中创建一个 SendCloudToDeviceMessage.js 文件。
  4. SendCloudToDeviceMessage.js 文件的开头添加以下 require 语句:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. 将以下代码添加到 SendCloudToDeviceMessage.js 文件。 将“{iot hub connection string}”占位符值替换为在 IoT 中心入门教程中创建的中心的 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. simulateddevice 文件夹的命令提示符下,运行以下命令将遥测发送到 IoT 中心,并侦听云到设备消息:

    node SimulatedDevice.js 
    

    运行模拟设备应用

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

    node SendCloudToDeviceMessage.js 
    

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

    Note

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

后续步骤

在本教程中,已学习如何发送和接收云到设备的消息。

若要查看使用 IoT 中心完成端到端解决方案的示例,请参阅 Azure IoT 远程监视解决方案加速器

若要了解有关使用 IoT 中心开发解决方案的详细信息,请参阅 IoT 中心开发人员指南