Exportación de datos de IoT a Blob Storage

En este artículo se describe cómo configurar la exportación de datos para enviar datos al servicio Blob Storage.

Utilice esta característica para exportar continuamente los datos de IoT filtrados y enriquecidos desde su aplicación de IoT Central. La exportación de datos inserta los cambios casi en tiempo real en otras partes de la solución en la nube para su análisis y almacenamiento, y conocer los detalles de la ruta de acceso activa.

Por ejemplo, puede:

  • Exportar continuamente la telemetría, los cambios de propiedad, la conectividad del dispositivo, el ciclo de vida del dispositivo, el ciclo de vida de la plantilla de dispositivo y los datos del registro de auditoría en formato JSON casi en tiempo real.
  • Filtrar los flujos de datos para exportar los datos que coincidan con condiciones personalizadas.
  • Enriquecer los flujos de datos con valores personalizados y valores de propiedad del dispositivo.
  • Transforme los flujos de datos para modificar su forma y contenido.

Sugerencia

Cuando se activa la exportación de datos, solo se obtienen los datos a partir de ese momento. Para conservar más datos históricos, active la exportación de datos al principio. Para exportar manualmente datos de momentos en los que estaba desactivada la exportación de datos, consulte Empleo de la API de REST de IoT Central para consultar dispositivos.

Nota:

En algunas circunstancias, los mensajes pueden tardar hasta 60 segundos en exportarse. Este tiempo se mide desde cuando IoT Central recibe el mensaje del centro de IoT subyacente a cuando el mensaje se entrega al punto de conexión de destino.

Requisitos previos

Para usar las funciones de exportación de datos, debe tener el permiso de exportación de datos.

Para obtener información sobre cómo administrar las exportaciones de datos mediante la API REST de IoT Central, consulte Uso de la API REST de IoT Central para administrar las exportaciones de datos.

Configuración de un destino de exportación de Blob Storage

IoT Central exporta datos una vez por minuto, y cada archivo contiene el lote de cambios desde la exportación anterior. Los datos exportados se guardan en formato JSON. Las rutas de acceso predeterminadas a los datos exportados en la cuenta de almacenamiento son:

  • Telemetría: {container}/{app-id}/{partition_id}/{YYYY}/{MM}/{dd}/{hh}/{mm}/{filename}
  • Cambios de propiedad: {container}/{app-id}/{partition_id}/{YYYY}/{MM}/{dd}/{hh}/{mm}/{filename}

Para examinar los archivos exportados en Azure Portal, vaya al archivo y seleccione Editar blob.

Opciones de conexión

Los destinos de Blob Storage permiten configurar la conexión con una cadena de conexión o una identidad administrada.

Sugerencia

Si el destino de Blob Storage está protegido por un firewall, debe usar una identidad administrada para conectarse a él.

Las identidades administradas son más seguras porque:

  • No se almacenan las credenciales del recurso en una cadena de conexión en la aplicación IoT Central.
  • Las credenciales se vinculan automáticamente a la vigencia de la aplicación IoT Central.
  • Las identidades administradas rotan automáticamente sus claves de seguridad periódicamente.

Actualmente, IoT Central usa identidades administradas asignadas por el sistema.

Al configurar una identidad administrada, la configuración incluye un ámbito y un rol:

  • El ámbito define dónde puede usar la identidad administrada. Por ejemplo, puede usar un grupo de recursos de Azure como ámbito. En este caso, tanto la aplicación de IoT Central como el destino deben estar en el mismo grupo de recursos.
  • El rol define qué permisos se conceden a la aplicación de IoT Central en el servicio de destino. Por ejemplo, para que la aplicación de IoT Central envíe datos a un centro de eventos, la identidad administrada necesita la asignación de rol emisor de datos de Azure Event Hubs.

El siguiente vídeo proporciona información adicional sobre la identidad administrada asignada por el sistema:

Precaución

Para exportar a Blob Storage, no use el colaborador de la cuenta de almacenamiento como se muestra en el vídeo. Use el rol Colaborador de datos de Storage Blob en su lugar.

Creación de una instancia de Azure Blob Storage como destino

En este artículo se muestra cómo crear una identidad administrada con la CLI de Azure. También puede usar Azure Portal para crear una identidad administrada.

Si no tiene una cuenta de almacenamiento de Azure existente a la que exportar, ejecute el siguiente script en el entorno de Bash de Azure Cloud Shell. El script crea un grupo de recursos, una cuenta Azure Storage y un contenedor de blobs. A continuación, el script habilita la identidad administrada para la aplicación de IoT Central y asigna el rol que necesita para acceder a la cuenta de almacenamiento:

# Replace the storage account name with your own unique value.
SA=yourstorageaccount$RANDOM

# Replace the IoT Central app name with the name of your
# IoT Central application.
CA=your-iot-central-app

CN=exportdata
RG=centralexportresources
LOCATION=eastus

az group create -n $RG --location $LOCATION
SAID=$(az storage account create --name $SA --resource-group $RG --location $LOCATION --sku Standard_LRS --query "id" --output tsv)
az storage container create --account-name $SA --resource-group $RG --name $CN

# This assumes your IoT Central application is in the 
# default `IOTC` resource group.
az iot central app identity assign --name $CA --resource-group IOTC --system-assigned
PI=$(az iot central app identity show --name $CA --resource-group IOTC --query "principalId" --output tsv)

az role assignment create --assignee $PI --role "Storage Blob Data Contributor" --scope $SAID

az role assignment list --assignee $PI --all -o table

echo "Endpoint URI: https://$SA.blob.core.windows.net/"
echo "Container: $CN"

Puede obtener más información acerca de cómo crear nuevas cuentas de Azure Blob Storage o cuentas de almacenamiento de Azure Data Lake Storage v2. La exportación de datos solo puede escribir datos en cuentas de almacenamiento que admiten blobs en bloques. En la tabla siguiente se muestran los tipos de cuenta de almacenamiento compatibles conocidos:

Nivel de rendimiento Tipo de cuenta
Estándar Uso general V2
Estándar Uso general V1
Estándar Blob Storage
Premium Almacenamiento de blob en bloques

Para proteger aún más el contenedor de blobs y permitir solo el acceso desde servicios de confianza con identidades administradas, consulte Exportación de datos a un destino seguro en una instancia de Azure Virtual Network.

Para crear el destino de Blob Storage en IoT Central en la página Exportación de datos:

  1. Seleccione + Nuevo destino.

  2. Elija Azure Blob Storage como tipo de destino.

  3. Seleccione Identidad administrada asignada por el sistema como tipo de autorización.

  4. Especifique el URI del punto de conexión de la cuenta de almacenamiento y el nombre del contenedor, que distingue mayúsculas de minúsculas. Un URI de punto de conexión tiene el siguiente aspecto: https://contosowaste.blob.core.windows.net.

  5. Seleccione Guardar.

Si no ve los datos que llegan al servicio de destino, consulte Solución de problemas con las exportaciones de datos desde la aplicación de Azure IoT Central.

Configuración de una exportación de datos

Ahora que tiene un destino al que exportar los datos, configure la exportación de datos en su aplicación de IoT Central:

  1. Inicie sesión en su aplicación de IoT Central.

  2. En el panel izquierdo, seleccione Exportación de datos.

    Sugerencia

    Si no ve Exportación de datos en el panel izquierdo, no tiene permisos para configurar la exportación de datos en la aplicación. Hable con un administrador para configurar la exportación de datos.

  3. Seleccione + New export (+ Nueva exportación).

  4. Escriba un nombre para mostrar para la nueva exportación y asegúrese de que la exportación de datos está habilitada.

  5. Elija el tipo de datos para exportar. En la tabla siguiente se enumeran los tipos de exportación de datos compatibles:

    Tipo de datos Descripción Formato de datos
    Telemetría Exporte los mensajes de telemetría de los dispositivos casi en tiempo real. Cada mensaje exportado contiene todo el contenido del mensaje del dispositivo original, normalizado. Formato del mensaje de telemetría
    Cambios de la propiedad Exporte los cambios de las propiedades de dispositivos y la nube casi en tiempo real. En el caso de las propiedades de dispositivo de solo lectura, se exportan los cambios realizados en los valores notificados. En el caso de las propiedades de lectura y escritura, se exportan los valores notificados y deseados. Formato de los mensajes de cambio de propiedad
    Conectividad de dispositivos Exporte eventos de dispositivos conectados y desconectados. Formato de mensaje de conectividad del dispositivo
    Ciclo de vida del dispositivo Exporte los eventos registrados, eliminados, aprovisionados, habilitados, deshabilitados, displayNameChanged y deviceTemplateChanged. Formato de los mensajes de cambios del ciclo de vida de dispositivo
    Ciclo de vida de plantillas de dispositivo Exporte los cambios de plantilla de dispositivo publicados, incluidos los creados, actualizados y eliminados. Formato de los mensajes de cambios del ciclo de vida de plantilla de dispositivo
    Registros de auditoría Registros de actualizaciones iniciadas por el usuario en las entidades de la aplicación. Para obtener más información, vea Uso de registros de auditoría para realizar un seguimiento de la actividad en la aplicación de IoT Central. Formato de los mensajes del registro de auditoría
  6. Opcionalmente, agregue filtros para reducir la cantidad de datos exportados. Hay diferentes tipos de filtros disponibles para cada tipo de exportación de datos:

    Tipo de datos Filtros disponibles
    Telemetría
    • Filtrar por nombre de dispositivo, id. de dispositivo, plantilla de dispositivo y si el dispositivo está simulado
    • Filtrar el flujo para que solo contenga la telemetría que cumpla las condiciones de filtro
    • Filtrar el flujo para que solo contenga la telemetría de dispositivos con propiedades que coincidan con las condiciones de filtro
    • Filtrar el flujo para que solo contenga la telemetría que tenga propiedades de mensaje que cumplan la condición de filtro. Las propiedades del mensaje (también conocidas como propiedades de la aplicación) se envían en un contenedor de pares clave-valor en cada mensaje de telemetría. Para crear un filtro de propiedad de mensaje, escriba la clave de la propiedad de mensaje que busca y especifique una condición. Solo se exportarán los mensajes de telemetría con propiedades que coincidan con la condición de filtro especificada. Obtenga más información sobre las propiedades de aplicaciones en la documentación de IoT Hub.
    Cambios de la propiedad
    • Filtrar por nombre de dispositivo, id. de dispositivo, plantilla de dispositivo y si el dispositivo está simulado
    • Filtrar el flujo para que contenga solo los cambios de propiedad que cumplan las condiciones de filtro
    Conectividad de dispositivos
    • Filtrar por nombre de dispositivo, identificador de dispositivo, plantilla de dispositivo y si el dispositivo es simulado
    • Filtrar el flujo para que solo contenga los cambios de dispositivos con propiedades que coincidan con las condiciones de filtro
    Ciclo de vida del dispositivo
    • Filtrar por nombre de dispositivo, id. de dispositivo, plantilla de dispositivo y si el dispositivo está aprovisionado, habilitado o simulado
    • Filtrar el flujo para que solo contenga los cambios de dispositivos con propiedades que coincidan con las condiciones de filtro
    Ciclo de vida de plantillas de dispositivo
    • Filtrar por plantilla de dispositivo
    Registros de auditoría N/D
  7. Opcionalmente, puede enriquecer los mensajes exportados con metadatos adicionales de pares clave-valor. Están disponibles los enriquecimientos siguientes para los tipos de exportación de datos de telemetría, cambios de propiedad, conectividad de dispositivo y ciclo de vida de dispositivo:

    • Cadena personalizada: agrega una cadena estática personalizada a cada mensaje. Escriba cualquier clave y especifique cualquier valor de cadena.
    • Propiedad, que agrega a cada mensaje:
      • Metadatos del dispositivo, como el nombre del dispositivo, el nombre de la plantilla de dispositivo, si está habilitado, las organizaciones, si está aprovisionado y si es simulado.
      • La propiedad notificada de dispositivo actual o el valor de propiedad de la nube a cada mensaje. Si el mensaje exportado procede de un dispositivo que no tiene la propiedad especificada, no obtendrá el enriquecimiento.

Configure el destino de la exportación:

  1. Seleccione + Destino para agregar un destino que ya haya creado, o seleccione Crear uno nuevo.

  2. Para transformar los datos antes de exportarlos, seleccione + Transformar. Para más información, consulte Transformación de datos dentro de la aplicación de IoT Central para su exportación.

  3. Seleccione + Destino para agregar hasta cinco destinos a una única exportación.

  4. Cuando haya terminado de configurar la exportación, seleccione Guardar. Transcurridos unos minutos, los datos aparecen en sus destinos.

Supervisión de la exportación

En IoT Central, la página Exportación de datos permite comprobar el estado de las exportaciones. También puede usar Azure Monitor para ver cuántos datos está exportando y los errores de exportación. Puede acceder a las métricas de exportación y estado del dispositivo en los gráficos de Azure Portal mediante la API REST, consultas en PowerShell o la CLI de Azure. Actualmente, puede supervisar las siguientes métricas de exportación de datos en Azure Monitor:

  • Número de mensajes entrantes para exportar antes de que se apliquen los filtros
  • Número de mensajes que pasan a través de filtros
  • Número de mensajes exportados correctamente a destinos
  • Número de errores encontrados.

Para más información, consulte Supervisión del estado de la aplicación.

Formatos de datos

En las secciones siguientes se describen los formatos de los datos exportados:

Formato de los datos de telemetría

Cada mensaje exportado contiene un formato normalizado del mensaje completo que el dispositivo envió en el cuerpo del mensaje. El mensaje está en formato JSON y codificado como UTF-8. La información de los mensajes incluye:

  • applicationId: identificador de la aplicación de IoT Central.
  • messageSource: origen del mensaje: telemetry.
  • deviceId: el identificador del dispositivo que envió el mensaje de telemetría.
  • schema: el nombre y la versión del esquema de carga.
  • templateId: id. de la plantilla de dispositivo asignada a este dispositivo
  • enqueuedTime: hora a la que IoT Central recibió este mensaje.
  • enrichments: cualquier enriquecimiento configurado en la exportación.
  • module: el módulo IoT Edge que envió este mensaje. Este campo solo aparece si el mensaje provino de un módulo IoT Edge.
  • component: el componente que envió este mensaje. Este campo solo aparece si las funcionalidades enviadas en el mensaje se modelaron como un componente en la plantilla de dispositivo.
  • messageProperties: más propiedades que el dispositivo envió con el mensaje. A veces, estas propiedades se denominan propiedades de la aplicación. Puede encontrar más información en la documentación de IoT Hub.

Para Blob Storage, los mensajes se procesan por lotes y se exportan una vez por minuto.

En el ejemplo siguiente se muestra un mensaje de telemetría exportado:


{
    "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
    "messageSource": "telemetry",
    "deviceId": "1vzb5ghlsg1",
    "schema": "default@v1",
    "templateId": "urn:qugj6vbw5:___qbj_27r",
    "enqueuedTime": "2020-08-05T22:26:55.455Z",
    "telemetry": {
        "Activity": "running",
        "BloodPressure": {
            "Diastolic": 7,
            "Systolic": 71
        },
        "BodyTemperature": 98.73447010562934,
        "HeartRate": 88,
        "HeartRateVariability": 17,
        "RespiratoryRate": 13
    },
    "enrichments": {
      "userSpecifiedKey": "sampleValue"
    },
    "module": "VitalsModule",
    "component": "DeviceComponent",
    "messageProperties": {
      "messageProp": "value"
    }
}

Propiedades del mensaje

Los mensajes de telemetría tienen propiedades para los metadatos, así como para la carga de telemetría. El fragmento de código anterior muestra ejemplos de mensajes del sistema, como deviceId y enqueuedTime. Para obtener más información sobre las propiedades del mensaje del sistema, consulte Propiedades del sistema de los mensajes de IoT Hub D2C.

Puede agregar propiedades a los mensajes de telemetría si necesita agregar metadatos personalizados a los mensajes de telemetría. Por ejemplo, tiene que agregar una marca de tiempo cuando el dispositivo crea el mensaje.

En el fragmento de código siguiente se muestra cómo agregar la propiedad iothub-creation-time-utc al mensaje cuando se crea en el dispositivo:

Importante

El formato de esta marca de tiempo debe ser UTC sin información de zona horaria. Por ejemplo, 2021-04-21T11:30:16Z es válido y 2021-04-21T11:30:16-07:00 no lo es.

async function sendTelemetry(deviceClient, index) {
  console.log('Sending telemetry message %d...', index);
  const msg = new Message(
    JSON.stringify(
      deviceTemperatureSensor.updateSensor().getCurrentTemperatureObject()
    )
  );
  msg.properties.add("iothub-creation-time-utc", new Date().toISOString());
  msg.contentType = 'application/json';
  msg.contentEncoding = 'utf-8';
  await deviceClient.sendEvent(msg);
}

Formato de cambios de propiedades

Cada mensaje o registro representa los cambios en las propiedades del dispositivo y de la nube. La información del mensaje exportado incluye:

  • applicationId: identificador de la aplicación de IoT Central.
  • messageSource: origen del mensaje: properties.
  • messageType: cloudPropertyChange, devicePropertyDesiredChange o devicePropertyReportedChange.
  • deviceId: el identificador del dispositivo que envió el mensaje de telemetría.
  • schema: el nombre y la versión del esquema de carga.
  • enqueuedTime: hora a la que IoT Central detectó este cambio.
  • templateId: id. de la plantilla de dispositivo asignada a este dispositivo
  • properties: una matriz de propiedades que han cambiado que incluye los nombres de las propiedades y los valores que han cambiado. La información del componente y del módulo se incluye si la propiedad se modela dentro de un componente o un módulo de IoT Edge.
  • enrichments: cualquier enriquecimiento configurado en la exportación.

Para Blob Storage, los mensajes se procesan por lotes y se exportan una vez por minuto.

En el fragmento de código siguiente se muestra un mensaje de cambio de propiedad exportado a Blob Storage:

{
    "applicationId": "fb74969c-8682-4708-af01-33499a7f7d98",
    "messageSource": "properties",
    "deviceId": "Pepjmh1Hcc",
    "enqueuedTime": "2023-03-02T10:35:39.281Z",
    "enrichments": {},
    "messageType": "devicePropertyReportedChange",
    "schema": "default@v1",
    "templateId": "dtmi:azureiot:ddzig4ascxz",
    "properties": [
        {
            "component": "device_info",
            "name": "swVersion",
            "value": "12"
        },
        {
            "component": "device_info",
            "name": "osName",
            "value": "Android"
        },
        {
            "component": "device_info",
            "name": "processorArchitecture",
            "value": "arm64-v8a"
        },
        {
            "component": "device_info",
            "name": "processorManufacturer",
            "value": "unknown"
        }
    ]
}

Formato de los cambios de conectividad de dispositivos

Cada mensaje o registro representa un evento de conectividad de un único dispositivo. La información del mensaje exportado incluye:

  • applicationId: identificador de la aplicación de IoT Central.
  • messageSource: origen del mensaje: deviceConnectivity.
  • messageType: connected o disconnected.
  • deviceId: el id. del dispositivo que se ha cambiado.
  • schema: el nombre y la versión del esquema de carga.
  • templateId: id. de la plantilla de dispositivo asignada a este dispositivo
  • enqueuedTime: la hora a la que se produjo este cambio en IoT Central.
  • enrichments: cualquier enriquecimiento configurado en la exportación.

Para Blob Storage, los mensajes se procesan por lotes y se exportan una vez por minuto.

En el ejemplo siguiente, se muestra un mensaje sobre la conectividad del dispositivo exportado que se ha recibido en Azure Blob Storage.

{
  "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
  "messageSource": "deviceConnectivity",
  "messageType": "connected",
  "deviceId": "1vzb5ghlsg1",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-04-05T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

Formato de los cambios de ciclo de vida de dispositivo

Cada mensaje o registro representa un cambio en un único dispositivo. La información del mensaje exportado incluye:

  • applicationId: identificador de la aplicación de IoT Central.
  • messageSource: origen del mensaje: deviceLifecycle.
  • messageType: tipo de error que se produjo. Uno de los siguientes: registered, deleted, provisioned, enabled, disabled, displayNameChanged y deviceTemplateChanged.
  • deviceId: el id. del dispositivo que se ha cambiado.
  • schema: el nombre y la versión del esquema de carga.
  • templateId: id. de la plantilla de dispositivo asignada a este dispositivo
  • enqueuedTime: la hora a la que se produjo este cambio en IoT Central.
  • enrichments: cualquier enriquecimiento configurado en la exportación.

Para Blob Storage, los mensajes se procesan por lotes y se exportan una vez por minuto.

En el ejemplo siguiente, se muestra un mensaje del ciclo de vida de dispositivo exportado que se ha recibido en Azure Blob Storage.

{
  "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
  "messageSource": "deviceLifecycle",
  "messageType": "registered",
  "deviceId": "1vzb5ghlsg1",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-01-01T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

Formato de los cambios del ciclo de vida de plantilla de dispositivo

Cada mensaje o registro representa un cambio en una única plantilla de dispositivo publicada. La información del mensaje exportado incluye:

  • applicationId: identificador de la aplicación de IoT Central.
  • messageSource: origen del mensaje: deviceTemplateLifecycle.
  • messageType: created, updated o deleted.
  • schema: el nombre y la versión del esquema de carga.
  • templateId: id. de la plantilla de dispositivo asignada a este dispositivo
  • enqueuedTime: la hora a la que se produjo este cambio en IoT Central.
  • enrichments: cualquier enriquecimiento configurado en la exportación.

Para Blob Storage, los mensajes se procesan por lotes y se exportan una vez por minuto.

En el ejemplo siguiente, se muestra un mensaje del ciclo de vida de dispositivo exportado que se ha recibido en Azure Blob Storage.

{
  "applicationId": "1dffa667-9bee-4f16-b243-25ad4151475e",
  "messageSource": "deviceTemplateLifecycle",
  "messageType": "created",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-01-01T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

Formato de los registros de auditoría

Cada mensaje del registro de auditoría representa un cambio iniciado por el usuario en una entidad auditable dentro de la aplicación de IoT Central. La información del mensaje exportado incluye:

  • actor: información sobre el usuario que ha modificado la entidad.
  • applicationId: identificador de la aplicación de IoT Central.
  • messageSource: origen del mensaje: audit.
  • messageType: tipo de error que se produjo. Uno de estos valores: updated, created o deleted.
  • updated: solo está presente si messageType es updated. Proporciona más detalles sobre la actualización.
  • resource: detalles de la entidad modificada.
  • schema: el nombre y la versión del esquema de carga.
  • deviceId: el id. del dispositivo que se ha cambiado.
  • enqueuedTime: la hora a la que se produjo este cambio en IoT Central.
  • enrichments: cualquier enriquecimiento configurado en la exportación.

El siguiente ejemplo muestra un mensaje de registro de auditoría exportado recibido en Azure Blob Storage:

{
  "actor": {
    "id": "test-audit",
    "type": "apiToken"
    },
  "applicationId": "570c2d7b-1111-2222-abcd-000000000000",
  "enqueuedTime": "2022-07-25T21:54:40.000Z",
  "enrichments": {},
  "messageSource": "audit",
  "messageType": "created",
  "resource": {
    "displayName": "Sensor 1",
    "id": "sensor",
    "type": "device"    
  },
  "schema": "default@v1"
}

Pasos siguientes

Ahora que sabe cómo exportar datos a Blob Storage, el siguiente paso sugerido es aprender a exportar a Service Bus.