前言
借着AWS免费账户,我们来进行一次虚拟的设备点对点通信实验。
IoT的含义是Internet of things,也就是所谓的物联网,现在已经渗透到了各行各业,目前我们主要关心的是各种智能家居的物联网。智能家居国内有很多厂商,包括小米、魅族(黄了)、阿里、腾讯等等企业都在搞,但国内只有阿里提供了云平台解决方案,也就是可以借助阿里云搭建自己的IoT云平台,国外的话AWS的IoT则很出名。
IoT云平台的架构大同小异,大概有如下特点:
(1)采用“订阅”的方式推拉消息,是现在分布式的主流通信方式,好处是方便一对多、多对多通信。
(2)业界通用的通信协议是MQTT,好处是体积小,适合嵌入式设备
(3)云平台上有设备的“影子”或者“实例”,保存着这个设备最后一次的属性,这样即使它离线了,其他IoT设备发给它的命令在它上线之后也能获取到,从而“弥补差异”。
(4)有“规则引擎”,也就是根据一定的规则,当消息里面出现指定内容时,转发给指定的程序处理。例如当收到“msg”消息,则转发给存储平台,存储日志;当收到人脸识别消息,则转发给机器学习平台,进行人脸识别等等。
(5)统一的安全身份认证
例如AWS IoT Core的架构:
我们先不考虑影子,直接让设备和设备通过IoT云进行通信,来体会过程。
一、实验信息
1、实验目的
熟悉IoT配置的一些过程
2、实验所需材料
(1)AWS IoT核心服务:AWS IoT Core
(2)AWS 桶存储:AWS S3
(3)AWS IoT基于JS的SDK:aws-iot-device-sdk-js
二、实验步骤
1、创建事物
一个事物代表着一台设备。
(1)进入控制台,注册事物
(2)点击创建单个事物
(3)给事物起个名字
这里我们注册一个温度传感器,命名为TmperatureSensor。类型、组、属性可以暂时不填。
(4)添加事物证书
AWS IoT支持多种方式,这里选择默认的一键添加。
(5)下载并激活生成的四个证书
注意要去下载根CA证书,随便选个CA1就可以,这里选择CA1:
随后点击完成,因为我们还没有创建策略,所以等一会再去附加策略。
(6)创建另一个事物
重复前面的步骤,创建另一个事物,我们假设是IoT智能空调BWBAriConditioner。
2、配置策略
在创建完事物之后,证书还是非活动的,因为还没有配置策略:
(1)附加策略
(2)定义策略
附加最基本的权限策略(注意Version不要修改):
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"iot:Publish",
"iot:Subscribe",
"iot:Connect",
"iot:Receive",
"iot:Message"
],
"Effect": "Allow",
"Resource": [
"*"
]
}
]
}
(3)将策略附加给证书
(4)证书就变为活动的了
3、创建规则
我们假设是,当温度传感器感应到温度低于15℃的时候,则通知空调开暖气了,并同时在存储桶S3记录下当前温度异常的日志信息。
(1)创建好一个S3存储桶
这里命名为com.bewindoweb.test.iotdata
(2)配置规则基本信息
主要是需要去构建规则转发的SQL:
SELECT tprt AS Temprature FROM 'bwbiot/Instance20181211123456/Sensors' WHERE tprt < 15
(3)配置规则操作
将前面的S3桶配置进来,键值本来应该从消息中提取(比如时间戳),这里直接用固定的键值,角色名称创建一个(如果发现S3没有存储消息,则回来点击更新角色,因为很可能是创建后没有更新角色导致的)
4、安装本地sdk环境
这里选择的是js版本的aws-iot-device-sdk-js,AWS还有C、C++版本的IoT SDK。注意nodejs版本需要在4以上。
可以直接安装:
npm install aws-iot-device-sdk-js
如果直接安装失败,则去下载源代码,然后执行:
npm install
5、开始实验
(1)在sdk下创建keys文件夹,将证书都复制进去:
(2)找到IoT平台的host
方式一,通过左侧测试→查看终端节点→转有终端节点找到:
方式二,通过事物→交互→HTTPS找到:
(3)找到两个事物的arn唯一标识
(4)仿照example/device.js,编写设备js脚本
实质上是编写一些回调函数。
TemperatureSensor.js:启动后订阅bwbiot/Instance20181211123456/Sensors主题,并发送JSON字符串报告当前温度。
const deviceModule = require('..').device;
var device = deviceModule({
keyPath: 'keys/da81ad3c5a-private.pem.key',
caPath: 'keys/AmazonRootCA1.pem',
certPath: 'keys/da81ad3c5a-certificate.pem.crt',
clientId: 'arn:aws:iot:us-east-2:443548522685:thing/TemperatureSensor',
host: 'a3nxkugk0zu3q5-ats.iot.us-east-2.amazonaws.com'
});
device.on('connect', function(err) {
console.log('TemperatureSensor: connect.');
device.subscribe('bwbiot/Instance20181211123456/Sensors');
device.publish('bwbiot/Instance20181211123456/Sensors', JSON.stringify({
tprt:11,
msg: "TemperatureSensor: It's so cold."
}));
});
device.on('message', function(topic, payload) {
console.log(topic, payload.toString());
});
BWBAirConditioner.js:连接后订阅主题并等待,接收到消息后立刻回复消息,表明自己启动了。
const deviceModule = require('..').device;
var device = deviceModule({
keyPath: 'keys/94ebe4fdf2-private.pem.key',
caPath: 'keys/AmazonRootCA1.pem',
certPath: 'keys/94ebe4fdf2-certificate.pem.crt',
clientId: 'arn:aws:iot:us-east-2:443548522685:thing/BWBAirConditioner',
host: 'a3nxkugk0zu3q5-ats.iot.us-east-2.amazonaws.com'
});
device.on('connect', function(err) {
console.log('BWBAirConditioner: connect');
device.subscribe('bwbiot/Instance20181211123456/Sensors');
});
device.on('message', function(topic, payload) {
console.log(topic, payload.toString());
device.publish('bwbiot/Instance20181211123456/Sensors', JSON.stringify({
state:'on',
message: "BWBAirConditioner: Get it, The air contitioner is up."
}));
});
(5)启动程序
开两个cmd窗口,用命令node examples\BWBAirConditioner.js
先启动BWBAirConditioner.js,然后启动TemperatureSensor.js:
当然信息还有很多,因为我们没有停止回调函数,也没有设置条件去发包。
很明显,两个设备连上了IoT云平台,并通过这个主题来进行了通信。
(6)查看主面板监控数据
开始有了一些数据(其中一些是我之前实验的数据)
(7)查看S3存储桶
发现有了一个key为20181211225100的文件:
下载下来(在线预览似乎要计费……),其数据是:
{"Temperature":11}
也就是通过SQL将tprt
字段和值写为了Temperature
到S3桶里面去。
总结
整个实验过程体会到了IoT的核心思路,设备数据相互发送,然后云平台通过规则引擎将数据转发给指定的程序去处理更复杂的事情。
六、相关资料
2、《AWS IOT Device SDK使用(nodejs )》
5、https://github.com/aws/aws-iot-device-sdk-js