Reacción a eventos de IoT Hub usando Event Grid para desencadenar acciones

Azure IoT Hub se integra con Azure Event Grid para poder enviar notificaciones de eventos a otros servicios y desencadenar procesos de descarga. Configure las aplicaciones empresariales de modo que escuchen eventos de IoT Hub para que pueda reaccionar ante eventos críticos de manera confiable, escalable y segura. Por ejemplo, cree una aplicación que actualice una base de datos, cree un vale de trabajo y envíe una notificación por correo electrónico cada vez que se registre un nuevo dispositivo IoT en el centro de IoT.

Azure Event Grid es un servicio de enrutamiento de eventos totalmente administrado que utiliza un modelo de publicación-suscripción. Event Grid tiene compatibilidad integrada para servicios de Azure, como Azure Functions y Azure Logic Apps, y puede proporcionar alertas de eventos a los servicios que no son de Azure mediante webhooks. Para obtener una lista completa de los controladores de eventos que Event Grid admite, vea una introducción a Azure Event Grid.

Para ver un vídeo sobre esta integración, consulte Integración de Azure IoT Hub con Azure Event Grid.

Diagram that shows Azure Event Grid architecture.

Disponibilidad regional

La integración de Event Grid está disponible en centros de IoT ubicados en las regiones donde se admite Event Grid. Para obtener la lista más reciente de regiones, consulte Productos disponibles por región.

Tipos de eventos

IoT Hub publica los siguientes tipos de eventos:

Tipo de evento Descripción
Microsoft.Devices.DeviceCreated Se publica cuando se registra un dispositivo en una instancia de IoT Hub.
Microsoft.Devices.DeviceDeleted Se publica cuando se elimina un dispositivo de una instancia de IoT Hub.
Microsoft.Devices.DeviceConnected Se publica cuando se conecta un dispositivo a una instancia de IoT Hub.
Microsoft.Devices.DeviceDisconnected Se publica cuando se desconecta un dispositivo de una instancia de IoT Hub.
Microsoft.Devices.DeviceTelemetry Se publica cuando se envía un mensaje de telemetría del dispositivo a un centro de IoT.

Use Azure Portal o la CLI de Azure para configurar qué eventos publicar desde cada instancia de IoT Hub. Por ejemplo, pruebe con el tutorial Envío de notificaciones por correo electrónico sobre eventos de Azure IoT Hub mediante Logic Apps.

Esquema del evento

Los eventos de IoT Hub contienen toda la información necesaria para responder a cualquier cambio que se produzca en el ciclo de vida del dispositivo. Puede identificar un evento de IoT Hub comprobando que la propiedad eventType empieza por Microsoft.Devices. Para más información sobre cómo usar las propiedades de eventos de Event Grid, vea el Esquema de eventos de Azure Event Grid.

Esquema de dispositivo conectado

En el ejemplo siguiente, se muestra el esquema de un evento de dispositivo conectado:

[{  
  "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"
}]

Esquema de telemetría de dispositivos

Los mensajes de telemetría del dispositivo deben estar en un formato JSON válido, el valor de contentType debe establecerse en application/json y contentEncoding establecerse en UTF-8 en las propiedades del sistema del mensaje. Ambas propiedades no distinguen mayúsculas de minúsculas. Si no está establecida la codificación del contenido, IoT Hub escribe los mensajes en formato codificado base 64.

Puede enriquecer los eventos de telemetría del dispositivo antes de que se publiquen en Event Grid; para ello, seleccione el punto de conexión como Event Grid. Para más información, consulte el artículo sobre el enriquecimiento de mensajes.

En el ejemplo siguiente, se muestra el esquema de un evento de telemetría del dispositivo:

[{  
  "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"
}]

Esquema de dispositivo creado

En el ejemplo siguiente, se muestra el esquema de un evento de dispositivo creado:

[{
  "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"
}]

Advertencia

Los datos gemelos asociados con un evento de creación de dispositivo son una configuración predeterminado y no deben usarse para propiedades authenticationType reales y otras propiedades del dispositivo en un dispositivo recién creado. Para ver authenticationType y otras propiedades de dispositivo en un dispositivo recién creado, use Register Manager API, que se proporciona en los SDK de Azure IoT.

Para obtener una descripción detallada de cada propiedad, consulte Esquema de eventos de Azure Event Grid para IoT Hub.

Filtrado de eventos

Event Grid permite filtrar por tipos de eventos, temas y contenido de datos. Al crear la suscripción de Event Grid, puede elegir suscribirse a eventos de IoT seleccionados.

  • Tipo de evento: para obtener la lista de tipos de eventos de IoT Hub, consulte tipos de eventos.
  • Asunto: en los eventos de IoT Hub, el asunto es el nombre del dispositivo. El asunto toma el formato devices/{deviceId}. Puede filtrar los temas en función de las coincidencias con Begins With (prefijo) y Ends With (sufijo). El filtro utiliza un operador AND, por lo que se entregan al suscriptor los eventos con un asunto que coincide con el prefijo y el sufijo.
  • Contenido de datos: el contenido de los datos se rellena mediante IoT Hub con el formato de mensaje. Puede elegir qué eventos se entregan en función del contenido del mensaje de telemetría. Para obtener ejemplos, consulte filtros avanzados. Para filtrar por el cuerpo del mensaje de telemetría, debe establecer contentType en application/json y contentEncoding en UTF-8 en las propiedades del sistema del mensaje. Ambas propiedades no distinguen mayúsculas de minúsculas.

En el caso de los eventos de telemetría del dispositivo, IoT Hub creará la ruta de mensaje predeterminada denominada RouteToEventGrid en función de la suscripción. Para filtrar los mensajes antes de enviar datos de telemetría, actualice la consulta de enrutamiento.

Limitaciones de los eventos de estado de conexión del dispositivo

Los eventos de dispositivo conectado y dispositivo desconectado están disponibles para los dispositivos que se conectan mediante el protocolo MQTT o AMQP, o mediante cualquiera de estos protocolos a través de WebSockets. Las solicitudes realizadas solo con HTTPS no desencadenarán notificaciones de estado de conexión de dispositivos.

Para obtener información sobre la supervisión del estado del dispositivo con Event Grid, consulte Supervisión del estado de conexión del dispositivo.

Intervalo del estado de conexión del dispositivo

IoT Hub intenta notificar cada evento de cambio de estado de conexión del dispositivo, pero es posible que algunos se pasen por alto. Como mínimo, IoT Hub notifica los eventos de cambio de estado de conexión que se producen con 60 segundos de diferencia entre sí. Este comportamiento puede conducir a resultados tales como múltiples eventos de conexión de dispositivos notificados sin eventos de desconexión de dispositivos entre ellos.

Sugerencias para consumir eventos

Las aplicaciones que controlan los eventos de IoT Hub deben seguir estas prácticas recomendadas:

  • Se pueden configurar varias suscripciones para enrutar los eventos al mismo controlador de eventos, por lo que no hay que asumir que los eventos proceden de un origen particular. Compruebe siempre el tema del mensaje para asegurarse de que se trata de la instancia de IoT Hub que está esperando.
  • No asuma que todos los eventos que recibe son del tipo de evento que espera. Compruebe siempre eventType antes de procesar el mensaje.
  • Los mensajes pueden llegar desordenados o después de un retraso. Utilice el campo de la etiqueta de entidad para saber si la información sobre los objetos está actualizada para los eventos de dispositivos creados o de dispositivos eliminados.

Pasos siguientes