使用 IoT 中心消息路由将从设备到云的消息发送到 Azure 服务

消息路由使你能够以自动、可缩放以及可靠的方式将消息从设备发送到云服务。 消息路由可用于:

  • 将设备遥测消息和事件发送到内置终结点和自定义终结点。 可路由的事件包括设备生命周期事件、设备孪生更改事件、数字孪生更改事件和设备连接状态事件。

  • 应用丰富查询以在路由数据之前对其进行筛选。 消息路由允许你查询消息属性和消息正文以及设备孪生标记和设备孪生属性。 有关详细信息,请参阅消息路由中的查询

IoT 中心为所有设备到云的消息传送定义了格式,以便实现跨协议互操作性。 有关详细信息,请参阅创建和读取 IoT 中心消息

注意

本文中提到的某些功能(例如云到设备消息传递、设备孪生、设备管理)仅在 IoT 中心的标准层中提供。 有关 IoT 中心基本层和标准/免费层的详细信息,请参阅选择适合你的解决方案的 IoT 中心层

路由终结点

每个 IoT 中心都有一个默认的路由终结点(名为消息/事件),此终结点与事件中心兼容。 还可创建指向 Azure 订阅中其他服务的自定义终结点。

IoT 中心目前支持以下用于消息路由的终结点:

  • 内置终结点
  • 存储容器
  • 服务总线队列
  • 服务总线主题
  • 事件中心
  • Cosmos DB(预览版)

有关其中每个终结点的详细信息,请参阅IoT 中心终结点

每个消息都路由到其路由查询匹配的所有终结点,这意味着可以将消息路由到多个终结点。 但是,如果某条消息与多个路由匹配,而这些路由指向同一终结点,则 IoT 中心仅向该终结点传递一次消息。

IoT 中心需要这些服务终结点的写入权限,以便使用消息路由。 如果通过 Azure 门户配置终结点,则为你添加必要权限。 如果使用 PowerShell 或 Azure CLI 配置终结点,则需提供写入访问权限。

要了解如何创建终结点,请参阅以下文章:

请确保将服务配置为支持预期吞吐量。 例如,如果使用事件中心作为自定义终结点,则必须为该事件中心配置吞吐量单位,以便它可以处理你计划通过 IoT 中心消息路由发送的事件流入量。 同样,使用服务总线队列作为终结点时,必须配置最大大小,以确保队列可以容纳所有流入的数据,直到它被使用者传出。 在首次配置 IoT 解决方案时,可能需要监视其他终结点,并针对实际负载进行任何必要的调整。

如果自定义终结点具有防火墙配置,请考虑使用 Microsoft 受信任的第一方例外情况

路由到另一个订阅中的终结点

如果终结点资源与 IoT 中心位于不同的订阅中,则你需要在创建自定义终结点之前将 IoT 中心配置为受信任的 Microsoft 服务。 创建自定义终结点时,请将“身份验证类型”设置为用户分配的标识。

有关详细信息,请参阅从 IoT 中心到其他 Azure 资源的出口连接

路由查询

IoT 中心消息路由提供了一种查询功能,支持先筛选数据,再将其路由到终结点。 所配置的每个路由查询包含以下属性:

属性 说明
Name 用于标识查询的唯一名称。
Source 要处理的数据流的来源。 例如,设备遥测。
条件 针对消息应用程序属性、系统属性、消息正文、设备孪生标记和设备孪生属性运行的路由查询的查询表达式,用于确定该查询是否是终结点的匹配项。
终结点 IoT 中心将匹配查询的消息发送到的终结点的名称。 建议所选终结点与 IoT 中心位于同一区域。

一条消息可能与多个路由查询中的条件匹配,在这种情况下,IoT 中心会将该消息传递到与每个匹配查询关联的终结点。 IoT 中心还会自动删除重复的消息传递,因此如果消息与具有相同目标的多个查询匹配,仅将其写入该目标位置一次。

有关详细信息,请参阅 IoT 中心消息路由查询语法

读取已路由的数据

使用以下文章了解如何从终结点读取消息。

回退路由

回退路由将任何现有路由上不满足查询条件的所有消息发送到与事件中心兼容的内置终结点(消息/事件)。 如果已启用消息路由,则可以启用此回退路由功能。 在创建一个路由后,数据将停止流向内置终结点,除非创建了到该终结点的路由。 如果没有到内置终结点的路由,并且已启用回退路由,则仅将与路由上的任何查询条件都不匹配的消息发送到内置终结点。 即使已删除所有现有路由,也必须启用回退路由功能才能接收内置终结点处的所有数据。

可以在 Azure 门户的“消息路由”边栏选项卡中启用或禁用回退路由。 还可以将 Azure 资源管理器用于 FallbackRouteProperties,以将自定义终结点用于回退路由。

非遥测事件

除了设备遥测之外,消息路由还支持发送非遥测事件,包括:

  • 设备孪生更改事件
  • 设备生命周期事件
  • 设备作业生命周期事件
  • 数字孪生体更改事件
  • 设备连接状态事件

例如,如果使用数据源创建一个设置为到“设备孪生更改事件”的路由,IoT 中心会将消息发送到包含设备孪生更改的终结点。 同样,如果创建路由时将数据源设置为设备生命周期事件,IoT 中心会发送一条消息,指示设备或模块已删除还是已创建。 有关设备生命周期事件的详细信息,请参阅设备和模块生命周期通知

IoT 中心还集成了 Azure 事件网格来发布设备事件以支持基于这些事件的工作流的实时集成和自动化。 请参阅消息路由和事件网格之间的主要区别来了解哪种更适合你的方案。

设备连接状态事件的限制

设备连接状态事件适用于使用 MQTT 或 AMQP 协议进行连接的设备,或者通过 WebSocket 使用这些协议之一进行连接的设备。 仅使用 HTTPS 发出的请求不会触发设备连接状态通知。 若要让 IoT 中心开始发送设备连接状态事件,在打开连接后,设备必须调用云到设备的接收消息操作或设备到云的发送遥测数据操作。 在 Azure IoT SDK 之外,在 MQTT 中,这些操作相当于对相应的消息主题的 SUBSCRIBE 或 PUBLISH 操作。 通过 AMQP,这些操作相当于在相应的链接路径上附加或传输消息。 有关详细信息,请参阅以下文章:

IoT 中心不报告每个单独的设备连接和断开连接事件,而是发布在定期的 60 秒快照时获取的当前连接状态。 接收具有不同序列号或不同连接状态事件的相同连接状态事件意味着设备连接状态在 60 秒时段内发生了变化。

测试路由

在创建新路由或编辑现有路由时,应通过示例消息来测试路由查询。 可以测试单个路由或一次测试所有路由,并且在测试期间,不会有消息被路由到终结点。 可以使用 Azure 门户、Azure 资源管理器、Azure PowerShell 和 Azure CLI 来进行测试。 测试结果有助于确定示例消息是否与查询相匹配,或者测试是否因为示例消息或查询语法错误而无法运行。 若要了解详细信息,请参阅测试路由测试所有路由

延迟

路由设备到云遥测消息时,在创建第一个路由后,端到端延迟略微增大。

在大多数情况下,延迟的平均增量小于 500 毫秒。 但是,你体验到的延迟可能会有所不同,并且可能会更高,具体取决于你的 IoT 中心和解决方案体系结构的层级。 可以使用路由:消息/事件的消息延迟或 d2c.endpoints.latency.builtIn.events IoT 中心指标来监视延迟。 在创建第一个路由后创建或删除任何路由不会影响端到端延迟。

监视和故障排除

IoT 中心提供了多个与路由和终结点相关的指标,使你能够大致了解你的中心的运行状况和已发送的消息数。 还可以使用 IoT 中心资源日志中的路由类别,跟踪发生在路由查询和终结点运行状况评估期间的由 IoT 中心察觉到的错误。 若要详细了解如何使用 IoT 中心的指标和资源日志,请参阅监视 Azure IoT 中心

可以使用 REST API Get Endpoint Health 获取终结点的运行状况状态。

通过路由故障排除指南获取更多详细信息以及对路由故障排除的支持。