深入学习Azure IoT Edge - 了解架构和系统模块
分类: Azure物联网 ◆ 标签: #Azure #IoT Edge # ◆ 发布于: 2023-06-14 20:39:29

我们之前使用了一篇文章快速的介绍了Azure IoT Edge
, 我们学习了简单的概念,以及如何快速的安装和配置好一个Azure IoT Edge Runtime
, 我们本章来深入的学习一下Azure IoT Edge
概念和用户,之后我们再以实际的动手教程来完善这个部分,关于快速的介绍,您可以参考文档: Azure IoT Edge快速介绍
什么是Azure IoT Edge Runtime
简单来讲,就是一个堆帮助用户将一个设备变为Azure IoT Edge
设备的软件,如果您使用基于Deb
包管理的系统来安装,那么它主要是包括两个包(Deb
安装包):
aziot-edge
aziot-identity-service
如果是查看系统服务,主要包括如下服务:
aziot-edged
aziot-identityd
aziot-keyd
aziot-certd
aziot-tpmd
如果需要查看Azure IoT Edge Runtime
提供的工具,那么主要是有:
ghw@Ubuntu1804:~$ sudo iotedge --help iotedge 1.2.5 The iotedge tool is used to manage the IoT Edge runtime. USAGE: iotedge [OPTIONS] <SUBCOMMAND> FLAGS: -h, --help Prints help information -V, --version Prints version information OPTIONS: -H, --host <HOST> Daemon socket to connect to [env: IOTEDGE_HOST=] [default: unix:///var/run/iotedge/mgmt.sock] SUBCOMMANDS: check Check for common config and deployment issues check-list List the checks that are run for 'iotedge check' config Manage Azure IoT Edge system configuration. help Prints this message or the help of the given subcommand(s) list List modules logs Fetch the logs of a module restart Restart a module support-bundle Bundles troubleshooting information system Manage system services for IoT Edge. version Show the version information ghw@Ubuntu1804:~$
同时我们在第一安装完成之后,我们还可以看到Azure IoT Edge
默认有两个系统模块: edgeAgent
以及edgeHub
模块,如下所示:
ghw@Ubuntu1804:~$ sudo iotedge list NAME STATUS DESCRIPTION CONFIG edgeAgent running Up 6 minutes mcr.microsoft.com/azureiotedge-agent:1.2 edgeHub running Up 6 minutes mcr.microsoft.com/azureiotedge-hub:1.2 ghw@Ubuntu1804:~$
这些是我们最直观的角度来观察的到底什么是Azure IoT Edge Runtime
, 但是从设计和架构的角度,我们不仅仅要理解Azure IoT Edge
是一些工具包或者服务,或者是软件包的集合,同时这个集合还要完成如下的一些功能:
- 在设备上安装和更新相应的模块
- 从软件的角度服务该设备和
Azure IoT
相关的安全。 - 确保设备上的所有模型总是在运行。
- 向
Azure IoT Hub
报告设备和设备模块的状态,监控设备。 - 管理边缘设备和下挂设备之间的通讯。
- 管理设备上
Edge
模块和Edge
设备之间的通讯。 - 管理
Edge
设备和Azure IoT Hub
之间的通讯。 - 管理
Edge
设备之间的通讯。
总结一下Azure IoT Edge Runtime
的主要功能其实也就是分为两大类:
- 通讯管理
- 模块管理
在Azure IoT Edge Runtime
中由两个系统模块来分别负责这两种任务:
edgeAgent
: 这个模块主要负责完成部署、管理、监控模块。edgeHub
: 该模块就主要负责通讯了。
什么是IoT Edge Agent
AKA edgeAgent
系统模块,它的主要作用可以简单的归纳一下为:安装和实例化模块,保持它一直运行,并监控模块的运行,向Azure IoT Hub
汇报模型的状态。
什么是模块(Module
)
我们之前一直在提到Azure IoT Edge Runtime
的两大功能之一是管理模块(module
), 那么到底什么是模块呢?
模块(module
)是和Azure IoT Hub
中我们提到的Device
设备概念非常类似,我们可以作一个类比,如果我们的设备是指一个物理的可以连接Azure IoT Hub
的单元,那么我们的模块(module)
可以看作是一个用代码表示的"虚拟"单元, 它是表示为计算机代码,同时它是需要物理的设备来支撑的,也即模块一定是运行在某个设备上的。
Azure IoT Edge Runtime
通过模块(module)
让用户将部分业务逻辑转移到边缘计算设备上,同时由edgeAgent
模块来管理模块的生命周期,在模块里面我们可以按照自己的要求完成代码的设计,例如可以使用SDK将其他的Azure
服务也集成到模块里,例如Azure Function
, AI
等等。需要注意的是在Azure IoT Edge Runtime
中的模块必须是容器化的,对于模块请仔细考虑如下四个基本概念:
模块镜像
: 指的是容器化的,包含软件定义的软件包。模块实例
: 是指由系统模块edgeAgent
实例化并运行的进程。模块标识
: 是指存储在Azure IoT Hub
和模块实例
相关的部分信息。孪生模块(module Twin)
: 和孪生设备(device twin
)是一个类似的概念,指的是一份保存在Azure IoT Hub
的json
文档,包含模块实例的状态信息,metadata
, 配置等等信息。
一个模块是一个容器化的打包应用,同时这个模块是由系统模块edgeAgent
来实例化,并保证它时刻都在运行,模块开完完成后上传到固定的库中,然后再部署到边缘设备上,一个模块可以部署到多个边缘设备上,也可以在一个边缘设备部署多次。
当edgeAgent
实例化一个模块成功后,edgeAgent
会给模块一个标识,这个标识会存储在Azure IoT Hub
上,用于定位和通讯。需要注意的是模块标识依赖于设备标识,例如一个命名模块DemoForPrice
, 它所在的边缘设备名字为Stock
, 那么edgeAtent
会为这个模块创建一个标识名为:/devices/Stock/modules/DemoForPrice
, 从这个标识也可以注意到,如果要将一个模块在一个边缘设备上部署多次,那么需要给这个模块的部署不同的命名。例如:/devices/Stock/modules/DemoForPrice1
, 或者 /devices/Stock/modules/DemoForPrice2
等等。
Module Twins
孪生模块
每一个由edgeAgent
启动的模块实例都有对应的孪生模块module twin
, 保存在Azure IoT Hub
的一个json
文档。在Azure IoT Hub
中,模块实例和module twin
通过模块标识相关联。在Azure IoT Hub
方案的设计中,module twin
和device twin
的概念设计是一摸一样的,唯一的不同是当我们使用Azure IoT SDK
来实例化时,设备使用DeviceClient
, 但是模块使用ModuleClient
。
edgeAgent
是如何运行的
我们在之前有讨论,Azure IoT Edge Runtime
启动了很多服务,如果已经不记得了,可以返回到文章之前的介绍去,我们发现Azure IoT Edge Runtime
启动的时候,并没有一个服务叫edgeAgent
, 相反我们是以runtime的模块的形式运行edgeAgent
模块,那么这个模块是由哪个服务启动的呢?Azure IoT Edge Security Manager
服务来启动, 需要注意的是在1.2
版本中,这个服务主要指aziot-identity-service
, 加上module runtime
两部分组成,Azure IoT Edge Security Manager
的主要功能是:
- 启动
Azure IoT Edge
设备 - 服务以及设备认证
- 监控边缘设备
- 预置设备标识,管理设备
- 确保客户端服务代理的操作安全性。
该服务主要包含三个组件:
Edge Module Runtime
HSM
TPM
借用官方的一张图来说明一下关系:
另外需要注意的是edgeAgent
向Azure IoT Hub返回结果的一些状态码:
- 200
- 400 - 部署配置文件非法
- 417 - 该边缘设备还没有一个合法的部署配置文件,新创建的IoT Edge设备都会报这样的错误,根据我们之前的文档配置一下就好了。
- 412 - 部署配置文件的
schemaVersion
值非法 - 406 - 边缘设备不在线。
- 500 -
IoT Edge Runtime
出错。
什么是IoT Edge Hub
AKA edgeHub
, 也即是Azure IoT Edge Runtime
中的系统模块,这个模块专门负责通讯的管理,通讯管理也包含如下几个方面:
- 边缘设备和云之间的通讯。
- 边缘设备本地设备和设备,设备和模块,模块和云之间的通讯。
- 认证和授权
- 远程配置
- 向云发送运行时的遥测数据。
从这些功能上来看,Azure IoT Edge Hub
像是Azure IoT Hub
的本地翻版,它所起的作用是一个在设备或者模块和云之间的代理服务器,一个子设备或者模块可以通过连接到Edge Hub
和它是直接连接到Azure IoT Hub
一样。需要注意的是EdgeHub
不具备Azure IoT Hub
的所有功能, 它会委托一些功能给Azure IoT Hub
, 例如模块的认证等服务。
和云之间的通讯
如果需要减少Azure IoT Edge
设备和云之间的通讯带宽,建议在edge设备和Azure IoT Hub
之间的通讯使用AMQP
协议,这样可以使用AMQP
协议的连接复用特性来减少边缘设备和Azure IoT Hub
之间的连接数,默认情况下,EdgeHub
使用AMQP
协议连接Azure IoT Hub
, 对于通过edgeHub
连接的子设备或者模块,EdgeHub
通过逻辑连接的概念运行子设备或者模块连接到edgeHub
。
EdgeHub
能够决定是否连接到Azure IoT Hub
, 如果edgeHub
因为某些原因无法连接Azure IoT hub
, 它会将消息或者twin更新保存本地,等候连接恢复再同步到IoT Hub
。
本地通讯
我们前面介绍edgeHub
像是Azure IoT Hub
的本地版本,这就代表edgeHub
是一个本地的消息代理服务器的实现,同时它支持AMQP
和MQTT
协议。所以它在边缘设备本地实现了:
- device-to-module
- module-to-module
- device-to-device
等消息模式, 目前edgeHub
支持两种方式的消息代理机制:
- 和
Azure IoT Hub
里一样的消息路由 edgeHub
作为一个支持MQTT
协议的消息代理服务器,直接用于消息的传递。
关于这个部分,我们后面在使用edgeHub
进行IoT Edge module
开发的时候再来详细的介绍。
认证和授权
EdgeHub
会将这个部分委托给Azure IoT Hub
。
远程配置
EdgeHub
通过module Twin
来控制自己的行为和配置,包括:
- 路由配置
- 授权配置
MQTT Bridge
配置。
边缘设备遥测数据
这个部分是指IoT Edge
收集匿名的关于设备运行时以及系统模块的一些信息,上报给微软, 这些信息的作用是为了更好的改善产品,如果不希望上报可以采用如下的方式关闭(二选一):
- 设置系统模块
edgeAgent
的环境变量SendRuntimeQualityTelemetry
值为false
- 使用Azure Portal部署模块的时候去掉这个选项,如下图: