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.

Arquitectura de Azure Event Grid

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 escribirá los mensajes en formato codificado de 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.

Limitaciones de los eventos de dispositivo conectado y dispositivo desconectado

Eventos de estado del dispositivo

Los eventos de estado de conexión de dispositivos 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.

  • En el caso de los dispositivos que se conectan mediante los SDK de Azure IoT, Java, Node o Python con el protocolo MQTT, tendrán estados de conexión enviados automáticamente.
  • Para los dispositivos que se conectan mediante los SDK de Azure IoT, Java, Node o Python con el protocolo AMQP, se debe crear un vínculo de nube a dispositivo para reducir cualquier retraso en los estados de conexión precisos.
  • En el caso de los dispositivos que se conectan mediante el SDK de Azure IoT de .NET con el protocolo MQTT o AMQP, no se enviará un evento de dispositivo conectado hasta que se envíe o reciba un mensaje inicial de dispositivo a nube o de nube a dispositivo.
  • Fuera de los SDK de Azure IoT, en MQTT estas operaciones equivalen a las operaciones SUBSCRIBE o PUBLISH en los temas de mensajería correspondientes. Con AMQP, equivalen a adjuntar o transferir un mensaje en las rutas de acceso al vínculo adecuadas.

Intervalo de estado del dispositivo

IoT Hub no informa de cada acción de conexión y desconexión del dispositivo individual, sino que publica el estado de conexión actual tomado en una instantánea periódica de 60 segundos. Si se recibe el mismo evento de estado de conexión con diferentes números de secuencia o eventos de estado de conexión distintos, quiere decir que se ha producido un cambio en el estado de conexión del dispositivo durante el período de 60 segundos. imagen

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