作者:Nenad Ilic 和 Tim Mattison,发布时间:2022年10月6日,来源于 AWS 命令行界面, AWS IoT Greengrass永久链接 分享
本文展示了如何为 AWS IoT Greengrass 设置一个高效的开发环境。借助这个环境,您可以快速迭代您的创意,并自动化创建边缘计算系统的过程。构建一个可重复的边缘系统开发环境可能需要较长的时间,而这些工具将大大减少您启动的时间,并为生产应用程序提供基础。
基于 Ubuntu 2004 的虚拟机可以:
在几分钟内从零开始连接真实的 USB 设备使用 AWS 凭证与 AWS 服务交互从 USB 摄像头捕获图像并保存到主机系统运行带有单个组件的 AWS IoT Greengrass我们将使用 GreenEyes 实现一个数字视频记录器DVR平台,该平台利用多个 AWS 服务进行边缘计算,如 AWS IoT Greengrass 和 FreeRTOS。
必须安装 AWS 命令行接口 v2,并在默认位置 HOME/aws 设置凭证。该项目将把这些凭证引入虚拟机,以便您可以立即与 AWS 进行交互。
您需要安装 git 和 bash。所有近期版本的 Linux 和 MacOS 应该已经预装这些工具。
您需要一个可以运行 bash 脚本的终端。推荐使用随 Git for Windows 提供的 Git Bash。如果您已安装 Windows Terminal,请确保在 Git for Windows 的安装过程中启用 Git Bash 配置。然后,您可以在 Windows Terminal 的下拉菜单中选择 Git Bash,而非使用默认终端。
您需要一个虚拟化平台。虽然很多人更喜欢使用容器,但此情况下您需要加载一些内核模块并访问 USB 设备,这在基于容器的系统中往往无法实现。此外,一个目标是让 Windows、MacOS 和 Linux 之间的体验尽可能一致。
您将使用的虚拟化平台是 VirtualBox。VirtualBox 是跨平台的、免费的,并支持 USB 直通。测试表明,它在单流视频捕获和处理方面的性能是足够的。
需要一些工具来让虚拟机的设置尽可能简单。可以在命令行中启动、停止和重建虚拟机,这将节省时间,并避免手动配置步骤。
Vagrant 自动化了您的虚拟机的构建和配置。Vagrant 是跨平台的,可以使用 VirtualBox 作为后端,支持 USB 直通。
Vagrant 还可以在主机和客操作系统之间共享文件。结果会立即显示,您可以在主机上直接监控您的系统。
USB 摄像头并不完全相同。幸运的是,所有 UVC 网络摄像头应该是相同的。UVC 是 USB 视频类 的缩写,这是一个提供标准接口以捕获视频的标准。某些网络摄像头不支持该标准,并需要额外的软件。
为简单起见,本文将范围限制在 UVC 网络摄像头。该系统可以适应其他摄像头,但超出了本文的范围。
风驰vnp您可以开始使用的可靠 UVC 摄像头是 Logitech C922。它在多家在线商店有售,可以选择全新或二手的版本。还有一些 C922 的变体,如 C920s 和 C920e。这些摄像头也应该可以使用,若经过测试合格,我们将更新文档。
只要您使用的摄像头在 UVC 设备列表 中,或者声称支持 UVC,它应该都能工作。尽管如此,默认代码使用的是 Logitech C922。如果您使用其他摄像头,则需要对配置进行一些更改。设置好 VirtualBox 和 Vagrant 后,您可以测试摄像头并验证设置。
VirtualBox 是您最容易设置的依赖项之一。您可以访问 VirtualBox wiki 的下载页面,点击与您运行的平台相对应的 VirtualBox 版本。安装 VirtualBox 需要管理员权限,因此确保使用您完全可以控制的计算机。
本文基于 MacOS 上的 VirtualBox 6132。如果您使用不同的平台或更新的版本,某些界面可能略有不同。如有疑问,请通过 在我们 GreenEyes 仓库中提交问题与我们分享截图。
您还需要添加对 USB 3x 的支持,以便您的 USB 摄像头能够正常工作。要获取 USB 3x 的支持,您需要安装 Oracle VM VirtualBox 扩展包,该扩展包可以在您下载 VirtualBox 的同一页面找到。
注意:如果在安装扩展包时已经打开了 VirtualBox GUI,您将需要关闭并重新打开它。
请访问 Vagrant 下载页面,安装适合您操作系统的版本。某些操作系统可以使用包管理器Homebrew、apt 等安装 Vagrant,而另一些则需要下载二进制构建文件。
GreenEyes 仓库包含本系列每篇文章的脚本和文档。用于主机上执行的脚本位于 greeneyes/blogposts/001/host 目录中,而用于客户机上执行的脚本位于 greeneyes/blogposts/001/guest 目录中。
在本帖的主机目录中,只有一个 Vagrantfile,没有其他脚本可供执行。
在您的终端中导航到您希望存储仓库的目录,并通过以下命令克隆它:
bashgit clone https//githubcom/awslabs/greeneyes/
如果您的系统运行的是 MacOS 或 Linux,您可以开始进行设置,所有依赖项都已经具备。

如果您的系统运行的是 Windows,则需要启用 HyperV如尚未启用。在管理员终端中使用以下命令启用 HyperV:
bashpowershell EnableWindowsOptionalFeature Online FeatureName MicrosoftHyperV All
注意:每次使用 vagrant 命令时,必须处于 greeneyes/blogposts/001/host 目录中。
在 greeneyes/blogposts/001/host 目录中运行 vagrant up。完成后,虚拟机会加载必要的内核模块,并启用 USB 30。此命令可能会根据多种因素如 Internet 带宽、CPU、RAM 等耗时较长。最小情况下,您可以预期大约三分半钟的时间。
如果虚拟机无法配置由于临时的网络连接问题,虚拟机可能会无法运行配置步骤。当这种情况发生时,将打印出类似以下的错误:
The SSH command responded with a nonzero exit status Vagrantassumes that this means the command failed The output for this commandshould be in the log above Please read the output to determine whatwent wrong
如果您看到此消息,请运行 vagrant destroy 删除虚拟机,然后再运行 vagrant up。否则,虚拟机将没有适当的依赖项和配置,无法继续。
运行 vagrant ssh,您将进入虚拟机的 shell。要验证 USB 支持是否正常工作,请运行以下命令:
bashdmesg grep i xhci
输出应该包含类似的几行:
[ 1287174] usb usb3 Product xHCI Host Controller[ 1287928] usb usb3 Manufacturer Linux 540107generic xhcihcd
如果这些行存在可能还有其他更多行,则表示 USB 30 支持工作正常。通过运行 exit 命令退出 shell。
现在运行 vagrant halt 停止虚拟机,以便您可以设置 USB 直通,以便连接您的摄像头。
注意:默认 Vagrant 配置已配置 USB 30 直通,并为 Logitech C922 添加了设备过滤器。如果您使用的是 Logitech C922,可以跳过此部分。否则,请按照此部分为您的摄像头添加设备过滤器。
将 USB 摄像头插入计算机中。您将在下一屏幕上的列表中选择它,最好提前将其准备好,而不是重新加载界面。
启动 VirtualBox GUI。界面应该如下所示:
现在选择“设置”,然后选择“端口”,接着选择“USB”。
该屏幕应该勾选“启用 USB 控制器”,选择“USB 30 (xHCI) 控制器”,并显示空的“USB 设备过滤器”列表,还有两个 USB 图标。
选择带有 USB 线和加号的图标,如下所示:
从列表中选择您连接的摄像头,它将显示在列表中,如下所示:
选择“确定”,您就可以重新启动实例并进行测试了。
现在是进入虚拟机并尝试从摄像头捕获图片的时间了。
运行 vagrant up 启动虚拟机。通过运行 vagrant ssh 打开虚拟机中的终端。
在 shell 中运行以下命令进行捕获测试:
bash/guest/bashcaptureloop/captureone
捕获测试的输出仅为一个单一的 lt 字符,表示成功。您应该在 /shared 目录中看到一个新的 jpg 文件。该文件的名称将是一个数字,表示捕获图像时的 UNIX 纪元时间。该图像是来自您摄像头的单个帧。您可以在主机的 shared 目录中查看并验证图像有效性。Vagrant 提供的共享目录功能会将 /shared 从虚拟机映射到主机的 shared 目录。
如果您尚未打开虚拟机中的终端,请通过运行 vagrant ssh 打开。然后在终端中运行以下命令:
bashaws sts getcalleridentity
如果您的凭证正确加载,您应该看到如下输出:
json{ UserId AXXXXXXXXXXXXXXXXXXXXX Account 123456789012 Arn arnawsiam123456789012user/me}
如果缺少凭证,您将看到如下输出:
Unable to locate credentials You can configure credentials by running aws configure
通过在主机系统上尝试同样的命令来验证您的 AWS 凭证。如果不成功,请查看 配置基础知识文档,如有必要重新设置凭证。
如果您尚未在虚拟机中打开终端,请通过运行 vagrant ssh 打开。在终端中运行以下命令:
bashgginstall
此脚本将下载 AWS IoT Greengrass Nucleus 的最新版本并在您的虚拟机上配置 AWS IoT Greengrass。完成后,您应该看到如下消息:
Successfully set up Nucleus as a system serviceGreengrass S3 access policy created [] for bucket []
您可以运行以下命令监控所有 AWS IoT Greengrass 日志:
bashgglogs
gglogs 脚本将自动检测新创建的日志文件,因此您无需重启它即可查看组件的活动。
注意:要退出 gglogs 脚本,请按 CTRL 和反斜杠 (CTRL)。
部署 Bash 捕获循环组件
您之前运行的 captureone 程序其实是一个 Bash 脚本。还有另一个程序 captureloop,它将 captureone 包裹在一个循环中,每秒捕获一次图像,并保留最近的 10 幅图像在共享目录中。
captureloop 也是一个 Bash 脚本。编写它为 Bash 脚本旨在演示组件可以使用任意语言编写。
要部署 Bash 捕获循环组件,请确保打开一个正在监控日志的终端并运行 gglogs 命令。然后打开一个新终端并运行以下命令:
bashggclouddeploy
几秒钟后,您应该看到如下的日志消息:
20220429T153137495Z [WARN] (Copier) greeneyesBashCaptureLoop stderrlt {scriptName=servicesgreeneyesBashCaptureLooplifecycleRunserviceName=greeneyesBashCaptureLoop currentState=RUNNING}
这表明 Bash 捕获循环正在运行。您还会看到图像出现在主机计算机的共享目录中。
ggclouddeploy 命令使用 AWS IoT Greengrass 开发工具包命令行接口,也称为 GDK,自动构建、发布和部署 guest 目录中任何 AWS IoT Greengrass 组件,使用 AWS IoT Greengrass 云服务。
它执行如下操作:
验证是否已安装来自开发工具包的 AWS IoT Greengrass CLI。此步骤通过 gginstall 脚本在初始部署时使用 deploydevtools true 选项完成。查找 guest 目录中与 GDK 兼容的组件。它通过查找 gdkconfigjson 或 gdkconfigjsontemplate 文件来实现。如果存在 gdkconfigjson 但没有 gdkconfigjsontemplate,则直接使用 gdkconfigjson 而不进行任何修改。这让其支持不属于本帖内容的组件。如果存在 gdkconfigjsontemplate 文件,则填充任何占位符值,然后用更新的信息覆盖 gdkconfigjson。这使得能够在多个 AWS IoT Greengrass 虚拟机之间复用组件的配置,而无需每次都更新 Amazon Simple Storage Service (S3) 存储桶。使用 gdk component build 命令构建每个组件。此步骤创建一个可发布到 S3 的组件 ZIP 存档。使用 gdk component publish 命留言框-