通过使用事件网格触发操作来响应 IoT 中心事件

通过将 Azure IoT 中心与 Azure 事件网格进行集成,使你可以向其他服务发送事件通知,并触发下游流程。 将商业应用程序配置为侦听 IoT 中心事件,以便能够以可靠、可缩放且安全的方式对关键事件作出反应。 例如,生成一个应用程序来更新数据库、创建工作票证,并在每当有新的 IoT 设备注册到 IoT 中心时,发送一封电子邮件通知。

Azure 事件网格是一种完全托管的事件路由服务,使用发布-订阅模型。 事件网格包含对 Azure 服务(如 Azure FunctionsAzure 逻辑应用)的内置支持,还可使用 Webhook 向非 Azure 服务传递事件警报。 有关受事件网格支持的事件处理程序的完整列表,请参阅 Azure 事件网格简介

Diagram that shows Azure Event Grid architecture.

区域可用性

事件网格集成适用于支持事件网格的区域中的 IoT 中心。 有关区域的最新列表,请参阅可用产品(按区域)

事件类型

IoT 中心将发布以下事件类型:

事件类型 说明
Microsoft.Devices.DeviceCreated 当设备注册到 IoT 中心时发布。
Microsoft.Devices.DeviceDeleted 当设备从 IoT 中心删除时发布。
Microsoft.Devices.DeviceConnected 当设备连接到 IoT 中心时发布。
Microsoft.Devices.DeviceDisconnected 当设备与 IoT 中心断开连接时发布。
Microsoft.Devices.DeviceTelemetry 将设备遥测消息发送到 IoT 中心时发布。

使用 Azure 门户或 Azure CLI 配置从每个 IoT 中心发布的事件。 例如,请尝试学习教程使用逻辑应用发送关于 Azure IoT 中心事件的电子邮件通知

事件架构

IoT 中心事件包含响应设备生命周期中更改所需的全部信息。 可通过检查 eventType 属性是否以“Microsoft.Devices”开头来标识 IoT 中心事件。 有关如何使用事件网格事件属性的详细信息,请参阅事件网格事件架构

设备已连接架构

以下示例显示了设备已连接事件的架构:

[{  
  "id": "f6bbf8f4-d365-520d-a878-17bf7238abd8",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceConnected",
  "eventTime": "2018-06-02T19:17:44.4383997Z",
  "data": {
      "deviceConnectionStateEventInfo": {
        "sequenceNumber":
          "000000000000000001D4132452F67CE200000002000000000000000000000001"
      },
    "hubName": "egtesthub1",
    "deviceId": "LogicAppTestDevice",
    "moduleId" : "DeviceModuleID",
  }, 
  "dataVersion": "1",
  "metadataVersion": "1"
}]

设备遥测架构

设备遥测消息必须采用有效的 JSON 格式,并且在消息系统属性中将 contentType 设置为 application/json,将 contentEncoding 设置为 UTF-8。 这两个属性都不区分大小写。 如果未设置内容编码,则 IoT 中心将以 base 64 编码格式写入消息。

在通过选择终结点作为事件网格将设备遥测事件发布到事件网格之前,可以扩充设备遥测事件。 有关详细信息,请参阅消息扩充

以下示例显示了设备遥测事件的架构:

[{  
  "id": "9af86784-8d40-fe2g-8b2a-bab65e106785",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceTelemetry",
  "eventTime": "2019-01-07T20:58:30.48Z",
  "data": {
      "body": {
          "Weather": {
              "Temperature": 900
            },
            "Location": "USA"
        },
        "properties": {
            "Status": "Active"
        },
        "systemProperties": {
          "iothub-content-type": "application/json",
          "iothub-content-encoding": "utf-8",
          "iothub-connection-device-id": "d1",
          "iothub-connection-auth-method": "{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
          "iothub-connection-auth-generation-id": "123455432199234570",
          "iothub-enqueuedtime": "2019-01-07T20:58:30.48Z",
          "iothub-message-source": "Telemetry"
        }
  },
  "dataVersion": "",
  "metadataVersion": "1"
}]

设备创建架构

以下示例显示了设备创建事件的架构:

[{
  "id": "56afc886-767b-d359-d59e-0da7877166b2",
  "topic": "/SUBSCRIPTIONS/<subscription ID>/RESOURCEGROUPS/<resource group name>/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/<hub name>",
  "subject": "devices/LogicAppTestDevice",
  "eventType": "Microsoft.Devices.DeviceCreated",
  "eventTime": "2018-01-02T19:17:44.4383997Z",
  "data": {
    "twin": {
      "deviceId": "LogicAppTestDevice",
      "etag": "AAAAAAAAAAE=",
      "deviceEtag":"null",
      "status": "enabled",
      "statusUpdateTime": "0001-01-01T00:00:00",
      "connectionState": "Disconnected",
      "lastActivityTime": "0001-01-01T00:00:00",
      "cloudToDeviceMessageCount": 0,
      "authenticationType": "sas",
      "x509Thumbprint": {
        "primaryThumbprint": null,
        "secondaryThumbprint": null
      },
      "version": 2,
      "properties": {
        "desired": {
          "$metadata": {
            "$lastUpdated": "2018-01-02T19:17:44.4383997Z"
          },
          "$version": 1
        },
        "reported": {
          "$metadata": {
            "$lastUpdated": "2018-01-02T19:17:44.4383997Z"
          },
          "$version": 1
        }
      }
    },
    "hubName": "egtesthub1",
    "deviceId": "LogicAppTestDevice"
  },
  "dataVersion": "1",
  "metadataVersion": "1"
}]

警告

与设备创建事件关联的孪生数据是默认配置,在新建设备中,不应依赖孪生数据来获取实际的 authenticationType 和其他设备属性。 对于新建设备中的 authenticationType 和其他设备属性,请使用 Azure IoT SDK 中提供的注册表管理器 API。

有关各属性的详细说明,请参阅 IoT 中心的 Azure 事件网格事件架构

筛选事件

事件网格启用了基于事件类型、主题和数据内容的筛选。 创建事件网格订阅时,可以选择订阅所选择的 IoT 事件。

  • 事件类型:有关 IoT 中心事件类型列表,请参阅事件类型
  • 主题:对于 IoT 中心事件,主题为设备名称。 主题采用 devices/{deviceId} 格式。 可基于“开头为”(前缀)和“结尾为”(后缀)匹配来筛选主题。 该筛选器使用 AND 运算符,以便将含有与前缀和后缀都匹配的使用者的事件传送给订阅方。
  • 数据内容:IoT 中心使用消息格式填充数据内容。 可选择基于遥测消息的内容传送哪些事件。 相关示例,请参阅高级筛选。 若要对遥测消息正文进行筛选,必须在消息系统属性中将 contentType 设置为 application/json,将 contentEncoding 设置为 UTF-8。 这两个属性都不区分大小写。

对于设备遥测事件,IoT 中心将基于订阅创建名为 RouteToEventGrid 的默认消息路由。 要在发送遥测数据之前筛选消息,请更新路由查询

设备连接状态事件的限制

设备连接和设备断开连接事件适用于使用 MQTT 或 AMQP 协议连接的设备,或者通过 WebSocket 使用这些协议之一进行连接的设备。 仅使用 HTTPS 发出的请求不会触发设备连接状态通知。

若要了解如何使用事件网格监视设备状态,请参阅监视设备连接状态

设备连接状态间隔

IoT 中心尝试报告每个设备连接状态更改事件,但某些事件可能会丢失。 IoT 中心至少会报告相隔 60 秒发生的连接状态更改事件。 此行为可能会导致多种结果,例如报告多个设备连接事件,但它们之间没有设备断开连接事件。

使用事件的提示

处理 IoT 中心事件的应用程序应遵循以下建议的操作:

  • 可以配置多个订阅将事件路由至同一事件处理程序,因此不可假定事件均来自某个特定的源。 始终通过检查消息主题,保证事件来自预期的 IoT 中心。
  • 请勿假定所接收的事件均为预期的类型。 在处理消息前,总是先检查 eventType。
  • 消息可能不按顺序到达,或者延迟达到。 对于设备已创建或设备已删除事件,请使用 ETag 字段来了解对象的信息是否是最新的。

后续步骤