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

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

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

Azure 事件网格体系结构

区域可用性

事件网格集成适用于支持事件网格的区域中的 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。 这两个属性都不区分大小写。

设备已连接和设备已断开连接事件的限制

设备状态事件

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

  • 对于使用 Java、Node 或 Python Azure IoT SDKMQTT 协议进行连接的设备,将自动发送连接状态。
  • 对于使用 Java、Node 或 Python Azure IoT SDKAMQP 协议进行连接的设备,应创建云到设备链接以减少准确连接状态中的任何延迟。
  • 对于使用 .NET Azure IoT SDKMQTTAMQP 协议进行连接的设备,在发送/接收初始设备到云或云到设备消息之前,不会发送设备连接事件。
  • 在 Azure IoT SDK 之外,在 MQTT 中,这些操作相当于对相应的消息主题的 SUBSCRIBE 或 PUBLISH 操作。 通过 AMQP,这些操作相当于在相应的链接路径上附加或传输消息。

设备状态间隔

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

使用事件的提示

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

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

后续步骤