已经有这样一则新闻,一女子智能养鱼遇断网,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_user2$sudo addgroup --system ggc_group
为树莓派设置hardlink和softlink爱护,在 /etc/sysctl.d/98-rpi.conf中减少以下两行:
1fs.protected_hardlinks = 12fs.protected_symlinks = 1
编辑 /boot/cmdline.txt,在行开端,减少如下参数,激活memory cgroups:
1cgroup_enable=memory cgroup_memory=1
配置实现后,重启树莓派。
运行Greengrass dependency checker,确保树莓派环境满足所有依赖条件:
1$cd /home/pi/Downloads2$wget https://github.com/aws-samples/aws-greengrass-samples/raw/master/greengrass-dependency-checker-GGCv1.10.x.zip3$unzip greengrass-dependency-checker-GGCv1.10.x.zip4$cd greengrass-dependency-checker-GGCv1.10.x5$sudo modprobe configs6$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/pi2$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 grovepi2from grove_rgb_lcd import *
读取传感器数据的代码如下:
1# Get value from temperature sensor2temp_value = grovepi.temp(temp_sensor,"1.2")34# Get value from moisture sensor5mois_value = grovepi.analogRead(mois_sensor)67# Get value from light sensor8light_value = grovepi.analogRead(light_sensor)910# Get status from relay11switch_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 color2 "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;89def calcBG(humidity):10 "This calculates the color value for the background"11 variance = humidity - justRight; # Calculate the variance12 adj = calcColorAdj(variance); # Scale it to 8 bit int13 bgList = [0,0,0] # initialize the color array14 if(variance < 0):15 bgR = 0; # too dry, no red16 bgB = adj; # green and blue slide equally with adj17 bgG = 255 - adj;1819 elif(variance == 0): # perfect, all on green20 bgR = 0;21 bgB = 0;22 bgG = 255;2324 elif(variance > 0): #too wet - no blue25 bgB = 0;26 bgR = adj; # Red and Green slide equally with Adj27 bgG = 255 - adj;2829 bgList = [bgR,bgG,bgB] #build list of color values to return30 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"1617 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.py2$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-sensor2{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年以上的数据中心基础架构设计,企业级利用零碎设计开发等教训。