开发你自己的 IoT Edge 模块

适用于: IoT Edge 1.5 复选标记 IoT Edge 1.5 IoT Edge 1.4 复选标记 IoT Edge 1.4

重要

IoT Edge 1.5 LTS 和 IoT Edge 1.4 LTS 是受支持的版本。 IoT Edge 1.4 LTS 的生命周期结束日期为 2024 年 11 月 12 日。 如果你使用的是较低的版本,请参阅更新 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 中心的代理和本地通信。

从模块连接到 IoT Edge 中心

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

若要使用基于 AMQP 的 IoT Edge 路由,可以使用 Azure IoT SDK 中的 ModuleClient。 创建一个 ModuleClient 实例,将模块连接到设备上运行的 IoT Edge 中心,其方式与 DeviceClient 实例将 IoT 设备连接到 IoT 中心类似。 有关 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 模块发送包含已处理数据的新消息。 因此,可以创建 IoT Edge 模块链来构建本地处理管道。

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

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

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

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

注意

若要详细了解如何声明路由,请参阅了解如何在 IoT Edge 中部署模块和建立路由

孪生

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

  • 若要使用 Azure IoT SDK 获取模块孪生,请调用 ModuleClient.getTwin 方法。

  • 若要使用 Azure IoT SDK 接收模块孪生补丁,请实现一个回调函数并将其注册到 Azure IoT SDK 中的 ModuleClient.moduleTwinCallback 方法,以便每次传入孪生补丁时都会触发该回调函数。

接收直接方法

若要使用 Azure IoT SDK 接收直接方法,请实现一个回调函数并将其注册到 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

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

模块安全性

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

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

允许提升的 Docker 权限

在 IoT Edge 设备上的配置文件中,有一个名为 allow_elevated_docker_permissions 的参数。 当设置为 true 时,此标志允许 --privileged 标志以及在容器创建选项的 Docker HostConfig 的 CapAdd 字段中定义的任何其他功能。

注意

目前,此标志默认为 true,允许部署向模块授予特权权限。 建议将此标志设置为 false,以提高设备安全性。

启用 CAP_CHOWN 和 CAP_SETUID

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

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

后续步骤

为 IoT Edge 准备开发和测试环境

使用 Visual Studio Code 开发 Azure IoT Edge 模块

了解和使用 Azure IoT 中心 SDK