Skip to content

AWS IoT Hello World:设备点对点通信

借着AWS免费账户,我们来进行一次虚拟的设备点对点通信实验。

IoT的含义是Internet of things,也就是所谓的物联网,现在已经渗透到了各行各业,目前我们主要关心的是各种智能家居的物联网。智能家居国内有很多厂商,包括小米、魅族(黄了)、阿里、腾讯等等企业都在搞,但国内只有阿里提供了云平台解决方案,也就是可以借助阿里云搭建自己的IoT云平台,国外的话AWS的IoT则很出名。

IoT云平台的架构大同小异,大概有如下特点:

  1. 采用“订阅”的方式推拉消息,是现在分布式的主流通信方式,好处是方便一对多、多对多通信。

  2. 业界通用的通信协议是MQTT,好处是体积小,适合嵌入式设备

  3. 云平台上有设备的“影子”或者“实例”,保存着这个设备最后一次的属性,这样即使它离线了,其他IoT设备发给它的命令在它上线之后也能获取到,从而“弥补差异”。

  4. 有“规则引擎”,也就是根据一定的规则,当消息里面出现指定内容时,转发给指定的程序处理。例如当收到“msg”消息,则转发给存储平台,存储日志;当收到人脸识别消息,则转发给机器学习平台,进行人脸识别等等。

  5. 统一的安全身份认证

例如AWS IoT Core的架构: 6b7f518c90646bebea84043ecb9d54c1.png 我们先不考虑影子,直接让设备和设备通过IoT云进行通信,来体会过程。

实验信息

1、实验目的

熟悉IoT配置的一些过程

2、实验所需材料

实验步骤

1、创建事物

一个事物代表着一台设备。

  1. 进入控制台,注册事物 54b2c6ab79fd290af80484f757e4427d.png

  2. 点击创建单个事物 d419a98d0fa24186c3da706821d158c1.png

  3. 给事物起个名字

这里我们注册一个温度传感器,命名为TmperatureSensor。类型、组、属性可以暂时不填。 eebf062a4cfce8b8528786a9522e847d.png

  1. 添加事物证书

AWS IoT支持多种方式,这里选择默认的一键添加。 bbc306984dbf680676eeb2d3ed271140.png

  1. 下载并激活生成的四个证书

1add57a69d78260f6562773afe7cfabc.png 注意要去下载根CA证书,随便选个CA1就可以,这里选择CA1: 2b763f0139be1bc804eb6d924010ad79.png 随后点击完成,因为我们还没有创建策略,所以等一会再去附加策略。

  1. 创建另一个事物

重复前面的步骤,创建另一个事物,我们假设是IoT智能空调BWBAriConditioner。 be55da2ed53c52d08344ea8d0d6b3513.png

2、配置策略

在创建完事物之后,证书还是非活动的,因为还没有配置策略: 800aae341c3f6601e0c01a467bf6beef.png

  1. 附加策略 0139740203141871b096df2d27acc1d4.png

  2. 定义策略

附加最基本的权限策略(注意Version不要修改):

json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "iot:Publish",
        "iot:Subscribe",
        "iot:Connect",
        "iot:Receive",
        "iot:Message"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}

c3e3501175291ac4e580d156c1b433c5.png

  1. 将策略附加给证书 8eefeeae2bb72ce5f534502dafe2b573.png

  2. 证书就变为活动的了 a7d1d79e6e03662796b487108e486120.png

3、创建规则

我们假设是,当温度传感器感应到温度低于15℃的时候,则通知空调开暖气了,并同时在存储桶S3记录下当前温度异常的日志信息。

  1. 创建好一个S3存储桶

这里命名为com.bewindoweb.test.iotdata 111a21c1206a98808000f19b6f416c6e.png

  1. 配置规则基本信息

主要是需要去构建规则转发的SQL:

sql
SELECT tprt AS Temprature 
FROM 'bwbiot/Instance20181211123456/Sensors' 
WHERE tprt < 15

636193eb50ba1150538676d0b633aa83.png

  1. 配置规则操作

将前面的S3桶配置进来,键值本来应该从消息中提取(比如时间戳),这里直接用固定的键值,角色名称创建一个(如果发现S3没有存储消息,则回来点击更新角色,因为很可能是创建后没有更新角色导致的) d0b7c5f07a88da09edb784e2aa5e17d2.png

4、安装本地sdk环境

这里选择的是js版本的aws-iot-device-sdk-js,AWS还有C、C++版本的IoT SDK。注意nodejs版本需要在4以上。

可以直接安装:

shell
npm install aws-iot-device-sdk-js

如果直接安装失败,则去下载源代码,然后执行:

shell
npm install

64a574fe48a7f48f2c44da62792d5ef6.png

5、开始实验

  1. 在sdk下创建keys文件夹,将证书都复制进去: cf94020d3dfdc51036ebd5da27dab8c2.png

  2. 找到IoT平台的host

方式一,通过左侧测试→查看终端节点→转有终端节点找到: 0691e4ce598a81208f8f715bef587145.png4b2737b3251f88e9ee2ec890cfdacbf4.png

方式二,通过事物→交互→HTTPS找到: 972938e562e32ba3bfa2aafe55e793f6.png

  1. 找到两个事物的arn唯一标识 6ce30070a343524c321d6edddfa7aadc.png

  2. 仿照example/device.js,编写设备js脚本

实质上是编写一些回调函数。 9e27822142f88017ada2a777195c4f67.png

TemperatureSensor.js:启动后订阅bwbiot/Instance20181211123456/Sensors主题,并发送JSON字符串报告当前温度。

js
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:连接后订阅主题并等待,接收到消息后立刻回复消息,表明自己启动了。

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."
         }));
});
  1. 启动程序

开两个cmd窗口,用命令node examples\BWBAirConditioner.js先启动BWBAirConditioner.js,然后启动TemperatureSensor.js: 0de6044a45aae47b287d17198c7eb32a.pnge434edf55874689fe1716cf8939423eb.png 当然信息还有很多,因为我们没有停止回调函数,也没有设置条件去发包。

很明显,两个设备连上了IoT云平台,并通过这个主题来进行了通信。

  1. 查看主面板监控数据

开始有了一些数据(其中一些是我之前实验的数据) 2f21b6899534fa3bb7659bbaa989f266.png

  1. 查看S3存储桶

发现有了一个key为20181211225100的文件: ab7ee9cddfb65331111a555b9174028e.png 下载下来(在线预览似乎要计费……),其数据是:

json
{"Temperature":11}

也就是通过SQL将tprt字段和值写为了Temperature到S3桶里面去。

总结

整个实验过程体会到了IoT的核心思路,设备数据相互发送,然后云平台通过规则引擎将数据转发给指定的程序去处理更复杂的事情。

相关资料

转载请注明出处https://bananaoven.com/articles/230.html | 香蕉微波炉
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。