亚马逊AWS官方博客
使用 AWS IoT Greengrass 在 OpenWrt 上构建边缘解决方案 | AWS 上的物联网
Original URL : https://aws.amazon.com/cn/blogs/iot/building-edge-solutions-on-openwrt-with-aws-iot-greengrass/
在这篇博文中,我探讨了 ODM、OEM、SI 和客户在使用 AWS IoT Greengrass 时,满足这些要求所需的选项。
概览
今天,AWS 宣布为适用于 ARMv7l 和 ARMv8 架构的 AWS IoT Greengrass 提供 OpenWrt 支持。AWS IoT Greengrass 可将 AWS 无缝扩展到边缘设备,以便在本地处理所生成的数据,同时仍然使用云进行管理、分析和长久存储。
在与客户合作开发解决方案时,我发现 OpenWrt 对以下方面而言是理想的操作系统:有助于减少系统的资源占用,并为运行耗损均衡文件系统提供功能强大的选项。
以前,为了运行 AWS IoT Greengrass,您需要安装 glibc C 运行时程序包,从而导致占用额外的资源。如今,利用 OpenWrt,您可以从一开始就为 AWS IoT Greengrass 设计操作系统,以最大限度地减少资源占用。
客户、合作伙伴和 SI 现在可以选择为其 OpenWrt 映像使用较小的 C 运行时库,从而完全消除 AWS IoT Greengrass 对 libc 的依赖性,而且不会增加资源占用量。
这些改进使客户能够使用 AWS IoT Greengrass 提供 AWS Lambda 函数和 Amazon SageMaker Neo 编译的机器学习 (ML) 模型(占用空间小 100 倍),从而创建最适合资源有限、基于 OpenWrt 的网关设备的更小规模的 IoT 解决方案。
适用于 OpenWrt 的 AWS IoT Greengrass 程序包现已可供下载。
在边缘位置针对 ML 进行优化
我们的许多客户和合作伙伴正在 AWS 上构建引人注目的创新解决方案,并将 AWS IoT Greengrass 用在架构中。
此处所述示例来自我们的高级 AWS 合作伙伴之一 Smartiply, Inc.。Smartiply 已将 AWS IoT Greengrass 与 Smartiply IoT Gateway 集成,以便在边缘处提供高级 AWS 功能,为两家的共同客户提供新的使用案例和机会。
Smartiply IoT Gateway 可加速在基础设施面临挑战或存在地理和经济方面难题的环境中对 IoT 的采用。目标使用案例包括视频监控、企业安保、视频流和智慧城市。网关的核心功能包括:
- 智能连接,提供不间断的视频体验
- 雾计算环境中的嵌入式智能(视频、语音、数据和传感器分析),可用于本地决策
- 数据精简,以优化传输到云的流量
- 用于监控的传感器集成
- 远程设备管理
除了智能连接和边缘智能之外,Smartiply 的客户还希望在 AWS IoT Greengrass 的支持下在边缘执行对象分类推理。Smartiply 的设备运行 OpenWrt 以优化设备的使用寿命和操作。Smartiply 已决定使用 AWS IoT Greengrass 为其客户提供无缝、安全的 IoT 连接和更有效的边缘到云计算。AWS IoT Greengrass 可让客户使用 Lambda 函数和 ML 推理,通过编程扩展不断拓展其设备的价值。
我们两家在印度有一个从事电子监控领域的共同客户。他们最近还因在技术领域的领先地位及为印度客户提供丰富的多元化定制服务,而获得了 Frost Sullivan 奖。
我们齐心协力,帮助他们拓展新的客户领域,实现客户多元化,并进军银行 ATM 监控之外的新市场。这些市场包括需要更高级别功能以满足高级需求的环境,例如零售、物流和建筑施工。通过使用 Smartiply IoT Gateway 并在 AWS 云上构建解决方案,我们的共同客户使用 IoT 提供了包括基本和高级视频分析在内的智能安全解决方案。
他们在各个位置都布设了安全监控摄像头。但是,通过 AWS IoT Greengrass 提供的 AWS 高级功能(特别是 Amazon Rekognition),Smartiply 可以通过边缘到云的框架快速有效地提供创新的计算机视觉解决方案。
以下所有项均属于增值微服务:
- 检测快餐店的员工是否佩戴围裙或帽子,以确保合规。
- 发现公共场所令人不安的行为(打斗)。
- 计算餐厅收费的平均时间。
- 监控餐厅上座率。
- 改善 POS 工作站的队列管理。
所有这些都为 Smartiply 开辟了新的收入机会并提高了运营效率。
“与 Amazon 合作、集成 AWS IoT Greengrass 的最大优势是完美契合所有标准。我们不需要另起炉灶,我们可以着眼于边缘,快速、高效地提供解决方案。对于许多任务关键型应用程序来说,在边缘实现基本功能,但同时还可以访问云以实现高级计算的混合模型都是理想的解决方案。它不仅可以节省成本,还可以提高性能,有助于加快实现 IoT 部署急需的投资回报率。” – Kaushik Pillalamarri,Smartiply, Inc. 联合创始人兼 CEO。
另一个共同客户是墨西哥最大的地方政府机构之一,他们需要通过 Smartiply IoT 网关将 AWS 云的 ML 功能与视频识别相结合,打造智慧城市。通过自动化、AWS 云驱动的模型训练和测试提供强大的解决方案,持续改进边缘处执行人员和物体识别的能力。
明确系统要求
构建嵌入式 Linux 系统(Yocto、Buildroot 或 OpenWrt)时,所有系统要求都要内置于映像中。
通常情况下,除非是构建开发人员映像,否则生产环境中没有可用的程序包管理器工具,例如 apt、yum 或 opkg。这意味着,除了内核配置要求外,目标使用案例的所有依赖包都要预先构建到发行映像中。对程序包进行更新就意味着,要构建可交付给客户的固件升级。
本文不会探讨如何构建自定义程序包,因此请安装 opkg 并手动安装 AWS IoT Greengrass。在后续博文中,我们会介绍如何通过自定义方式将 AWS IoT Greengrass 打包到 OpenWrt 中。
启动 Amazon EC2 实例
如果您有适用于嵌入式 Linux 的构建用计算机,可以选择使用该计算机。确保满足所有系统构建依赖项要求。
如果您没有构建用计算机,请启动 Amazon EC2 实例以构建 OpenWrt,并启动符合 AWS IoT Greengrass 容器模式要求的实例。按照启动实例向导中的说明进行操作,但注意要指定以下内容:
- 在“选择 Amazon 系统映像 (AMI)”页面上,选择公共映像并针对 Debian 进行筛选。选择最新的 Stretch 发行版。
- 为加快构建速度,请选择较大的实例。
- 将存储空间分配更改为 120GB。
要连接到您的实例,请在登录构建用系统后运行以下命令:
ssh -i ~/.ssh/xxx.pem admin@xx.xxx.xxx.x
下面的许多步骤直接摘自“OpenWrt 项目映像快速构建指南”。连接到 EC2 实例后,运行以下命令以安装依赖项:
sudo apt-get update
sudo apt-get -y dist-upgrade
sudo apt-get install -y subversion g++ zlib1g-dev build-essential git python time
sudo apt-get install -y libncurses5-dev gawk gettext unzip file libssl-dev wget
sudo apt-get install -y libelf-dev
然后,查看 OpenWrt 源代码。
git clone https://git.openwrt.org/openwrt/openwrt.git/
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
运行以下命令进入菜单系统:
make menuconfig
选择相应的开发板
请按照以下步骤选择相应的开发板。
- 选择“目标系统”,滚动到 Broadcom BCM27xx,然后选择“进入”。
- 滚动到“子目标”,并选择“进入”。
- 因为此示例在 Raspberry Pi 3 B 型号上运行,请滚动到 BCM2710,然后选择“进入”。
安装实用工具
请按照以下步骤安装多个实用工具和 ca-certificates 程序包。
- 安装 lsblk 实用工具,此工具用于列出设备上的磁盘和分区:
- 选择实用工具,然后按 Enter 键。
- 选择磁盘,然后按 Enter 键。
- 选择 lsblk,然后输入 Y。
- 按 Tab 键并选择退出,然后按 Enter 键。
- 安装 useradd 和 groupadd 实用工具,用于添加所需的 AWS IoT Greengrass 用户和组。在生产环境中,自动将用户和组分别添加至
/etc/passwd
和/etc/group
。- 选择基础系统,然后按 Enter 键。
- 选择 busybox,然后按 Enter 键。
- 选择自定义 busybox 选项,然后按 Y。
- 选择登录/密码管理实用工具,然后按 Enter 键。
- 对于 addgroups、support adding users to groups、adduser、mkpasswd 和 chpasswd,均按 Y。
- 按 Tab 键并选择退出,然后按 Enter 键(三次)。
- 安装 ca-certificates 程序包,因为 AWS IoT Greengrass 需要与 AWS IoT Core 网关执行初始 TLS 1.2 握手:
- 选择基础系统,然后按 Enter 键。
- 选择 ca-certificates,然后按 Y。
- 按 Tab 键并选择退出,然后按 Enter 键。
- 按 Tab 键三次,并选择保存,然后按 Enter 键。再次按 Enter 键保存配置。
- 按 Tab 键并选择退出,然后按 Enter 键。
在当前工作目录下创建名为 LXC_PATCH 的文件。复制并粘贴以下代码块:
cat <<OUT >> .config
CONFIG_KERNEL_BLK_CGROUP=y
CONFIG_KERNEL_CC_STACKPROTECTOR_REGULAR=y
CONFIG_KERNEL_CFQ_GROUP_IOSCHED=y
CONFIG_KERNEL_CGROUPS=y
CONFIG_KERNEL_CGROUP_CPUACCT=y
CONFIG_KERNEL_CGROUP_DEVICE=y
CONFIG_KERNEL_CGROUP_FREEZER=y
CONFIG_KERNEL_CGROUP_SCHED=y
CONFIG_KERNEL_CPUSETS=y
CONFIG_KERNEL_DEVPTS_MULTIPLE_INSTANCES=y
CONFIG_KERNEL_FREEZER=y
CONFIG_KERNEL_IOSCHED_DEADLINE=m
CONFIG_KERNEL_IPC_NS=y
CONFIG_KERNEL_LXC_MISC=y
CONFIG_KERNEL_MEMCG=y
CONFIG_KERNEL_MEMCG_SWAP=y
CONFIG_KERNEL_MM_OWNER=y
CONFIG_KERNEL_NAMESPACES=y
CONFIG_KERNEL_NETPRIO_CGROUP=y
CONFIG_KERNEL_NET_CLS_CGROUP=y
CONFIG_KERNEL_NET_NS=y
CONFIG_KERNEL_PID_NS=y
CONFIG_KERNEL_POSIX_MQUEUE=y
CONFIG_KERNEL_RESOURCE_COUNTERS=y
CONFIG_KERNEL_USER_NS=y
CONFIG_KERNEL_UTS_NS=y
CONFIG_KERNEL_SECCOMP_FILTER=y
CONFIG_KERNEL_SECCOMP=y
OUT
完成配置和编译
现在已经为设备设置了主要更改,您可以通过运行 defconfig 目标来填充剩余的基准配置:
make defconfig
要编译系统,请运行以下命令。考虑为 EC2 实例实现实例化的核心数,向其添加一个核心,并将其应用于 make 命令:
make -j X
如果您之前选择了 C4.8xlarge 发行版,则此数字为 37:
make -j 37
如果构建中断,请尝试使用 X=1
继续,因为 make 依赖项可能会被破坏。根据我的经验,在本文定义的配置下运行并行性不会造成构建中断。但是,如果添加了其他软件包,则可能会发生中断。
make -j 1
当我使用 C4.8xlarge EC2 实例构建时,所需时间不到 14 分钟。
构建系统后,使用 scp 将映像下载到工作站。 映像位于以下目录中:
~/openwrt/bin/targets/brcm2708/bcm2710
输入下载命令:
scp -i ~/.ssh/xxx.pem admin@xx.xxx.xxx.xx:/home/admin/openwrt/bin/targets/brcm2708/bcm2710/openwrt-brcm2708-bcm2710-rpi-3-ext4-factory.img.gz
。
您可以暂停或删除用于构建 OpenWrt 系统的 EC2 实例,以节省 EC2 费用。
将映像刷入 microSD 卡
接下来,将映像刷入您的 microSD 卡。此操作过程与上一部分描述的过程类似。
sudo dd if=./openwrt-brcm2708-bcm2710-rpi-3-ext4-factory.img of=/dev/disk3 bs=2048
sync
diskutil unmountdisk /dev/disk3
从工作站中移除 microSD 卡,将 microSD 插入 Raspberry Pi,然后打开电源。
配置网络
在本文中,我们使用以太网连接。编辑 /etc/config/network,将 eth0 更改为使用 DHCP。编辑后,您的网络应类似于:
config interface 'loopback'
option ifname 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd77:891b:69b8::/48'
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'dhcp'
编辑网络后,重新加载网络配置以使更改生效:
service network reload
为 AWS IoT Greengrass 配置用户和组
将用户添加到系统:
addgroup ggc_group
adduser -DH -G ggc_group ggc_user
修改 /boot/cmdline.txt 中的引导参数以装载内存 cgroup。进入 vi /boot/cmdline.txt
文件,按 End 键,选择 a,然后输入以下文本:
cgroup_enable=memory cgroup_memory=1
按 Esc 键,输入 :wq!
以便将缓冲区内容写入文件,并退出 vi。输入 reboot
并按 Enter 键重启系统。
创建 AWS IoT Greengrass 组
接下来创建您的 Greengrass 组。按照简要组创建向导中的说明进行操作,但注意要指定以下内容:
- 为您的组选择一个名称,例如 openwrt-containermode。
- 在“选择 root CA”下,将 Amazon root CA 1 保存到 tar.gz 下载内容所在的目录。
- 在“选择平台下,将 Aarch64 的 OpenWrt 发行版下载到相同的已知目录下。
在您的设备上启动 AWS IoT Greengrass
现在,您可以在物理设备上启动 AWS IoT Greengrass 了。
- 插入一个 U 盘,并将所有三个文件复制到 U 盘:
- 组配置 tar.gz
- AWS IoT Greengrass 软件 tar.gz
- root CA
- 卸载 U 盘,并将其插入 Raspberry Pi。
- 要装载 U 盘,请切换回串行连接窗口并运行以下命令:
lsblk # identifies the disk partition for your memory stick
mkdir /media
mount /dev/sda1 /media
将 AWS IoT Greengrass 及其配置解压到文件系统。
cd /
tar xzvf /media/[name of greengrass distribution file]
cd greengrass
tar xzvf /media/[name of greengrass configuration file]
cp /media/AmazonRootCA1.pem certs/root.ca.pem
启动 AWS IoT Greengrass。
/greengrass/ggc/core/greengrassd start
部署
接下来即可部署 Greengrass 组。 AWS IoT Greengrass 现在正在运行您以 OpenWrt 系统为目标的第一次部署。
接下来,您可以开始按照教程操作,例如:
- AWS IoT Greengrass 上的 Lambda 函数(第 1 部分)
- AWS IoT Greengrass 上的 Lambda 函数(第 2 部分)
- 在 AWS IoT Greengrass 组中与设备交互
- 与设备影子交互
- 访问其他 AWS 服务
在设计运行生产工作负载(如消费类成品)的 AWS IoT Greengrass 系统时,您可能还需要更深入地了解硬件安全集成。
小结
根据您在 AWS 上构建解决方案的原因,您可能会发现在 OpenWrt 操作系统上运行 AWS IoT Greengrass 十分有帮助。从基本的遥测到执行 ML 推理,我们的客户正在构建多种多样的 AWS IoT Greengrass 解决方案,以便不断创新并扩展解决方案的价值。
在本文中,您学习了如何构建支持 AWS IoT Greengrass 的 OpenWrt 系统映像。现在,您可以评估 OpenWrt 操作系统能否帮助您进一步加强功能,并利用 AWS IoT Greengrass 不断改进您的边缘功能。