你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

开发你自己的 IoT Edge 模块

适用于:“是”图标 IoT Edge 1.1 其他版本:IoT Edge 1.3IoT Edge 1.4

适用于:IoT Edge 1.3 复选标记 IoT Edge 1.3 IoT Edge 1.4 复选标记 IoT Edge 1.4 其他版本:IoT Edge 1.1

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 模块链来构建本地处理管道。

若要使用路由发送设备到云的遥测消息,请使用 Azure IoT SDK 的 ModuleClient。 使用 Azure IoT SDK 时,每个模块都具有模块输入和输出终结点的概念。 使用 ModuleClient.sendMessageAsync 方法,它会在模块的输出终结点上发送消息。 然后在 edgeHub 中配置路由,以将此输出终结点发送到 IoT 中心。

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

孪生

孪生体是 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 和 ARM32 Linux 容器的开发。

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

注意

对于跨平台编译,例如在 AMD64 开发计算机上编译 ARM32 IoT Edge 模块,需要配置开发计算机,以便在与 IoT Edge 模块匹配的目标设备架构上编译代码。 有关详细信息,请参阅在远程设备上生成和调试 IoT Edge 模块,以配置开发计算机以在与 IoT Edge 模块匹配的目标设备架构上编译代码。

此外,公共预览版中提供了对 ARM64 Linux 容器的支持。 有关详细信息,请参阅在 Visual Studio Code(预览版)中开发和调试 ARM64 IoT Edge 模块

Windows

对于下表中的所有语言,IoT Edge 支持 AMD64 Windows 容器的开发。

开发语言 开发工具
C Visual Studio 2017/2019
C# Visual Studio Code(无调试功能)
Visual Studio 2017/2019

IoT Edge 1.1 LTS 是最后一个支持 Windows 容器的发布通道。 从版本 1.2 开始,将不再支持 Windows 容器。

有关通过 Windows 容器进行开发的信息,请参阅本文的 IoT Edge 1.1 版本。

模块安全性

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

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

允许提升的 Docker 权限

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

注意

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

启用 CAP_CHOWN 和 CAP_SETUID

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

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

后续步骤

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

使用 Visual Studio 开发适用于 IoT Edge 的 C# 模块

使用 Visual Studio Code 开发适用于 IoT Edge 的模块

了解和使用 Azure IoT 中心 SDK