部署一个端到端的IoT应用

2019 年 9 月 26 日

部署一个端到端的IoT应用

实验概述:


本实验的目的是将终端设备安全的连接到 AWS IoT Core 平台上,还展示了用户如何在设备和 IoT Core 之间使用 MQTT 协议发布/订阅消息。本次实验绝大部分使用命令行,当然你也可以使用控制台界面完成。本实验还会利用规则引擎构建 IoT 应用程序,将消息收集、处理和分析并针对数据执行操作,且无需管理任何基础设施。


最终架构如下:


当 Sensor 发出消息,通过规则引擎(rule engine)过滤数据并触发 Amazon Simple Notification Service 以邮件的方式提醒用户温度和湿度异常。同时通过另外一条规则引擎存储过滤后的数据并通过 Kibana 进行展现。



前提条件:


使用具有 admin 权限的用户登陆 AWS 控制台。


启动一台 Amazon Linux EC2 实例作为模拟的 IoT 设备。在 EC2 实例上使用 AWS Configure 命令配置好默认 Region 为 cn-north-1。在 AWS Console 上赋予这台 EC2 实例一个具有足够权限的 Role,测试中可以直接用 admin 权限。


实验涵盖:


  • 创建一个Thing

  • 创建证书和策略

  • 部署AWS Device SDK

  • 部署和执行应用程序

  • 创建规则引擎Rule Engine

  • 创建Simple Notification Service(SNS)

  • 添加SNS推送通知

  • 创建Elasticsearch Service

  • 设计Kibana报表


实验说明:


  • 涉及AWS组件:

  • AWS IoT Core

  • AWS EC2

  • AWS S3

  • Amazon Simple Notification Service

  • Amazon Elasticsearch Service

  • 实验流程

  • 环境准备

  • 在 AWS 上创建 IoT Thing

  • 运行 IoT 设备端程序

  • 验证消息订阅发布是否成功

  • 创建并配置Amazon Simple Notification Service

  • 创建并配置Amazon Elasticsearch Service

  • 报表Kibana设计


环境准备:


1.登陆 EC2 实例,下载应用程序和 aws-device-SDK 包。


$ aws configure #输入你的AK,SK Default region:cn-north-1$ wget https://lqtestota02.s3.cn-north-1.amazonaws.com.cn/sensor-emulator.zip
$ unzip -o -d /home/ec2-user sensor-emulator.zip
复制代码


2.安装 node.js


$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash$ . ~/.nvm/nvm.sh$ nvm install node
复制代码


在 AWS 上创建 IOT thing:


1.创建 IoT thing:


$ aws iot create-thing --thing-name aws-iot-demo#记录下输出中的 thingArn,后面会用到。{    "thingArn": "arn:aws-cn:iot:cn-north-1:408221054609:thing/aws-iot-demo ",     "thingName": " aws-iot-demo",     "thingId": "35e3e6ab-da11-489f-8375-196427cb61f4"} 
复制代码


2.下载 AWS IoT 根证书,创建 IoT 设备证书和密钥,记录下生成的 certificateArn:


$ pwd/home/ec2-user/$ cd utils$ rm root-CA.crt$ wget https://www.amazontrust.com/repository/AmazonRootCA1.pem$ mv AmazonRootCA1.pem root-CA.crt$ aws iot create-keys-and-certificate \    --certificate-pem-outfile "certificate.pem.crt" \    --public-key-outfile "public.pem.key" \    --private-key-outfile "private.pem.key"#从上一步的命令输出中记录下自己的证书Arn, 后面的命令中会用到#example: "certificateArn": "arn:aws-cn:iot:cn-north-1:408221054609:cert/661bdfb4f083bf58607ac1a54904162e0f91f542e9969b58ee10136ded565925"
复制代码


3.创建一个 IoT Policy,挂载给证书并激活证书:


$ cd .. $ pwd/home/ec2-user/# 编写一个 policy 文档,复制以下JSON格式的策略并保存为 iot-policy.json 文件$ vi iot-policy.json  {  "Version": "2012-10-17",  "Statement": [    {      "Effect": "Allow",      "Action": [        "iot:Publish",        "iot:Subscribe",        "iot:Connect",        "iot:Receive"      ],      "Resource": [        "*"      ]    }  ]}# 创建 iot policy$ aws iot create-policy --policy-name IoTdemo-policy --policy-document file://iot-policy.json# 挂载 policy 到之前创建的 IoT 设备证书上,注意这里的 --target 替换成自己的证书Arn$ aws iot attach-policy \    --policy-name IoTdemo-policy \    --target "arn:aws-cn:iot:cn-north-1:408221054609:cert/661bdfb4f083bf58607ac1a54904162e0f91f542e9969b58ee10136ded565925"   # 激活证书,注意 --certificate-id 替换成自己证书的id$ aws iot update-certificate --certificate-id 661bdfb4f083bf58607ac1a54904162e0f91f542e9969b58ee10136ded565925 --new-status ACTIVE# Attach thing 到证书,其中 --principal 是自己证书的 Arn$ aws iot attach-thing-principal --thing-name aws-iot-demo --principal arn:aws-cn:iot:cn-north-1:408221054609:cert/661bdfb4f083bf58607ac1a54904162e0f91f542e9969b58ee10136ded565925
复制代码


4.配置并执行 Emulator 的 js 程序:


# 查看自己的 AWS IoT Endpoint$ aws iot describe-endpoint --endpoint-type iot:Data-ATS{    "endpointAddress": "a1hk0pcc0rk07l.ats.iot.cn-north-1.amazonaws.com.cn"}# 更新自己的iot-properties.file的证书路径和其他信息$ cd utilsnano iot-properties.file
host = a25d8uxf2d5pq.ats.iot.cn-north-1.amazonaws.com.cnport = 8883clientId = aws-iot-demothingName = aws-iot-democaPath = ./utils/root-CA.crtcertPath = ./utils/certificate.pem.crtkeyPath = ./utils/private.pem.keyregion = cn-north-1# 保存退出Ctrl+XYEnter# 执行Emulator Node.js 应用程序$ cd /home/ec2-user $ node temp-sensor.js# 执行后的输出类似于:
复制代码



5.订阅一个主题 Topic


转到 AWS 的 IoT 管理控制台,选择测试,订阅主题为:temp_readings




Code Review:


可以通过修改参数和变量来控制发送数据的维度和间隔时间:默认是 每间隔 3 秒(3000)发送 4 个维度的 3 条数据。


var awsIot = require('aws-iot-device-sdk');var Faker = require('Faker');var PropertiesReader = require('properties-reader');
var properties = PropertiesReader('./utils/iot-properties.file');
const device = awsIot.device({ "host": properties.get('host'), "port": properties.get('port'), "clientId": properties.get('clientId'), "thingName": properties.get('thingName'), "caPath": properties.get('caPath'), "certPath": properties.get('certPath'), "keyPath": properties.get('keyPath'), "region": properties.get('region')
});
device.on('connect', function() {
console.log('\n===========Emulating Sensor Data=================\n');
setInterval(function () {
for (i=2; i>=0; i--) { //Generate Random Sensor Data var temperature = Math.floor((Math.random() * 110) + 1); var deviceId = Math.floor((Math.random() * 5000) + 1); var IP = Faker.Internet.ip(); var humidity = Math.floor((Math.random() * 100) + 1); console.log('deviceId= ' + deviceId + ' temperature= ' + temperature + ' humidity=' + humidity + ' IP=' + IP ); device.publish('temp_readings', JSON.stringify ( { "deviceId" : deviceId, "temperature" : temperature, "deviceIP" : IP, "humidity" : humidity } )); } }, 3000); });
复制代码


在实际生产环境中 MCU 或 SoC 多数都是以 C 语言开发为主,所以您可以使用 AWS device SDK 基于 embedded-C 去进行设备端应用开发,请参考:


https://docs.amazonaws.cn/iot/latest/developerguide/iot-embedded-c-sdk.html


现在我们成功模拟设备端通过 MQTT 安全的将消息发布到平台,下一步我们将利用 AWS IoT 的托管服务与其他数据服务集成,实现消息的展现,处理与分析。


创建并配置 Amazon Simple Notification Service


1.在 AWS 控制台中搜索 SNS 服务,创建一个名为 AWSIoTDemo 的主题,并创建一个订阅,订阅协议为 email,终结点为 email 地址。如下图:



邮件验证通过后,您会收到一个订阅的邮件,请点击订阅。这里就不再赘述。


2.在 AWS IoT 控制台的导航窗格中,选择行动 Act。



3.创建 Email 的规则,如下图:


定义规则查询语句,select * from ‘temp_readings’ where temperature > 60 and humidity < 30。


这个查询语句您也可以自定义,SELECT FROM WHERE . 例如:SELECT temperature FROM ‘iot/topic’ WHERE temperature > 50。



在设置一个或多个操作中添加 SNS 推送通知,确保该角色有足够的权限。



添加操作并创建规则



4.返回到模拟设备的 EC2,执行 js 应用程序


执行 Emulator Node.js 应用程序 node temp-sensor.js # 执行后的输出类似于:



5.验证邮件通知,你会收到满足规则所定义的温度大于 60 湿度小于 30 的邮件通知。select * from ‘temp_readings’ where temperature > 60 and humidity < 30



6.停止模拟程序的运行,不然会收到太多的邮件。


创建并配置 Amazon Elasticsearch Service


1.在 AWS 控制台搜索 elasticsearch Service 并创建配置集群。由于是测试,就选择开发和测试环境就好。



2.配置集群选择默认配置就好,取一个 Elasticsearch 域名,比如 awsiotdemo01。


3.设置访问权限,网络配置要设置为 公有访问权限。因为 Elasticsearch 规则操作不支持 VPC Elasticsearch 集群。如下图:



4.通过 AWS IoT 规则引擎添加规则,具体方法与设置 Email 规则类似,不再赘述。


这里,将温度大于 60 的消息都存储到 ElasticSearch 中。


select * from ‘temp_readings’ where temperature > 60


5.设置或多个操作中,添加操作 ElasticSearch,如下:



6.设计和配置 Kibana 报表,在设计报表之前,先回到 AWS IoT 控制台 行动 Act 中禁用 Email 的规则(为避免收到大量邮件,另外一会儿要通过 Kibana Get topic/_search 验证数据是否成功接收到)。


7.在 EC2 的模拟器中执行 js 应用程序。


8.找到 Kibana 入口,



9.验证数据是否接收成功,在 Console 输入以下代码并执行:


GET temp_readings/_search


{


“query”: {


“match_all”: {}


}


}



![](https://static001.infoq.cn/resource/image/22/52/22f7972bddd56d2e2812b81166462a52.png)
10.设置index为topic的名字![](https://static001.infoq.cn/resource/image/59/5b/593da80fa103463347812043c280485b.png)

11.在visualize中设计报表,消息的维度一共是四个,分别为deviceId、temperature、deviceIP、humidity。根据个人喜好定义维度所在的X和Y轴即可。
![](https://static001.infoq.cn/resource/image/00/3b/00f574d5292dd4a152058d9f7dd2ae3b.png)

## 总结:您可以充分利用AWS的托管服务,将数据ETL和展现与AWS的托管服务Amazon DynamoDB、AWS Lambda、Amazon Elastic Search、Amazon SNS 和 Amazon S3 等轻松集成进来。而AWS IoT 规则由 SQL SELECT 语句、主题筛选条件和规则操作组成。设备通过将消息发布到 MQTT 主题来向 AWS IoT 发送信息。利用 SQL SELECT 语句,您可以从传入的 MQTT 消息提取数据。后面我们会有更多Hands on的Blog。比如如何通过Job进行OTA升级,如何通过设备管理来管理设备,如何集成智能语音服务Alexa,如何利用边缘计算服务GreenGrass与Machine Learning结合等等。
**作者介绍:**
李强AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广,在物联网和微软的技术栈有着广泛的设计和实践经验。在加入AWS之前,曾在东芝中国负责系统开发和运维工作,在微软中国负责中小企业的技术咨询和方案设计工作。

**本文转载自AWS技术博客。**
**原文链接:**https://amazonaws-china.com/cn/blogs/china/deploy-an-end-to-end-iot-application/
复制代码


2019 年 9 月 26 日 16:45255
用户头像

发布了 1191 篇内容, 共 25.4 次阅读, 收获喜欢 15 次。

关注

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布
暂无评论
发现更多内容

每周学点TARS——服务自定义命令

TARS基金会

c++ DevOps 后端 TARS

架构词典: 复盘

lidaobing

架构 复盘

公安警务大数据可视化平台开发建设

t13823115967

大数据 大数据平台 智慧公安

第二周作业

Geek_b9053c

依赖倒置原则

从战略到战略决策

Alan

战略管理 使命 愿景 战略思考 MVO

智慧公安大数据分析平台开发解决方案

t13823115967

大数据技术 大数据平台 智慧公安

我对业务方提出需求的态度

boshi

随笔杂谈 需求落地

ETV全球熵APP系统开发|ETV全球熵软件开发

开發I852946OIIO

系统开发 现成系统

LeetCode题解:52. N皇后 II,回溯+哈希表,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

《操作系统概述》-第六版

计算机与AI

操作系统

两年竞业禁止、没有赔偿的CTO | 法庭上的CTO(1)

赵新龙

CTO 竞业禁止 试用期

Defi系统APP开发|Defi软件开发

开發I852946OIIO

系统开发

mysql的这些坑你踩过吗?快来看看怎么优化mysql?

比伯

Java 编程 架构 面试 计算机

一周信创舆情观察(11.23~11.29)

统小信uos

HTTP协议概述

落日楼台H

https HTTP 协议 HTTP2.0 HTTP3.0

智能与影像的强耦合:华为Mate 40系列的视觉探索

脑极体

Java程序员做外包,10个月收入40万

Crud的程序员

Java 学习 程序员 外包

Kafka 和 RocketMQ 之性能对比

丁威

kafka 源码分析 RocketMQ 中间件 性能分析

价值、产业、数据加密,区块链如何助力互联网升级?

CECBC区块链专委会

区块链 互联网

线程池的优点及其原理,代码实现线程池。简单、明了。

Linux服务器开发

网络编程 线程池 后端开发 Linux服务器 web服务器

区块链产业下的“非遗”突围战:商业化和手艺人发掘

CECBC区块链专委会

区块链 非遗

训练营第七周总结

大脸猫

极客大学架构师训练营

腾讯 WXG 后台开发工程师对 MySQL 索引知识点总结

Java架构师迁哥

看区块链如何打通信息壁垒,盘活万亿级”积分”市场

CECBC区块链专委会

区块链 信息

拆解增长黑客之知识篇

丁一

产品 运营 增长

区块链中的保险行业

13828808769

区块链技术应用开发 保险理赔

可参考才是有价值的,架构设计的技改之路从来都不容易

互联网应用架构

架构设计

第一周作业

极客大学 极客大学架构师训练营

【得物技术】搜索引擎技术简介

得物技术

搜索引擎 技术 算法 排序 搜索

只能用分布式锁,也能搞定每秒上千订单的高并发优化?

Java架构师迁哥

京东云的云原生理念及Serverless最佳实践

lidaobing

部署一个端到端的IoT应用-InfoQ