使用 Node 将模拟设备连接到 IoT 中心

简介

Azure IoT 中心是一项完全托管的 Azure 服务。 该服务可在数百万台物联网 (IoT) 设备和一个解决方案后端之间实现安全可靠的双向通信。 IoT 项目面临的最大挑战之一是如何可靠且安全地将设备连接到解决方案后端。 为了解决此难题,IoT 中心:

  • 提供可靠的设备到云和云到设备的超大规模消息传送。
  • 使用每个设备的安全凭据和访问控制来实现安全通信。
  • 包含最流行语言和平台的设备库。

本教程演示如何:

  • 使用 Azure 门户创建 IoT 中心。
  • 在 IoT 中心内创建设备标识。
  • 创建一个模拟设备,用于将遥测数据发送到解决方案后端。

在本教程结束时,将拥有 3 个 Node.js 控制台应用:

  • CreateDeviceIdentity.js,它创建用于连接模拟设备应用的设备标识和关联的安全密钥。
  • ReadDeviceToCloudMessages.js,它显示模拟设备应用发送的遥测数据。
  • SimulatedDevice.js,它使用前面创建的设备标识连接到 IoT 中心,并使用 MQTT 协议每秒发送一次遥测消息。

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 中心的名称。 如果输入的名称有效,则显示一个绿色复选标记。

    Important

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

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

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

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

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

      IoT 中心窗口

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

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

    新建 IoT 中心窗口

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

    共享访问策略

现在已创建 IoT 中心。 已获得完成本教程的其余部分所需的 IoT 中心主机名和 IoT 中心连接字符串。

创建设备标识

本部分创建一个 Node.js 控制台应用,用于在 IoT 中心的标识注册表中创建设备标识。 设备无法连接到 IoT 中心,除非它在标识注册表中具有条目。 有关详细信息,请参阅 IoT 中心开发人员指南标识注册表部分。 运行此应用,生成的唯一设备 ID 和密钥可供设备在发送设备到云的消息时用来标识自我。

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

    npm init
    
  2. createdeviceidentity 文件夹中的命令提示符处,使用以下命令安装 azure-iothub 服务 SDK 包:

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

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

    'use strict';
    
    var iothub = require('azure-iothub');
    
  5. 向 CreateDeviceIdentity.js 文件添加以下代码。 将占位符值替换为在上一部分为中心创建的 IoT 中心连接字符串:

    var connectionString = '{iothub connection string}';
    
    var registry = iothub.Registry.fromConnectionString(connectionString);
    
  6. 添加以下代码,在 IoT 中心的设备标识注册表中创建设备定义。 如果标识注册表中没有设备 ID,此代码会创建一个设备;否则它返回现有设备的密钥:

    var device = {
      deviceId: 'myFirstNodeDevice'
    }
    registry.create(device, function(err, deviceInfo, res) {
      if (err) {
        registry.get(device.deviceId, printDeviceInfo);
      }
      if (deviceInfo) {
        printDeviceInfo(err, deviceInfo, res)
      }
    });
    
    function printDeviceInfo(err, deviceInfo, res) {
      if (deviceInfo) {
        console.log('Device ID: ' + deviceInfo.deviceId);
        console.log('Device key: ' + deviceInfo.authentication.symmetricKey.primaryKey);
      }
    }
    

    Important

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

  7. 保存并关闭 CreateDeviceIdentity.js 文件。

  8. 若要运行 createdeviceidentity 应用程序,请在 createdeviceidentity 文件夹中的命令提示符处执行以下命令:

    node CreateDeviceIdentity.js 
    
  9. 记下设备 ID设备密钥。 稍后在创建连接到作为设备的 IoT 中心的应用程序时需要这些值。

Note

IoT 中心标识注册表仅存储用于实现 IoT 中心安全访问的设备标识。 它存储设备 ID 和密钥作为安全凭据,以及启用或禁用标志(可用于禁用对单个设备的访问)。 如果应用程序需要存储其他特定于设备的元数据,则应使用特定于应用程序的存储。 有关详细信息,请参阅 IoT 中心开发人员指南

接收设备到云的消息

本部分创建一个 Node.js 控制台应用,用于读取来自 IoT 中心的设备到云消息。 IoT 中心公开与事件中心兼容的终结点,以便你可读取设备到云的消息。 为了简单起见,本教程创建的基本读取器不适用于高吞吐量部署。 Process device-to-cloud messages (处理设备到云的消息)教程介绍了如何大规模处理设备到云的消息。 事件中心入门教程提供的详细信息适用于与 IoT 中心事件中心兼容的终结点。

Note

与事件中心兼容的终结点始终使用 AMQP 协议读取设备到云的消息。

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

    npm init
    
  2. readdevicetocloudmessages 文件夹中的命令提示符处,使用以下命令安装 azure-event-hubs 包:

    npm install azure-event-hubs --save
    
  3. 使用文本编辑器,在 readdevicetocloudmessages 文件夹中创建一个 ReadDeviceToCloudMessages.js 文件。

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

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

    var connectionString = '{iothub connection string}';
    
  6. 添加以下两个函数用于在控制台中列显输出:

    var printError = function (err) {
      console.log(err.message);
    };
    
    var printMessage = function (message) {
      console.log('Message received: ');
      console.log(JSON.stringify(message.body));
      console.log('');
    };
    
  7. 添加以下代码以创建 EventHubClient,打开与 IoT 中心的连接,并为每个分区创建接收器。 在创建开始运行后只读取发送到 IoT 中心的消息的接收方时,此应用程序会使用筛选器。 此筛选器仅显示当前的消息集,很适合测试环境。 在生产环境中,代码需保证处理所有消息。 有关详细信息,请参阅 如何处理 IoT 中心设备到云的消息 教程:

    var client = EventHubClient.fromConnectionString(connectionString);
    client.open()
        .then(client.getPartitionIds.bind(client))
        .then(function (partitionIds) {
            return partitionIds.map(function (partitionId) {
                return client.createReceiver('$Default', partitionId, { 'startAfterTime' : Date.now()}).then(function(receiver) {
                    console.log('Created partition receiver: ' + partitionId)
                    receiver.on('errorReceived', printError);
                    receiver.on('message', printMessage);
                });
            });
        })
        .catch(printError);
    
  8. 保存并关闭 ReadDeviceToCloudMessages.js 文件。

创建模拟设备应用程序

本部分创建一个 Node.js 控制台应用,用于模拟向 IoT 中心发送设备到云消息的设备。

  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 文件夹中,利用文本编辑器创建 SimulatedDevice.js 文件。

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

    'use strict';
    
    var clientFromConnectionString = require('azure-iot-device-mqtt').clientFromConnectionString;
    var Message = require('azure-iot-device').Message;
    
  5. 添加 connectionString 变量,并使用它创建一个客户端实例。 将 {youriothostname} 替换为在“创建 IoT 中心”部分创建的 IoT 中心的名称。 将 {yourdevicekey} 替换为在“创建设备标识”部分生成的设备密钥值:

    var connectionString = 'HostName={youriothostname};DeviceId=myFirstNodeDevice;SharedAccessKey={yourdevicekey}';
    
    var client = clientFromConnectionString(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. 创建回调,并使用 setInterval 函数每秒向 IoT 中心发送一次消息:

    var connectCallback = function (err) {
      if (err) {
        console.log('Could not connect: ' + err);
      } else {
        console.log('Client connected');
    
        // 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);
      }
    };
    
  8. 与 IoT 中心建立连接并开始发送消息:

    client.open(connectCallback);
    
  9. 保存并关闭 SimulatedDevice.js 文件。

Note

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

运行应用

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

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

    node ReadDeviceToCloudMessages.js 
    

    用于监视设备到云消息的 Node.js IoT 中心服务应用

  2. simulateddevice 文件夹中的命令提示符处运行以下命令,开始将遥测数据发送到 IoT 中心:

    node SimulatedDevice.js
    

    用于发送设备到云消息的 Node.js IoT 中心设备应用

  3. Azure 门户中的“使用情况”磁贴显示发送到 IoT 中心的消息数:

    显示发送到 IoT 中心的消息数的 Azure 门户“使用情况”磁贴

后续步骤

本教程中,在 Azure 门户中配置了新的 IoT 中心,并在 IoT 中心的标识注册表中创建了设备标识。 已使用此设备标识来让模拟设备应用向 IoT 中心发送设备到云的消息。 还创建了一个应用,用于显示 IoT 中心接收的消息。

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

若要了解如何扩展 IoT 解决方案和如何大规模处理设备到云的消息,请参阅 Process device-to-cloud messages (处理设备到云的消息)教程。

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