本文为计划将物联网 (IoT) 解决方案迁移到 Azure 的架构师、开发人员和 IT 人员提供指导。 本指南将审视与以下 IoT 体系结构层相关的问题:
- 设备和网关
- 引入和通信
- 边缘处理和分析
- 其他必要的层
最佳做法和建议与架构完善的 IoT 框架保持一致。 有关详细信息,请参阅 Microsoft Azure 架构良好的框架。
若要详细了解迁移前评估并发现常见策略,请参阅 Azure IoT 迁移的 IoT 解决方案最佳做法。
体系结构
将 IoT 解决方案迁移到 Azure 的第一步是了解 Azure IoT 服务。 本文和此图介绍了 IoT 解决方案常用的 Azure 组件和服务,但没有一个解决方案可使用所有这些组件。 有关关键组件和此参考体系结构的详细信息,请参阅 Azure IoT 参考体系结构。
下载此体系结构的 Visio 文件。
组件
Azure IoT 解决方案可以包含以下组件:
- Azure IoT SDK
- Azure RTOS
- Azure Sphere
- Azure IoT Edge
- Azure IoT 中心
- Azure 设备预配服务
- Azure 流分析
- HDInsight Spark 和 Storm
- Azure 数据资源管理器
- Azure 机器学习
- Azure Databricks
将 IoT 解决方案迁移到 Azure 时的注意事项
Azure IoT 解决方案涉及:
- “物”,通常为生成数据的设备
- 根据数据形成的“见解”
- 基于见解执行的“操作”
例如,电机发送温度数据。 使用此数据可以评估电机是否按预期运行。 使用有关电机性能的见解来确定其维护计划的优先级。 有关详细信息,请参阅 Azure IoT 参考体系结构。
在迁移到 Azure Iot 的过程中,对于你必须了解如何迁移的主要组件,主要要素如下:
设备
若要迁移,需要在 IoT 中心内创建设备,根据需要对其进行修改,并规划身份验证。
在 IoT 中心内迁移和重新创建设备
根据 IoT 解决方案中的设备数量,可能需要一个批量过程才能在IoT 中心上创建设备。
可以创建应用程序来自动执行批量迁移,而无需让用户执行手动操作。 首先,将与当前解决方案相关的设备元数据映射到 Azure IoT 支持的设备元数据。 对于服务迁移或服务等效,请考虑以下要素:
请参考下表:
其他提供程序 | Azure IoT |
---|---|
IoT 设备 | 设备(ID,名称) |
设备属性 | 成对孪生(标签) |
设备配置 | 设备孪生(所需属性) |
设备状态 | 设备孪生(报告的属性) |
CA 证书 | CA 证书(Azure Iot 中心) |
设备标识(X509 证书) | 设备标识(X509 证书指纹) |
迁移应用程序从当前解决方案获取设备及其元数据的列表。 然后,迁移应用程序会使用适当的元数据映射在 IoT 中心 中创建和注册新设备。
以下示例介绍使用 IoT 中心 Service SDK 的控制台应用程序。 云提供商公开一个函数,用于通过 REST 服务获取设备列表。 首先,应用程序连接到当前的 IoT 服务,以使用 REST API 获取设备、标识、设备名称和其他元数据的列表。 存储设备数据,以防必须重新运行迁移过程。
应用程序获得设备列表后,会通过 IoT 中心服务 SDK 在 IoT 中心中创建设备。 有关如何在 IoT 中心上批量创建设备的详细信息,请参阅此示例。
数据流
控制台应用程序使用 REST API 连接到当前的 IoT 服务,以获取设备和元数据的列表。
(可选)应用程序存储设备信息。
控制台应用程序使用 IoT 中心 SDK 连接到 Azure IoT 中心,并批量创建设备。
可以在 Azure Functions、Azure 应用服务或控制台应用程序中托管应用程序。 在迁移结束时,请确保两个服务中的设备数量相同,并且迁移创建了所需的元数据。
了解设备如何与 Azure IoT 中心通信
每个 IoT 解决方案都不同。 要考虑的关键要素之一是在设备中实现的代码,通常称为固件。 云提供商通常支持两种机制将设备连接到用于连接和管理物联网设备的服务:REST API 和消息队列遥测数据传输 (MQTT)。 除了支持这两种机制外,Azure 还提供了一个 SDK 来丰富 IoT 解决方案提供的功能。
若要迁移 IoT 解决方案,请决定是否在以下方面进行更改:
Azure IoT 设备 SDK
Azure Iot Hub 提供 C#、Java、Node、C 和 Python 等常用语言的 SDK. 使用 SDK 构建在使用设备客户端或模块客户端的 Iot 设备上运行的应用程序。 这些应用程序将遥测数据发送到 IoT 中心,并可以从 IoT 中心接收消息、作业、方法或孪生更新。 有关不同语言的详细信息和示例,请参阅 Microsoft Azure IoT SDK。
IoT 中心允许设备使用以下协议进行设备端通信:
- MQTT
- 基于 WebSocket 的 MQTT
- 高级消息队列协议 (AMQP)
- 基于 WebSockets 的 AMQP
- HTTPS
若要了解这些协议如何支持特定的 IoT 中心功能,请参阅设备到云通信指南和云到设备通信指南。
使用 MQTT 或 HTTP 在没有 SDK 的情况下进行设备通信
可以使用 MQTT 或 HTTP 进行设备通信。
NTT Communications
如果设备使用 MQTT 与当前云提供商通信,则 Iot 中心使用 MQTT 协议直接支持通信。 有关详细信息,请参阅直接使用 MQTT 协议。
使用 MQTT 协议进行直接通信不支持匿名通信。 若要与 IoT 中心通信,请通过共享访问签名令牌或 X.509 证书对设备进行身份验证。 设备应用可以在 CONNECT
数据包中指定 Will
消息。 设备应用应该使用 devices/<device-id>/messages/events/
或 devices/<device-id>/messages/events/<property-bag>
作为 Will
主题名称,用于定义要作为遥测数据消息转发的 Will
消息。
此外,请考虑有关发送遥测数据“设备到云”和接收“云到设备”消息的支持主题。
Azure IoT 示例的 MQTT 示例演示了如何在不使用 Azure IoT SDK 的情况下连接消息并将其发送到 Azure IoT 中心。
HTTPS REST API
IoT 中心的 REST API 提供了对设备、消息和工作服务的编程访问权限。 还提供对资源提供程序的访问权限。 可以从在 Azure 中运行的 IoT 服务访问消息服务,或者直接通过 Internet 从任何可以发送 HTTPS 请求和接收 HTTPS 响应的应用程序访问。 有关详细信息,请参阅 IoT 中心 REST。
Azure Iot Hub 支持 HTTP REST API,以防你的设备需要在没有 Iot Hub SDK 的情况下使用 HTTPS REST API。 可以使用此 API 发送和接收消息。 从设备使用这些 API 向 IoT 中心发送“设备到云”消息或从 IoT 集线器接收“云到设备”消息。 所有任务操作都符合 HTTP/1.1 协议规范。 确保对这些资源发出的请求是安全的。 有关详细信息,请参阅设备。
端点
设备代码中的一个关键元素是 IoT 服务的终结点或 URL。 IoT 设备应连接到某个终结点,该终结点对设备进行身份验证、接收遥测数据并允许双向通信。 在 Azure 上创建 IoT 中心服务时,会生成一个终结点。 默认情况下,IoT 中心的 DNS 名称类似于以下模式:{your iot hub name}.azure-devices.net
. 有关详细信息,请参阅 IoT 中心终结点。
身份验证
将 IoT 解决方案迁移到 Azure 时,需要考虑的一个关键要素是身份验证。 Azure IoT 中心支持以下身份验证方法:
-
借助 X.509 CA 功能,可以使用证书颁发机构 (CA) 在 IoT 中心进行设备身份验证。 X.509 证书极大地简化了初始设备登记过程,以及设备制造期间的供应链后勤。 有关详细信息,请参阅了解如何在 IoT 中使用 X.509 CA 证书。
-
对称密钥对于设备和服务都是已知的。 密钥用于加密和解密双方之间发送的消息。 Azure Iot 支持基于共享访问签名令牌的对称密钥连接。 保护对称密钥的最佳方法是使用硬件安全模块。
-
TPM 可引用适用于安全存储用于对平台进行身份验证的密钥的标准,或者可引用用于与实现标准的模块交互的 I/O 接口。 TPM 的存在方式包括离散硬件、集成硬件、基于固件的模块或基于软件的模块。
椭圆曲线密码 (ECC) 服务器 TSL(公共预览版)。
分析你是否可以或应该继续使用当前设备凭据通过 Iot 中心进行身份验证。 验证当前 IoT 云提供商是否允许重新生成和导出 X.509 证书。 你可以在 IoT 中心或 Azure 部署规划服务等服务中实现证书。 可以使用当前的云提供商 REST API 创建应用程序来导出设备标识。
有关详细信息,请参阅 Azure IoT 部署的安全建议和 IoT 工作负载中的安全性。
迁移实现示例
此示例使用需要继续使用 JSON Web 令牌 (JWT) 令牌和 ECC 证书的设备。
如果当前解决方案中的设备使用 JWT 令牌,你可能希望继续使用令牌进行身份验证,因为设备中已经预先安装了令牌。 可以创建使用 Azure Iot 中心和 Azure Iot 中心设备预配服务的设备预配流。
在设备预配服务中创建单个注册,并分配 Azure 函数以使用公钥验证 JWT 令牌。 仅当验证 JWT 令牌时,函数才会返回分配给设备的 IoT 中心。 然后,设备预配服务将凭据返回到设备。
这样,设备就会在预配期间发送对称密钥和已签名的 JWT 令牌。 然后,设备使用对称密钥来维护连接和传输遥测数据。
数据流
- 设备将使用 ECC 私钥签名的注册对称密钥和 JWT 令牌发送到 Azure IoT 中心设备配置服务。 请参阅此 IoT 迁移示例。
- 设备预配服务验证对称密钥,并使用 HTTP 触发器将预配有效负载发送到函数。
- Azure 函数应用从安全存储(例如 Azure 密钥保管库)获取公钥。
- 函数应用使用公钥验证 JWT 令牌、验证内容并返回链接的
iotHubHostName
。 有关详细信息,请参阅此示例。 - 设备预配服务使用对称密钥在 IoT 中心中注册新设备。
- 设备配置服务返回 IoT 中心设备连接详细信息。
- 设备代码使用连接详细信息连接到 Iot Hub 并开始发送消息。
要获取实现该解决方案的示例代码,请参阅使用 ECC 证书签名的 JWT 令牌连接到 Azure 中心。
设备管理
IoT 设备管理的关键概念包括:
- Device Provisioning
- 设备配置
- 设备监视和诊断
- 安全性
- 设备维护
- 生命周期终止
有关详细信息,请参阅使用 IoT 中心和应用管理 IoT 设备和检查设备配置最佳做法。
配置和控制设备
使用 IoT 中心设备孪生,可以在设备和云之间同步状态信息:
- 设备孪生所需属性从云发送到设备,以定义新的配置值。
- 设备孪生报告属性从设备发送到云,以传达设备状态。
- 设备孪生存储在云中。 可以随时查询设备孪生以获取设备状态。
- 例如,命令被发送到设备以执行某个操作,并且在某些情况下报告结果。
有两个选项可用于将命令从云发送到设备,具体取决于你实现的用例:
- IoT 中心直接方法对需要立即确认的命令使用同步通信。
- 云到设备的消息采用异步方式与设备通信。
将使用 HTTP 调用从云中调用命令。 可以通过 MQTT 从设备接收命令。 对于直接方法,设备可以直接使用 Azure IoT SDK 或 MQTT 协议来接收和响应命令。
将 IoT 解决方案迁移到 Azure 时,可以直接使用 Azure IoT SDK 或 MQTT 协议实现设备孪生和命令。 如果应用程序当前正在使用 MQTT 协议来配置设备,请使用 IoT 中心 MQTT 中转站支持的主题筛选器来更改设备订阅的主题:
MQTT 主题/设备 | MQTT 主题/云 | |
---|---|---|
遥测数据/“设备到云”消息 | 发布到 devices/<device-id>/messages/events/ 或 devices/<device-id>/messages/events/<property-bag> |
|
设备配置/所需属性 | 订阅 $iothub/twin/PATCH/properties/desired/# |
发布到 $iothub/twin/PATCH/properties/desired/?$version=<new-version> |
设备状态/报告的属性 | 发布到 $iothub/twin/PATCH/properties/reported/?$rid=<request-id> 以发送属性值。 订阅 $iothub/twin/res/# 以接收来自 IoT 中心的响应 |
发布到 $iothub/twin/res/<status>/?$rid=<request-id> 以将响应发送到设备 |
命令/直接方法 | 订阅 $iothub/methods/POST/# 并发布到 $iothub/methods/res/<status>/?$rid=<request-id> 以发送命令响应 |
发布到 $iothub/methods/POST/<method-name>/?$rid=<request-id> |
命令/“云到设备”消息 | 订阅 devices/<device-id>/messages/devicebound/# |
发布到 devices/<device-id>/messages/devicebound/ 或 devices/<device-id>/messages/devicebound/<property-bag> |
配置设备
设备预配是缩放解决方案、管理设备的生命周期以及创建 IoT 解决方案的关键。
考虑使用 IoT 中心设备预配服务 (DPS),这是 IoT 中心的帮助器服务,支持零接触、实时预配到适当的 IoT 中心,不需要人为干预。 此方法允许客户以安全、可缩放的方式预配数百万台设备。 有关详细信息,请参阅什么是 Azure IoT 中心设备预配服务?
使用 MQTT 加入具有设备预配服务的设备
你可以使用 Azure Iot SDK 或 MQTT 协议直接配置你的设备。 此示例使用 SDK。
数据流
- 创建共享访问签名令牌以使用设备配置服务对设备进行身份验证,并在设备中更新该令牌。
- 设备与设备预配服务连接。
- 设备将
CONNECT
消息发布到设备预配服务。 - 设备订阅 (
Subscribes
) 具有主题筛选器$dps/registrations/res/#
的设备预配服务,从而接收注册响应。 - 设备向主题
$dps/registrations/PUT/iotdps-register/?$rid=<request_id>
上的设备预配服务发布 (Publishes
) 注册消息。
- 设备将
- 设备供应服务对设备进行身份验证,注册设备并定义
deviceId
和 IoTHub 终结点。 - 设备获取
deviceId
和 IoT 中心终结点。- 设备在主题
$dps/registrations/GET/iotdps-get-operationstatus/?$rid=<request_id>&operationId=<operationId>
上发布 (Publishes
) 设备预配服务,以获取注册结果。 - 当注册完成时,
Subscriber
接收 DeviceID 和 Iot 中心终结点。
- 设备在主题
- 设备与 IoT 中心连接并发送遥测数据。
- 设备向 Iot 中心 MQTT 中转站发送一条
CONNECT
消息。 - 设备开始将遥测消息发布到 IoT 中心 MQTT 中转站。
- 设备向 Iot 中心 MQTT 中转站发送一条
重要
保留的主题用于设备预配服务预配过程。
使用不带 SDK 的 MQTT 在没有数据预配服务的情况下加入设备
本部分介绍某些保留主题的流程(用于使用 MQTT 来完成加入)以及无需 SDK 的设备预配服务。
数据流
- 在 Iot Hub 上为设备生成凭据,并在设备中更新这些凭据。 凭据是共享访问签名或 X.509 证书。
- 设备使用凭据向 IoT 中心 MQTT 中转站发布一条
CONNECT
消息。 设备必须知道deviceId
和 MQTT 中转站终结点。 - 设备开始将遥测消息发布到 IoT 中心 MQTT 中转站。
有关详细信息,请曾参阅使用 MQTT 协议与 IoT 中心通信。
云服务
作为迁移的一部分,可以与其他云服务和第三方服务集成,使用 Azure 进行数据存储和其他服务,并在 Azure 中创建应用程序。
使用 IoT 中心消息路由与其他云服务集成
从IoT 中心接收数据不是最终目标。 还需要转换、存储和分析消息。
IoT 中心有一个默认的内置终结点,此终结点与 Azure 事件中心兼容。 将订阅中的其他服务链接到 IoT 中心可创建自定义终结点来路由消息。 每条消息都路由到与它的路由查询匹配的所有终结点。 消息可以路由到多个终结点。 有关详细信息,请参阅路由终结点。
使用 Azure Functions for IoT 创建可快速部署的 IoT 解决方案。 无需提前预配固定基础结构容量。 借助此方法,可以生成可缩放的 IoT 应用程序,在此过程中该解决方案需要使用 IoT 设备运行业务逻辑。 使用 Azure 函数触发器来响应发送到 IoT 中心事件流的事件。
若要设置触发器,必须具有基础事件中心的读取访问权限。 触发函数时,传递给函数的消息充当字符串类型。 有关显示 Azure 函数与 Iot 中心之间集成的示例,请参阅 Azure 函数的 Azure IoT 中心绑定。
使用 Azure 服务进行数据存储和分析
Azure 为各种数据相关需求提供服务,包括文件存储和关系数据库(如 Azure SQL)和托管的开源数据库(如 Azure Database for PostgreSQL)。 Azure 还提供更专业的服务,例如 Azure 数据资源管理器和 Azure Cosmos DB。
Azure Synapse Analytics 提供数据仓库和数据湖功能的组合。 如果需要数据仓库,则创建一个 SQL 池,以便对结构化关系表运行 SQL 查询。 如果需要数据湖,则创建一个 Spark 池,以便使用 Spark 查询结构化和非结构化数据。
Azure Data Lake Storage 是在 Azure Blob 存储的基础之上构建而成。 其提供了新式数据湖所需的功能。 它兼容 Hadoop 和 Spark,后两者是用于执行数据分析的最常用开源软件系统。
Microsoft Purview 提供了一种统一数据治理解决方案,可以帮助管理和治理本地、多云和软件即服务 (SaaS) 数据。 通过自动化的数据发现、敏感数据分类和端到端数据世系,创建数据领域的整体最新映射。 使数据使用者能够访问有价值的可信数据管理。
用于在 Azure 上创建应用程序的选项
本文重点介绍迁移。 还有更多服务可供你考虑,本文未一一介绍。
Azure 数字孪生是一个服务型平台 (PaaS),可用于基于整个环境的数字模型创建孪生图。 这些环境包括建筑、工厂、农场、能源网络、铁路、体育场,甚至整个城市。 使用这些数字模型可获取洞察力,以推动产品改进、运营优化、成本降低和客户体验突破。 有关详细信息,请参阅什么是 Azure 数字孪生?和适用于 Azure 数字孪生的 3D 场景工作室入门。
Azure Kubernetes 服务 (AKS) 是基于开源 Kubernetes 系统的托管容器业务流程服务。 AKS 通过减少 Azure 的运营开销,简化了部署托管 Kubernetes 群集的过程。 作为一个托管的 Kubernetes 服务,Azure 可以自动处理运行状况监视和维护等关键任务。 由于 Azure 管理 Kubernetes 控制节点,因此你只需管理和维护代理节点。 有关如何将 Azure 服务与 Iot Hub 和 AKS 集成以构建 Iot 应用程序的信息,请参阅用于 COVID-19 检测和预防的 IoT 互联平台。 有关详细信息,请参阅 Azure Kubernetes 服务简介。
在体系结构设计的未来迭代中,请考虑这些服务。
作者
本文由 Microsoft 维护, 它最初是由以下贡献者撰写的。
主要作者:
- Chafia Aouissi | 高级 PM 经理
- Armando Blanco Garcia | 高级项目经理
- Valeria Naldi | 首席软件工程师
其他参与者:
- Emmanuel Bertrand | 首席 PM 经理
- |Peter Tuton | 首席云解决方案架构师
- Jomit Vaghela | 首席项目经理
- Ansley Yeo | 首席项目经理
若要查看非公开的 LinkedIn 个人资料,请登录到 LinkedIn。
后续步骤
以下是架构和快速入门的示例,可供了解如何使用 Azure 服务构建 IoT 解决方案。