开发你自己的 IoT Edge 模块

适用于:IoT Edge 1.5 勾选标记 IoT Edge 1.5

重要

IoT Edge 1.5 LTS 是受支持的版本。 IoT Edge 1.4 LTS 于 2024 年 11 月 12 日终止。 如果使用的是早期版本,请参阅 Update IoT Edge

Azure IoT Edge 模块可以与其他 Azure 服务连接,帮助你实现更大的云数据管道。 本文介绍如何开发模块以与 IoT Edge 运行时和 IoT 中心通信,并进而与 Azure 云的其他服务通信。

IoT Edge 运行时环境

IoT Edge 运行时提供基础结构可集成多个 IoT Edge 模块的功能并将其部署到 IoT Edge 设备上。 任意程序都可打包为 IoT Edge 模块。 若要充分利用 IoT Edge 通信和管理功能,在模块中运行的程序可以使用 Azure IoT 设备 SDK 连接到本地 IoT Edge 中心。

将程序打包为 IoT Edge 模块

若要在IoT Edge设备上部署程序,必须首先对其进行容器化并使用 Docker 兼容的引擎运行它。 IoT Edge 使用 Moby(Docker 之后的开源项目)作为其 Docker 兼容的引擎。 你可以将你熟悉的用于 Docker 的相同参数传递给 IoT Edge 模块。 若要了解详细信息,请参阅如何配置 IoT Edge 模块的容器创建选项

使用 IoT Edge 中心枢纽

IoT Edge 中心提供两个主要功能:作为 IoT Hub 的代理以及本地通信功能。

从模块连接到 IoT Edge 中心

从模块连接到本地 IoT Edge 中心所涉及的连接步骤与任何客户端的连接步骤相同。 有关详细信息,请参阅连接到 IoT Edge 中心

若要通过 AMQP 使用IoT Edge路由,可以使用 Azure IoT SDK 中的 ModuleClient。 创建 ModuleClient 实例,将模块连接到设备上运行的IoT Edge中心,类似于 DeviceClient 实例如何将 IoT 设备连接到IoT Hub。 有关 ModuleClient 类及其通信方法的详细信息,请参阅首选 SDK 语言的 API 参考:C#CPythonJavaNode.js

IoT 中心基元

IoT 中心将模块实例视为与设备类似。 模块实例可以:

目前,模块无法接收云到设备的消息,也不能使用文件上传功能。

编写模块时,可以连接到 IoT Edge 中心并使用 IoT 中心基元,就像对设备应用程序使用 IoT 中心时一样。 IoT Edge模块和 IoT 设备应用程序的唯一区别在于,使用模块时,必须引用模块标识而不是设备标识。

设备到云消息

IoT Edge 模块可以通过充当本地代理的 IoT Edge 中心将消息发送到云,并将消息传播到云中。 为实现设备到云消息的复杂处理,IoT Edge 模块可以截获并处理其他模块或设备发送到其本地 IoT Edge 中心的消息。 然后,IoT Edge 模块会发送包含已处理数据的新消息。 通过这种方式,可以创建IoT Edge模块链来生成本地处理管道。

若要使用路由发送设备到云的遥测消息,请执行以下操作:

  • 使用 ModuleClient 类的 Azure IoT SDK。 每个模块具有输入和输出终结点。
  • 若要在模块的输出终结点上发送消息,请使用类中的 ModuleClient 发送消息方法。
  • 若要将此输出终结点发送到 IoT Hub,请在设备的 edgeHub 模块中设置路由。

若要使用路由处理消息,请执行以下操作:

  • 设置一个路由,以将来自另一终结点(模块或设备)的消息发送到模块的输入终结点。
  • 侦听您模块的输入端点上的消息。 每次返回新消息时,Azure IoT SDK 都会触发回调函数。
  • 使用此回调函数处理消息,并(可选)在模块终结点队列中发送新消息。

注意

有关声明路由的详细信息,请参阅 Learn 如何在 IoT Edge 中部署模块和建立路由。

孪生

Twins是IoT Hub提供的基元之一。 孪生是存储状态信息的 JSON 文档,包括元数据、配置和条件。 每个模块或设备都有自身的孪生体。

  • 若要使用 Azure IoT SDK 获取模块孪生,请调用 ModuleClient.getTwin 方法。
  • 若要使用 Azure IoT SDK 接收模块孪生修补程序,请实现回调函数,并使用 ModuleClient.moduleTwinCallback 方法注册该函数,以便每次出现孪生修补程序时触发回调函数。

接收直接方法

若要使用 Azure IoT SDK 接收直接方法,请实现回调函数,并使用 ModuleClient.methodCallback 方法注册回调函数,以便每次直接方法传入时触发回调函数。

语言和体系结构支持

IoT Edge 支持多种操作系统、设备体系结构和开发语言,因此你可以构建满足你的需求的方案。 使用此部分来了解用于开发自定义 IoT Edge 模块的选项。 可以在为 IoT Edge 准备开发和测试环境中详细了解每种语言的工具支持和要求。

Linux

对于下表中的所有语言,IoT Edge 支持 AMD64 和大多数 ARM64 Linux 容器的开发。 它还支持 Debian 11 ARM32 容器。

开发语言 开发工具
C Visual Studio Code
Visual Studio 2019/2022
C# Visual Studio Code
Visual Studio 2019/2022
Java Visual Studio Code
Node.js Visual Studio Code
Python Visual Studio Code

注意

对于跨平台编译(例如在 AMD64 开发计算机上编译 ARM32 IoT Edge 模块),必须将开发计算机配置为在与IoT Edge模块匹配的目标设备体系结构上编译代码。 有关目标设备体系结构的详细信息,请参阅 教程:使用 Visual Studio Code 开发 Azure IoT Edge 模块

Windows操作系统

Microsoft不再支持Windows容器。 建议使用 IoT Edge for Linux on Windows 在 Windows 设备上运行 IoT Edge。

模块安全性

在开发模块时考虑安全性。 若要详细了解如何保护模块,请参阅 Docker 引擎安全性

为了帮助提高模块安全性,IoT Edge 会默认禁用一些容器功能。 可以根据需要重写默认值,以便为模块提供特权功能。

允许提升 Docker 权限

在IoT Edge设备上的配置文件中,名为 allow_elevated_docker_permissions 的参数控制提升的 Docker 权限。 设置为 true 时,此标志授予在--privileged中 Docker HostConfig 字段中定义的CapAdd标志和任何其他功能。

注意

目前,此标志默认 为 true ,它授予对部署的特权权限。 将此标志设置为 false 以提高设备安全性。

启用 CAP_CHOWN 和 CAP_SETUID

默认情况下会禁用 Docker 功能 CAP_CHOWN 和 CAP_SETUID。 这些功能可以写入主机设备上的安全文件,并可能获得根访问权限。

如果需要这些功能,请在容器创建选项中使用 CapADD 手动重新启用这些功能。

后续步骤