共计 11699 个字符,预计需要花费 30 分钟才能阅读完成。
已经有这样一则新闻,一女子智能养鱼遇断网,4 万余斤鱼或因缺氧死亡。这个塘主通过手机 App 监控鱼塘状况并利用智能插座管制增氧机进行增氧;但因遇到网络故障,无奈及时为鱼塘启动增氧设施而造成重大经济损失。这是个典型的物联网案例,利用物联网平台近程监控数据,并基于数据进行设施管制。在大多数状况下,它可能很好地工作,但当网络连接失落时,智能将变得无能为力。生存中相似的场景很多,咱们有没有方法既享受物联网带来的便捷和智能,又可能解脱网络依赖带来的局限性呢?
本文将介绍如何利用 Amazon IoT Greengrass 的 边缘计算能力 ,实现近程监控的同时,在边缘侧进行智能管制。为了便于大家有一个直观、清晰的了解,全文以DIY 主动浇花为主线 开展介绍。
概述
Amazon IoT Greengrass 是 Amazon IoT 服务系列中的一 员,它可将 亚马逊云科技无缝扩大至边缘设施,因而能够在本地操作其生成的数据,同时仍可将云用于治理、剖析和长久存储。借助 Amazon IoT Greengrass,您能够构建 IoT 解决方案,从而将不同类型的设施和云连接起来,并实现设施互连。运行 Linux 的设施和反对 Arm 或 x86 架构的设施能够托管 Amazon IoT Greengrass Core。Amazon IoT Greengrass 可在本地执行 Amazon Lambda 代码、音讯收发、数据管理和安全策略,甚至在没有连贯 Internet 的状况下,也可实现这些性能。运行 Amazon IoT Greengrass Core 的设施充当枢纽,与其余运行 Amazon FreeRTOS 或已装置 Amazon IoT Device SDK 的设施进行通信。这些设施的尺寸可能不同,从较小的基于微控制器的设施到大型设施。如果 Amazon IoT Greengrass Core 设施与云之间的连贯断开,Amazon IoT Greengrass 组中的设施还可通过本地网络持续互相通信。
📢 想学习 Amazon IoT Greengrass 的更多玩法?来 2021 亚马逊云科技中国峰会 与业内当先的技术践行者们一起探讨交换吧!点击图片报名吧~
Amazon IoT Greengrass 具备以下劣势:
- 近乎实时地响应本地事件。本地资源拜访性能让部署在 Amazon IoT Greengrass Core 设施上的 Amazon Lambda 函数应用本地设施资源,这样设施应用程序就可能快速访问和解决本地数据。
- 本地运行。Amazon IoT Greengrass 设施能够在本地设施无奈连贯到云的状况下收集、解决和导出数据流。在设施从新连贯到云后,Amazon IoT Greengrass 可将设施上的数据与 Amazon 云服务同步。
- 平安通信。Amazon IoT Greengrass 可对本地和云通信的设施进行身份验证和加密,包含采纳硬件爱护的端到端加密。
- 简化设施编程。您能够在云中开发代码,而后应用 Amazon Lambda、Docker 容器,无缝地将其部署到您的设施上。
- 升高运行 IoT 应用程序的老本。通过对设施进行编程以在本地过滤或汇总数据,并只将应用程序所需的数据传输到云,从而以较低的老本取得丰盛的见解。
- 多平台反对。您能够在反对最低硬件和软件要求的任何硬件设施上运行 Amazon IoT Greengrass 软件。
主动浇花思路
- 通过树莓派和 Amazon IoT Core 建设连贯
- 利用光传感器、温度传感器和土壤湿度传感器检测环境亮度、温度及花盆中湿度,通过树莓派汇总后上传
- 利用 LCD 屏在本地显示传感器数据信息,并以不同色彩醒目提醒土壤湿度情况
- 利用继电器管制小水泵进行浇水
- 在树莓派上运行自动控制逻辑,依据亮度、温度和湿度确定继电器状态
- 通过 topic 来设置湿度阈值,这样能够很不便地实现通过手机 App 或 Web 利用进行参数设置
- 将传感器数据和继电器状态通过 Amazon IoT 的规定引擎发送到 Amazon Elasticsearch,建设监控仪表板,这样能够很不便地通过手机或浏览器进行可视化监控
计划架构如下图所示:
资料筹备
- 树莓派 Raspberry Pi 3B/3B+ 一个,MicroSD 卡一张
- GrovePi+ 树莓派扩大板一个
- 三个 Grove 传感器配件:温度传感器,土壤湿度传感器,亮度传感器
- Grove 1602 LCD RGB 背光显示屏一个
- 一个继电器配件(Grove Ralay)
- 微型水泵一个(3V/5V/6V),水泵水管一条
设施连贯
首先将 GrovePi+ 装置在 Raspberry Pi 上。重叠 GrovePi+ 时,留神引脚对齐,如下图所示。
- 依照以下对应端口连贯设施配件:
- 温度传感器:A0
- 土壤湿度传感器:A1
- 亮度传感器:A2
- 继电器:D6
- LCD 显示屏:I2C-2
- 水泵的地线与水泵电源线(可应用 USB 电源线)的地线别离接入继电器的端子
装置和配置树莓派设施
树莓派运行零碎倡议应用 原生 Raspbian,目前最新版本为 buster。请从 Raspberry Pi 官方网站下载并应用 Etcher 工具制作启动镜像。
为不便后续应用和调试,倡议启用 SSH:
1$sudo systemctl enable ssh
一键装置全副驱动:
1$sudo curl -kL dexterindustries.com/update_grovepi | bash
装置 Amazon IoT SDK:
1$ pip3 install AWSIoTPythonSDK
记得装置好所有依赖后 reboot 一下,以刷新零碎驱动。
Amazon IoT Greengrass 环境配置
首先设置 Amazon IoT Greengrass 运行环境,减少以下用户和组:
1$sudo adduser --system ggc_user
2$sudo addgroup --system ggc_group
为树莓派设置 hardlink 和 softlink 爱护,在 /etc/sysctl.d/98-rpi.conf 中减少以下两行:
1fs.protected_hardlinks = 1
2fs.protected_symlinks = 1
编辑 /boot/cmdline.txt,在行开端,减少如下参数,激活 memory cgroups:
1cgroup_enable=memory cgroup_memory=1
配置实现后,重启树莓派。
运行 Greengrass dependency checker,确保树莓派环境满足所有依赖条件:
1$cd /home/pi/Downloads
2$wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.10.x.zip
3$unzip greengrass-dependency-checker-GGCv1.10.x.zip
4$cd greengrass-dependency-checker-GGCv1.10.x
5$sudo modprobe configs
6$sudo ./check_ggc_dependencies
装置 Amazon IoT Greengrass 外围软件
首先在 Amazon IoT 控制台配置Amazon IoT Greengrass。在 Greengrass 界面,创立组 waterflower,具体步骤可参见链接。
- 链接:
https://docs.aws.amazon.com/z…
创立过程中,会下载平安资源 tar.gz 文件,并下载 Amazon IoT Greengrass 外围软件安装包(实用于 Raspbian 的 Armv7l 软件包)。
将下载的文件利用 scp 上传到树莓派设施上:
1$scp greengrass-linux-armv7l-1.10.0.tar.gz pi@raspberry-IP-address:/home/pi
2$scp <hash>-setup.tar.gz pi@raspberry-IP-address:/home/pi
登录到树莓派设施,进入到对应下载文件的目录并解压这两个到相应门路下:
1$sudo tar -xzvf greengrass-linux-armv7l-1.10.0.tar.gz -C /
2$sudo tar -xzvf <hash>-setup.tar.gz -C /greengrass
下载 Amazon IoT 服务器根证书:
1$cd /greengrass/certs/
2$sudo wget -O root.ca.pem https://www.amazontrust.com/repository/AmazonRootCA1.pem
启动 Amazon IoT Greengrass:
1$cd /greengrass/ggc/core/
2$sudo ./greengrassd start
确定传感器和 Amazon IoT Greengrass 的交互模式
传感器作为本地设施,和 Amazon IoT Greengrass 之间能够采纳两种交互模式:一种是规范的 IoT 模式,即每个传感器作为独立的设施,有本人的 X.509 证书,通过 MQTT 协定与 Amazon IoT Greengrass Core 进行通信,Amazon IoT Greengrass Core 则通过 MQTT 协定对继电器设施收回管制命令。如果须要,Amazon IoT Greengrass Core 也负责对收集的各个传感器音讯进行汇总并上传给 Amazon IoT Core。另一种是简化模式,即每个传感器作为树莓派本地设施,Amazon IoT Greengrass 上的 Amazon Lambda 函数利用本地资源拜访性能通过 GrovePi SDK 对传感器和继电器设施进行读取和写入操作。
第一种模式的扩展性好,反对容器化部署,每个传感器作为 IoT 设施退出到 Amazon IoT Greengrass 组中,但每个设施都须要编写相应的代码。这种模式的参考范例也比拟容易找到。第二种模式编程简略,两个 Lambda 函数就能够搞定。在本文中将介绍如何用第二种模式实现。
编写和打包 Amazon Lambda 函数
首先编写读取和报告传感器状态的 Lambda 函数,这里命名为 wfSensorLambda.py。
为了利用 GrovePi SDK 来读取传感器数据,并在本地 LCD 屏上设置文本和色彩,须要引入两个包:
1import grovepi
2from grove_rgb_lcd import *
读取传感器数据的代码如下:
1# Get value from temperature sensor
2temp_value = grovepi.temp(temp_sensor,"1.2")
3
4# Get value from moisture sensor
5mois_value = grovepi.analogRead(mois_sensor)
6
7# Get value from light sensor
8light_value = grovepi.analogRead(light_sensor)
9
10# Get status from relay
11switch_status = grovepi.digitalRead(relay)
在 LCD 屏上设置色彩和文本的代码如下:
1setRGB(R, G, B)
2setText("Temp: %.1f C *%s\nMoisture: %d" %(temp_value,moment,mois_value))
因为 LCD 屏的 RGB 背光色有 255 个值,为了通过 LCD 屏的色彩能高深莫测地理解以后土壤湿度状况,咱们须要将土壤湿度值依照色彩梯度映射到这 255 个值而后进行显示,从而实现土壤湿度值的色彩显示。这里实现了两个函数来计算最终的 RGB 值,代码如下:
1def calcColorAdj(variance): # Calc the adjustment value of the background color
2 "Because there is 200 mapping to 255 values, 1.275 is the factor for 400 spread"
3 factor = 1.275;
4 adj = abs(int(factor * variance));
5 if adj > 255:
6 adj = 255;
7 return adj;
8
9def calcBG(humidity):
10 "This calculates the color value for the background"
11 variance = humidity - justRight; # Calculate the variance
12 adj = calcColorAdj(variance); # Scale it to 8 bit int
13 bgList = [0,0,0] # initialize the color array
14 if(variance < 0):
15 bgR = 0; # too dry, no red
16 bgB = adj; # green and blue slide equally with adj
17 bgG = 255 - adj;
18
19 elif(variance == 0): # perfect, all on green
20 bgR = 0;
21 bgB = 0;
22 bgG = 255;
23
24 elif(variance > 0): #too wet - no blue
25 bgB = 0;
26 bgR = adj; # Red and Green slide equally with Adj
27 bgG = 255 - adj;
28
29 bgList = [bgR,bgG,bgB] #build list of color values to return
30 return bgList;
报告传感器状态则比较简单,间接调用 greengrass SDK 的 publish 函数即可。
因为须要周期性地采集传感器的数据,因而,这个 Lambda 函数须要长时间运行,这里咱们利用 threading 的 Timer 实现每 5 秒采集一次传感器数据:
1Timer(5, greengrass_sensor_run).start()
wfSensorLambda.py 的残缺源代码能够从这里获取。
为了实现对继电器和水泵的管制,咱们还须要编写一个实现设施管制的 Amazon Lambda 函数,这里命名为 wfSwitchLambda.py。它有两个作用:一是依据传感器数据和设定阈值,执行相应的决策逻辑,管制继电器状态以启动或敞开水泵;二是接管来自 Amazon IoT 的阈值设置音讯,更新阈值。
为了防止浇水过快而传感器不能及时感知的问题,在管制逻辑中针对不同环境条件采取了反转模式或步进模式来启停水泵。次要代码如下:
1temp_value = float(event['temp'])
2 mois_value = int(event['moisture'])
3 light_value = int(event['light'])
4 status = int(event['switch'])
5 if mois_value < threshold:
6 if ((light_value > light_threshold) and (temp_value > temp_threshold)): ## 反转模式
7 if status:
8 state = "off"
9 else:
10 state = "on"
11 else: ## 步进模式
12 state = "on-1"
13 else:
14 if status:
15 state = "off"
16
17 grovepi.pinMode(relay,"OUTPUT")
18 if state == "on": # 反转模式
19 try:
20 grovepi.digitalWrite(relay,1)
21 logger.info("Triggering relay turned ON!")
22 except Exception as e:
23 logger.error("Failed to switch ON relay:" + repr(e))
24 elif state == "on-1": # 步进模式
25 try:
26 grovepi.digitalWrite(relay,1)
27 logger.info("Triggering relay turned ON - one time!")
28 time.sleep(1)
29 grovepi.digitalWrite(relay,0)
30 except Exception as e:
31 logger.error("Failed to switch ON relay[one time]:" + repr(e))
32 elif state == "off":
33 try:
34 grovepi.digitalWrite(relay,0)
35 logger.info("Triggering relay turned OFF!")
36 except Exception as e:
37 logger.error("Failed to switch OFF relay:" + repr(e))
38 else:
39 logger.info("No need to change!")
在编写好 Lambda 函数后,须要将其打包成 zip 文件。打包时,须要留神将 greengrasssdk 目录一起打包到 zip 文件中,greengrasssdk 目录能够从 Amazon Greengrass Core SDK for Python 中获取。打包命令如下:
1$zip -r wf_sensor_lambda.zip greengrasssdk wfSensorLambda.py
2$zip -r wf_switch_lambda.zip greengrasssdk wfSwitchLambda.py
而后,关上 Amazon Lambda 控制台,别离创立这两个函数 wfSensor 和 wfSwitch:
- Runtime 请抉择 Python 3.7
- 对于代码输出品种,请抉择上传 zip 文件
- 对于 Handler(处理程序),别离输出 wfSensorLambda.function_handler 和 wfSwitchLambda.switch_handler
- 别离上传 wf_sensor_lambda.zip 和 wf_switch_lambda.zip
- 公布函数后,倡议为函数创立别名
为 Amazon IoT Greengrass 配置和部署 Lambda 函数
抉择之前创立的 Greengrass 组,在配置页面上,抉择 Lambdas,而后点击两次 Add Lamba,别离将 wfSensor 和 wfSwitch 退出,增加时留神以下要点:
- 抉择 Use existing Lambda
- 在抉择版本时,不要抉择具体版本号,而是抉择 Alias:xxx
- 在退出的函数右上角点击省略号(…),抉择 Edit Configuration(编辑配置)
- 对于“Run as”,请抉择 Another user ID/group ID,在下方输出两个 0,对于“containerization”,抉择 No container(always)。这个批改只是针对第二种交互模式,对于第一种交互模式,无需批改。
- Timeout 超时值改为 10 秒
- 对于 Lamba 生命周期,wfSensor 须要改为 long-lived;wfSwitchLambda 不必批改。
配置如下订阅:
针对本文的第二种交互模式,须要在树莓派上批改 Amazon IoT Greengrass 的参数。关上 /greengrass/config/config.json,在“runtime”局部,减少:
1"allowFunctionsToRunAsRoot" : "yes"
在 Amazon IoT 管制台上,在相应 greengrass 组中,点击 Deploy 部署,将云配置部署到树莓派设施。第一次部署可能须要几分钟。当部署实现后,您应该在部署页面上的状态列中看到已胜利实现。
您能够验证 Lambda 函数是否在设施上运行,具体步骤参见下方链接。
- 链接
https://docs.aws.amazon.com/z… check.html。
创立和配置 Amazon Elasticsearch
在 Amazon Elasticsearch 管制台上,创立一个新域,名称为 waterflower,网络配置抉择“Public access”,并输出以下 Access policy(拜访策略):
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Effect": "Allow",
6 "Principal": {
7 "AWS": "*"
8 },
9 "Action": "es:*",
10 "Resource": "arn:aws-cn:es:<region>:<your-Account-ID>:domain/waterflower/*",
11 "Condition": {
12 "IpAddress": {
13 "aws:SourceIp": [
14 "x.x.x.x/32"
15 ]
16 }
17 }
18 }
19 ]
20}
下面“x.x.x.x”请输入您的电脑对应的公网 IP 地址,您能够输出 https://checkip.amazonaws.com 取得。
拜访 Kibana 界面,创立 index,命名为 wf-sensor:
1PUT /wf-sensor
2{
3 "mappings": {
4 "properties": {5 "timestamp": { "type": "long", "copy_to": "datetime"},
6 "datetime": {"type": "date", "store": true},
7 "clientId": {"type": "text"},
8 "temp": {"type": "float"},
9 "moisture": {"type": "integer"},
10 "light": {"type": "integer"},
11 "switch": {"type": "integer"},
12 "state": {"type": "integer"}
13 }
14 }
15}
创立 index pattern:
- 名称:wf-sensor*
- 工夫过滤器字段名称:datetime
配置 IoT 规定引擎
在 Amazon IoT 控制台中,点击 Act->Rules,创立规定:
- 规定查问条件:SELECT * FROM‘waterflower/sensor/telemetry’
- 增加 Action,抉择 Send a message to the Amazon Elasticsearch Service
- 抉择 Domain(域)waterflower
- ID: ${newuuid()}
- Index: wf-sensor
- Type: _doc
创立可视化报表
在 Kibana 界面,点击右边菜单栏的 Discover(发现),您当初能够看到上传的设施状态数据,它们按工夫程序显示在屏幕上。
点击右边菜单栏的 Visualize,您当初能够创立可视化图表,并能够增加到仪表板中,以近程监控和查看传感器状态和继电器 / 水泵工作状况。如下图示例:
测试和验证
您能够通过以下几个办法验证主动浇花成果:
- 利用 Amazon IoT 控制台的 test 性能公布音讯到 waterflower/setting,批改湿度阈值,测试水泵工作状况
- 通过 Amazon Elasticsearch 的 Kibana 界面,查看传感器数据变动状况和水泵工作状况
- 敞开树莓派的互联网连贯,验证连贯失落的条件下,主动浇花是否失常工作
资源清理
在您胜利搭建了本文介绍的主动浇花零碎后,依据您的应用需要,能够依照如下两种状况对创立的资源进行清理,免得产生不必要的费用。
如果您想持续应用主动浇花性能,但不再须要进行近程监控,请按以下步骤删除资源:
- 关上 Amazon IoT 控制台,顺次抉择 Act -> Rules,点击之前创立的规定 waterflower 的右上角省略号(…),点击删除并确认
- 关上 Amazon Elasticsearch 控制台,能够看到之前创立的域 waterflower,点击进入。而后,点击最下面一排的“Delete domain(删除域)”按钮,在弹出窗口中,选中 checkbox 框,而后点击删除
如果您不再应用整个主动浇花零碎,请先按下面步骤删除近程监控相干的资源,而后按以下步骤持续清理所有资源:
- SSH 到树莓派,输出以下命令进行 greengrass 过程:
1$sudo /greengrass/ggc/core/greengrassd stop
- 关上 Amazon IoT 控制台,点击右边菜单栏中的 Greengrass -> Groups,点击之前创立的组 waterflower,进入组治理界面,点击右上角的 Actions -> Reset Deployments,在弹出窗口中,选中 checkbox 框,点击 Reset deployment
- 接着点击右上角的 Actions -> Delete Group,在弹出窗口中,点击“Yes, Continue to delete”按钮,确认删除
- 持续在 Amazon IoT 控制台,点击右边的 Manage -> Things,点击 waterflower_Core 的右上角省略号(…),点击删除并确认
小结
依据下面的计划实现,您可能会发现在树莓派零碎上运行 Amazon IoT Greengrass 能够构建更多的 IoT 解决方案。从根本的遥测到执行机器学习推理,咱们的客户正在构建 多种多样的 Amazon IoT Greengrass 解决方案,以便不断创新并扩大解决方案的价值。
在本文中,您学习了如何利用 Amazon IoT Greengrass DIY 一个主动浇花零碎。当初,您能够扩大这个计划,减少手机 App 实现对浇花参数管制和近程监控主动浇花工作情况,并利用 Amazon IoT Greengrass 不断改进您的边缘性能。
本篇作者
张红杰
亚马逊云科技解决方案架构师
负责基于亚马逊云科技的云计算计划架构征询和设计,同时致力于亚马逊云科技物联网服务和无服务器架构在国内和寰球商业客户的利用和推广,推动企业服务迁徙上云过程。有 10 年以上的数据中心基础架构设计,企业级利用零碎设计开发等教训。