DIY 火星探测器:AWS Greengrass IoT v2 与 Raspberry Pi(第二部分)。






4.78/5 (5投票s)
在本系列的两部分中,您将学习如何使用 AWS Greengrass v2 将 Raspberry Pi 变成一个灵活且强大的物联网设备,最终创建一个离网的、可远程执行任务的数据和图像采集设备。
- 下载源码 - 78 Kb
- GitHub 项目
- ACG 项目:DIY 火星探测器 (需要免费账户)
欢迎回来!
在本系列的第一部分中,我们使用 EC2 实例作为 Raspberry Pi 的替代品,学习了如何配置物联网设备以及如何部署自定义配置和自定义组件。在这一部分,我们将专注于创建一个更复杂的组件,并使用真实的 Raspberry Pi 设备。没有 Pi?没问题。您仍然可以继续使用 EC2 实例进行学习,但需要忽略或跳过与 Pi 特有的部分,例如 JVM 安装、Pi Camera 和设备配置。
如果您想观看此教程的配套视频版本,请前往 A Cloud Guru 的ACG Projects 登陆页面。在那里,您会找到本教程以及其他旨在帮助您同时创建和学习的实践教程。观看视频需要一个免费账户,但有了这个免费账户,您还可以每月获得精选的免费课程和其他不错的福利……免费!
完全可信的场景
让我们回顾一下我们的场景……
我有一个好消息和一个坏消息。好消息是,我们这个简陋的太空初创公司刚刚赢得了一份非常有利可图的合同,要建造和维护火星上的一系列传感器!坏消息是,我们计划的预算几乎全部将用于将设备实际发射并着陆到这颗红色星球。我们的任务是以低成本构建一个设备管理和数据收集系统。要求如下:
- 应要求,设备需要捕获一张图片,收集环境读数,并将结果存储在云端
- 由于与火星的数据连接非常不稳定,解决方案需要能够适应间歇性连接
- 必须自供电
好吧,好吧……在各位太空爱好者开始挑剔这个前提之前,我要请您暂时放下怀疑。是的,我确定太空辐射会摧毁我们现成的组件,而且虽然我会使用蜂窝调制解调器进行通信,但我很确定火星上还没有 5G 数据网络。实际上,我们不是一个简陋的太空初创公司,对吧?但还记得我们小时候玩过假装游戏吗?在我们的想象中,什么都有可能发生。让我们暂时回到那个地方。
架构(回顾)
回顾第一部分,我们将使用 AWS Greengrass 作为我们的控制平面和数据平面。我们将为 Raspberry Pi(或我们的假 Pi EC2 实例)配备所需的组件,将其变成 Greengrass 所称的核心设备。核心设备本身可以充当数据收集点,也可以充当其他设备的本地代理……有点像一个数据收集点或回传到 Greengrass 的网关。
为了与我们的核心设备通信,我们将使用 MQTT。MQTT 是一种轻量级的消息传递协议,广泛用于物联网应用。如果您熟悉其他消息队列设计模式,对 MQTT 会感到很熟悉。它的队列称为主题,设备可以订阅和发布到主题以发送和接收消息。这就是我们将指令发送到传感器并获得响应的方式。我们还将让设备将捕获的图像上传到 S3 存储桶。
真实的 Pi
好的,继续讲 Pi Zero。最终,我将把这个 Pi Zero 与一些额外的组件组装起来,例如带电池和太阳能板的电源控制器以及 LTE 蜂窝调制解调器。目前,我们先让它通过无线网络工作。
准备就绪
我在这里不介绍如何设置 Raspberry Pi Zero W 进行登录,因为有很多指南可供参考。Adafruit 的工作人员提供了一个优秀指南。请记住使用 Raspberry Pi OS 的 Lite 版本,如果您要无头运行设备(即不使用键盘和显示器),请不要忘记配置一个 wpa_supplicant.conf
文件,并创建一个 ssh
文件,然后将它们都放入启动分区,再尝试启动。
登录后,我会进行更新并安装一些我需要的依赖项。请注意,这次我跳过了 JDK……一会儿您就会明白为什么。
$ sudo apt update && sudo apt upgrade -y $ sudo apt install unzip python3-pip cmake -y $ sudo reboot
接下来,我将启用 PiCamera 和串口,并在此同时扩展文件系统。
$ sudo raspi-config - P1 Camera - Would you like the camera interface to be enabled? Yes - P6 Serial - Would you like login shell? No - Would you like serial port? Yes - Expand file system
让我们也实施一些电源和处理器节能措施。将 /usr/bin/tvservice -o
添加到 /etc/rc.local 文件中,这样我们就可以关闭 HDMI 接口以节省电力。如果您想使用显示器,请不要这样做。我还会通过编辑 /boot/config.txt 并将行 dtparm=audio=on
更改为 dtparm=audio=off
来禁用音频。有些人可能想尝试将 GPU 内存从 128 MB 减少到更少,但我发现当我减少 GPU 内存时,Pi Camera 模块开始出现问题,所以我将保持在 128MB。
现在,这是使用 Pi Zero 与 Pi 3 或 Pi 4 的一个关键区别。Pi Zero 使用 ARM6 架构,Raspberry Pi OS 存储库中的 OpenJDK 11 在 ARM6 架构上无法正常工作。所以,我们必须从其他地方寻找。我从Azul找到了一个专门的 Zulu ARM6 JDK11。以下是安装该版本的命令……
$ sudo apt remove openjdk-11-jdk #if you happen to have tried to install $ cd /usr/lib/jvm $ sudo wget https://cdn.azul.com/zulu-embedded/bin/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf.tar.gz $ sudo tar -xzvf zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf.tar.gz $ sudo rm zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf.tar.gz $ sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/java 1 $ sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/zulu11.41.75-ca-jdk11.0.8-linux_aarch32hf/bin/javac 1
Greengrass 时间
与我们的 FakePi 一样,在尝试配置设备之前,我们需要将引导 AWS 凭证设置为环境变量。
$ export AWS_ACCESS_KEY_ID = _your_access_key_from_the_GreengrassBootstrap_user $ export AWS_SECRET_ACCESS_KEY = _your_secret_from_the_GreengrassBootstrap_user
现在对于我的 Pi Zero,我创建了一个自定义组件,它将监听一个 MQTT 主题,抓拍一张照片,上传到 S3,并在另一个 MQTT 主题上返回照片的 URL。但在我的测试中,我注意到尝试同时部署新的 JVM 内存配置设置和 snapPicture 组件会给 Pi Zero 带来过大的压力,所以我将把它排除在一个组之外,并创建会稳定推出更新的部署。就像我们在第一部分中所做的那样,我们导航到 AWS IoT,然后到 Greengrass 部分。选择 Core devices,然后选择 Setup one core device。
然后我们会看到一个设置屏幕。目前我们不会将 Pi 分配给任何组,但以后如果需要,我们可以这样做。我们将设备命名为 RealPi
,并选择无组。控制台将生成两个命令行供您使用:一个用于下载和解压 Greengrass Core 元素,另一个用于安装和配置设备。
在您执行这两个复制粘贴命令后,您应该会在 Greengrass IoT 控制台上看到 RealPi
。接下来,我将单独发送 JVM 配置更新。您可以在第一部分中查看如何自定义 aws.greengrass.Nucleus
组件。在内存更新推出的过程中,当 Greengrass 完成所有操作时,让我们将 ggc_user 帐户添加到 video 组,以便它可以访问摄像头设备。我还想将此用户添加到 GPIO 组,因为我将有一个使用 GPIO 引脚的温度和湿度传感器。
$ sudo usermod -a -G video,gpio ggc_user
请确保给 Greengrass 充足的时间来完成部署,尤其是在相对较慢的 Pi Zero 上。您可以通过查看日志或使用 top
命令监视进程来跟踪进度。一切稳定后,我们可以重新启动 Pi,以确保新的 JVM 参数已应用。
$ sudo cat /greengrass/v2/config/effectiveConfig.yaml
snapPicture 组件
让我们回到 IoT 控制台,创建我们的 snapPicture
组件。方法与我们在第一部分中创建第一个组件的方法相同。我发现的一个问题是,您的工件必须位于与 Greengrass 相同区域的存储桶中,所以如果您使用不同区域,请记住这一点。
您会在我们的 snapPicture-1.0.0.json 配方中的 Manifest
部分看到,我们添加了 PiCamera Python 库以及一个用于 DHT 传感器的 Adafruit 库。当此组件首次部署到设备时,pip3
命令将下载并安装所有组件。现在,首次下载和安装所有这些组件需要一段时间,我注意到有时 Greengrass 部署过程会因为等待所有组件安装而超时。我确信我们可以调整超时时间,但我们将通过预先安装这些组件来帮助它,但我们必须在 greengrass 运行时用户帐户下安装它们。因此,现在,随着我们组件的首次部署,pip3
会注意到我们已经满足了依赖项,然后继续进行。
$ sudo su ggc_user $ pip3 install --user awsiotsdk boto3 picamera Adafruit-DHT
现在,这里有一个警告……如果您仍然运行着 FakePi 实例并且正在接收此更新,那么在该系统上部署将会失败,因为 picamera
无法在非 Raspberry Pi 设备上安装,因此 pip3
安装命令将出错,从而导致 Greengrass 报告安装失败。您可以忽略此消息,或者如果您愿意,可以从组中删除该设备。
测试时间
部署完成后,我们可以再次转到我们的 MQTT 测试台,在 picam/request
主题上发送一条消息。如果一切顺利,我们将收到一个 JSON 响应,其中包含捕获图像的 URL。请记住,小巧的 Pi Zero 性能不高,在我这里,通常需要长达 10 秒左右才能收到响应。
当然,如果我将 Pi 配置为每 10 分钟只连接一次互联网,那么延迟会更长,但这正是 MQTT 消息队列方法的优势……它专为这类间歇性连接而设计。在 MQTT 测试控制台中,我可以设置消息的属性,并可以在设备重新上线之前将其保留在队列中。我们可以通过关闭 Pi 上的 greengrass 进程来演示这一点……
$ sudo systemctl stop greengrass
然后创建一条消息,并选择“保留消息”标志。然后,当我们重新启动 greengrass 进程时,它将看到新消息并对其采取行动。当 Greengrass 重新启动时,它会在 MQTT 队列上发送一些状态信息,您可以在这里看到。
一旦我们的 snapPicture 进程再次启动并运行,我们应该会收到一个响应。此外,核心设备还可以充当其他本地设备的 MQTT 消息的本地代理,这对于那些没有能力或容量在本地存储或排队数据的传感器来说非常有用。
如果您愿意,可以使用类似 Node-RED 的工具来构建一些模拟,以获得更多关于 MQTT 和 GreenGrass 的乐趣,但本视频的其余部分将专注于构建我们的火星探测器的硬件组件。
硬件解决方案
这个物理构建由几个基本组件组成。总的来说,所有东西的成本都低于 100 美元,而且我大部分东西都放在手边。我们从大脑开始……Raspberry Pi Zero W。我通过焊接 GPIO 引脚对这个 Pi 进行了一些定制。我使用的是 Sandisk ultra 32GB microSD 卡,上面加载了 Raspberry Pi OS Lite 版本。我还使用了 Pi Camera 版本 2.1,带有特殊的 Pi Zero 连接器排线。
供电方面,我有一个 UUGear Zero2Go Omini 电源控制器。这是一个很棒的小设备,可以接受三种不同的电源输入并在它们之间切换,为 Pi 调节电压。它还可以感应输入电压,并在电压过低时优雅地关闭 Pi,并在电压达到足够水平时重新开启。这对于太阳能供电的应用非常完美。我还有一个 Adafruit 太阳能充电控制器,可以在有阳光时为 Pi 供电并为电池充电,在没有阳光时切换到电池供电。我对此组件进行了一些定制,添加了一个 4700 微法电容器,它充当一种电子缓冲器,可以在电源之间实现更平滑的切换。为该设备供电的是一个 4400 mAh 的 LiPo 电池和一个 Voltaic 6 伏 3.4 瓦太阳能电池板。我还用我手边的一些废弃铝角钢制作了一个小支架来固定太阳能电池板。
充当环境传感器的是一个 DHT22 温度和湿度传感器,连接到 GPIO 引脚零和六(用于供电)以及引脚 26(用于数据)。对于我们的互联网连接,我使用的是一个 Sixafab Cellular IoT HAT 和一张 Twilio Super SIM 卡。这张 SIM 卡非常棒,因为它几乎可以在世界各地使用。对于位于美国的我来说,它提供了对 AT&T 和 T-Mobile 数据网络的访问,具体取决于哪个信号最强。现在,这个调制解调器可以在堆叠在 GPIO 引脚上的 UART 串行端口上工作,但我发现 USB 连接方法的**数据性能要好得多**。要使用 USB 数据线同时通过数据和电源为这个蜂窝 HAT 供电,我确实需要跳过板上的两个焊盘。
外壳方面,我从我当地的仓储式商店买了一个便宜的防风雨盒,花费约 6 美元。我把它喷成了白色,并在里面钻了两个孔……一个用于摄像头,我用一块薄的透明塑料胶水覆盖了它。另一个孔是用于太阳能板连接的……我将用硅胶密封它。在内部,我使用了重型 3M 维可牢粘贴组件到容器的侧面。这就是我的独立火星探测器!
我学到了什么?
那么,在这个项目中我学到了一些什么呢?嗯,我了解到有很多关于 Greengrass 版本 1 的资源,但关于版本 2 的却不多。希望这个项目能帮助填补一些空白。我还了解到,在版本 2 中,AWS 似乎正在弱化 Greengrass 与 Lambda 函数的结合使用,这对我来说一点也不坏。在版本 1 中,我常常发现使用 Lambda 是一种额外的复杂性,似乎并不必要。用户界面和整体体验仍然存在一些粗糙之处。Greengrass CLI 功能有限,一点也不直观。似乎我们无法删除旧的部署,而且我发现一些幽灵组件仍然与我早已删除并重新配置过的核心设备相关联。对于一个喜欢保持控制台整洁的人来说,这些小小的遗留物真的很烦人。
总的来说,这个项目对我来说是一个相当陡峭的学习曲线。我遇到了许多障碍和死胡同……我不确定是我做错了什么,也许我遇到了平台 bug,或者也许我使用的是过时的文档或示例。但这就是学习过程……我们必须不断尝试不同的方法,直到找到看起来有效的方法。因此,我绝对不认为这个项目代表了大型生产物联网部署的参考架构,但也许它能激发某人的兴趣。下一步是什么?要不要做一个火星车?
如果您想观看此完整教程的视频版本,请前往 A Cloud Guru 的ACG Projects 页面。在那里,您将找到本教程和其他实践教程,旨在帮助您同时创建和学习。观看视频需要一个免费账户,但有了这个免费账户,您还可以每月获得精选的免费课程和其他不错的福利……免费!