在本课中,我们将安装开发物联网平台时使用到的组件,并把物联网平台的开发环境搭建起来。

安装组件

首先在开发机上面安装开发需要的组件。

MongoDB

MongDB 是一个基于分布式文件存储的数据库,我们会把 MongoDB 作为物联网平台主要的数据存储工具。
可以在这里找到 MongoDB 的安装文档,根据文档在对应的系统上安装和运行 MongoDB。

Redis

Redis 是一个高效的内存数据库,物联网平台会使用 Redis 来实现缓存和简单的队列功能。
请根据这里的文档,在对应的系统上安装和运行 Redis。

Node.js

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,我们会使用 Node.js 来开发物联网平台的主要功能。
请根据这里的文档在对应的系统上面安装 Node.js。

RabbitMQ

RabbitMQ 是使用 Erlang 编写的 AMQP Broker,物联网平台使用 RabbitMQ 作为队列系统实现物联网平台内部以及物联网平台到业务系统的异步通信。
请根据这里在对应的系统上按照和运行 RabbitMQ。

EMQ X

EMQ X 是一个使用 Erlang 编写的 MQTT Broker,物联网平台使用 EMQ X 来实现 MQTT/CoAP 协议接入,并使用 EMQ X 的一些高级功能来简化和加速开发。
可以在这里找到 EMQ X 的安装文档,安装完毕之后,在控制台运行:

  1. <EMQ X 安装目录>/bin/emqx start

如果命令行输出为 emqx 3.2.0 is started successfully! 那说明 EMQ X 已经成功安装并运行了。

本课程在编写时,使用的版本为EMQ X Broker V 3.2.0。 EMQ X Enterprise为 EMQ X 的付费版本,注意不要安装错了。

那么开发物联网平台需要的组件就安装完了,接下来我们简单介绍一下物联网平台的各个组成部分。
首先给这个物联网平台取一个代号,就叫它 Maque IotHub 吧,寓意麻雀虽小,五脏俱全。 接下来我们把后续课程中会出现的实体都定义一下:

  • Maque IotHub:我们将要开发的物联网平台,简称 IotHub。
  • Maque IotHub Server API:Maque IotHub 的服务端 API,以 Restful API 的形式将功能提供给外部业务系统调用,简称 Server API。
  • Maque IotHub Server:Maque IotHub 的服务端,包含了 Server API 和主要的 IotHub 服务端功能代码,简称为 IotHub Server。
  • 业务系统:指实现特定物联网应用服务端的业务逻辑系统,它通过调用 Maque IotHub Server API 的方式来控制设备/使用设备上报的数据,Maque IotHub 为它屏蔽了和设备交互的细节。
  • Maque IotHub DeviceSDK: Maque IotHub 提供的设备端 SDK,设备通过调用 SDK 提供的 API 接入 Maque IotHub,并和业务系统进行交互,简称 DeviceSDK。
  • 设备应用代码:实现设备具体功能的代码,比如打开灯、在屏幕上显示温度等,它调用 Maque IotHub DeviceSDK 来使用 Maque IotHub 提供的功能。

在后续的课程中就用 IotHub 来指代我们开发的这个物联网平台,用 DeviceSDK 来指代设备端的 SDK 代码,用 IotHub Server 来指代物联网平台的服务端代码。

项目结构

本课程会使用两个 Node.js 的项目来进行开发,分别是物联网平台的服务端代码 IotHub Server 和设备端代码 DeviceSDK。

Maque IotHub Server

服务端代码以一个 Express 项目作为开始, Express 是一个 Node.js 轻量级的 Web 开发框架,非常适合开发 Restful API,项目的结构如下图所示:
3.准备工作台 - 图1

这个项目包含了 Maque IotHub Server API 以及 Maque IotHub 服务端的一些其他功能。

Maque IotHub DeviceSDK

测试 MQTT 连接

首先我们来验证一下 EMQ X Broker 是否已经配置正确,并可以接受 MQTT 连接了。
同样地,这里使用一个 Node.js 项目开发 Maque IotHub DeviceSDK 代码。
package.json 中添加 MQTT 的 Node.js 库:

  1. "dependencies": {
  2. "mqtt": "^2.18.8"
  3. }

然后运行 npm install
我们可以写一小段代码来测试一下 MQTT 连接:

  1. //test_mqtt.js
  2. var mqtt = require('mqtt')
  3. var client = mqtt.connect('mqtt://127.0.0.1:1883')
  4. client.on('connect', function (connack) {
  5. console.log(`return code: ${connack.returnCode}`)
  6. client.end()
  7. })

如果不出意外的话,控制台会输出:return code: 0

重新组织代码

为了方便设备应用代码的开发, DeviceSDK 会把和 MQTT 相关代码,以及同Maque IotHub Server交互的相关的代码进行封装,这里我们实现一个类 IotDevice作为 DeviceSDK 的入口:

  1. //iot_device.js
  2. "use strict";
  3. var mqtt = require('mqtt')
  4. const EventEmitter = require('events');
  5. class IotDevice extends EventEmitter {
  6. constructor(serverAddress = "127.0.0.1:8883") {
  7. super();
  8. this.serverAddress = `mqtts://${serverAddress}`
  9. }
  10. connect() {
  11. this.client = mqtt.connect(this.serverAddress, {
  12. rejectUnauthorized: false
  13. })
  14. var self = this
  15. this.client.on("connect", function () {
  16. self.emit("online")
  17. })
  18. this.client.on("offline", function () {
  19. self.emit("offline")
  20. })
  21. this.client.on("error", function (err) {
  22. self.emit("error", err)
  23. })
  24. }
  25. disconnect() {
  26. if (this.client != null) {
  27. this.client.end()
  28. }
  29. }
  30. }
  31. module.exports = IotDevice;

这段代码做了这几件事。

  • 封装了 MQTT Client 的 connect 和 disconnect 。
  • 通过设定 MQTT 连接地址为 mqtts://127.0.0.1:8883 的方式,在传输层使用 SSL。 EMQ X 默认使用一个自签署的的证书,所以我们需要设定 rejectUnauthorized: false
  • 通过 Events 和设备应用代码进行交互。

那么使用 IotDevice 类进行连接设备应用代码如下:

  1. var device = new IotDevice()
  2. device.on("online", function () {
  3. console.log("device is online")
  4. device.disconnect()
  5. })
  6. device.on("offline", function () {
  7. console.log("device is offline")
  8. })
  9. device.connect()

Maque IotHub DeviceSDK 项目结构如下图所示:

3.准备工作台 - 图2

  • 在 sdk 目录中是 DeviceSDK 的代码。
  • 在 samples 目录中是调用 DeviceSDK 的示例代码。

工作台准备完毕! 准备好开发环境以后,下面就开始实现第一个功能:设备注册