Carga de archivos desde un dispositivo a la nube con Azure IoT Hub (Python)

Este artículo demuestra cómo las capacidades de carga de archivos de IoT Hub cargan un archivo a Azure blob storage, mediante Python.

En el inicio rápido Envío de telemetría de un dispositivo a IoT hub y los artículos de Envío de mensajes de la nube al dispositivo con IoT Hub se muestra cómo usar la funcionalidad básica de mensajería del dispositivo a la nube y de la nube al dispositivo de IoT Hub. En el tutorial Configuración del enrutamiento de mensajes con IoT Hub se muestra una forma de almacenar de manera confiable los mensajes del dispositivo a la nube en Microsoft Azure Blob Storage. Sin embargo, en algunos escenarios, no se pueden asignar fácilmente los datos que los dispositivos envían en los mensajes del dispositivo a la nube de un tamaño relativamente reducido que acepta IoT Hub. Por ejemplo:

  • Vídeos
  • Archivos grandes con imágenes
  • Datos de vibración muestreados con alta frecuencia
  • Alguna forma de datos procesados previamente.

Dichos archivos se suelen procesar por lotes en la nube mediante herramientas como Azure Data Factory o la pila Hadoop. Cuando necesite cargar archivos desde un dispositivo, todavía puede usar la seguridad y confiabilidad de IoT Hub. Este artículo le muestra cómo.

Al final de este artículo, ejecutará la aplicación de consola de Python FileUpload.py, que carga un archivo en el almacenamiento mediante el SDK de dispositivo de Python.

Nota

IoT Hub admite muchas plataformas de dispositivos y lenguajes (entre los que se incluyen C, Java, Python y JavaScript), mediante los SDK de dispositivo IoT de Azure. Consulte el Centro de desarrollo de Azure IoT para saber cómo conectar su dispositivo a Azure IoT Hub.

Importante

La funcionalidad de carga de archivos de los dispositivos que usan la autenticación de la entidad de certificación X.509 está disponible como versión preliminar pública, y se debe habilitar el modo de vista previa. Está disponible con carácter general en dispositivos que usan la autenticación de huella digital X.509 o la atestación de certificado X.509 con el servicio de aprovisionamiento de dispositivos de Azure. Para obtener más información acerca de la autenticación X.509 con IoT Hub, consulte Certificados X.509 compatibles.

Requisitos previos

  • Una cuenta de Azure activa. (En caso de no tener ninguna, puede crear una cuenta gratuita en tan solo unos minutos).

  • Una instancia de IoT Hub. Cree uno con la CLI o el Azure Portal.

  • Dispositivo registrado. Registre uno en el Azure Portal.

  • Se recomienda usar Python versión 3.7 o posterior. Asegúrese de usar la instalación de 32 bits o 64 bits en función del programa de instalación. Cuando se le solicite durante la instalación, asegúrese de agregar Python a la variable de entorno específica de la plataforma.

  • El puerto 8883 debería estar abierto en su firewall. En el ejemplo de dispositivo de este artículo se usa el protocolo MQTT, que se comunica mediante el puerto 8883. Este puerto puede estar bloqueado en algunos entornos de red corporativos y educativos. Para más información y para saber cómo solucionar este problema, consulte el artículo sobre la conexión a IoT Hub (MQTT).

Asociación de una cuenta de Azure Storage a IoT Hub

Para cargar archivos desde un dispositivo, debe tener una cuenta de Azure Storage y un contenedor de Azure Blob Storage asociado al centro de IoT. Una vez que asocie la cuenta de almacenamiento y el contenedor con el centro de IoT, este puede proporcionar los elementos de un URI de SAS cuando lo solicite un dispositivo. A continuación, el dispositivo puede usar estos elementos para construir el URI de SAS que usa para autenticarse con Azure Storage y cargar archivos en el contenedor de blobs.

Para asociar una cuenta de Azure Storage con el centro de IoT:

  1. En Configuración del centro, seleccione Carga de archivos en el panel izquierdo del centro de IoT.

    Captura de pantalla que muestra la configuración de carga de archivos seleccionada en el portal.

  2. En el panel Carga de archivos, seleccione Contenedor de Azure Storage. En este artículo, se recomienda que la cuenta de almacenamiento e IoT Hub se encuentren en la misma región.

    • Si ya tiene una cuenta de almacenamiento que desea usar, selecciónela de la lista.

    • Para crear una nueva cuenta de almacenamiento, seleccione + Cuenta de almacenamiento. Proporcione un nombre a la cuenta de almacenamiento y asegúrese de que Ubicación esté establecida en la misma región que el centro de IoT y, a continuación, seleccione Aceptar. La nueva cuenta se crea en el mismo grupo de recursos que el centro de IoT. Cuando se complete la implementación, seleccione la cuenta de almacenamiento de la lista.

    Después de seleccionar la cuenta de almacenamiento, se abre el panel Contenedores.

  3. En el panel Contenedores, seleccione el contenedor de blobs.

    • Si ya tiene un contenedor de blobs que desea usar, selecciónelo en la lista y haga clic en Seleccionar.

    • Para crear un contenedor de blobs, seleccione + Contenedor. Proporcione un nombre para el nuevo contenedor. Para los fines de este artículo, puede dejar todos los demás campos en su valor predeterminado. Seleccione Crear. Cuando finalice la implementación, seleccione el contenedor de la lista y haga clic en Seleccionar.

  4. De nuevo en el panel Carga de archivos, asegúrese de que las notificaciones de archivos estén establecidas en Activadas. Puede dejar el resto de la configuración en sus valores predeterminados. Seleccione Guardar y espere a que se complete la configuración antes de pasar a la siguiente sección.

    Captura de pantalla que muestra la configuración de confirmación de carga de archivos en el portal.

Para obtener instrucciones detalladas sobre cómo crear una cuenta de Azure Storage, consulte Crear una cuenta de almacenamiento. Para obtener instrucciones detalladas sobre cómo asociar una cuenta de almacenamiento y un contenedor de blobs a un centro de IoT, consulte Configuración de cargas de archivos mediante Azure Portal.

Carga de un archivo desde una aplicación de dispositivo

En esta sección, creará la aplicación para dispositivos para cargar un archivo en IoT Hub.

  1. En el símbolo del sistema, ejecute el siguiente comando para instalar el paquete azure-iot-device. Este paquete se usa para coordinar la carga de archivos con el centro de IoT.

    pip install azure-iot-device
    
  2. En el símbolo del sistema, ejecute el siguiente comando para instalar el paquete azure.storage.blob. Este paquete se usa para realizar la carga de archivos.

    pip install azure.storage.blob
    
  3. Cree un archivo de prueba que se cargará en Blob Storage.

  4. Con un editor de texto, cree un archivo FileUpload.py en la carpeta de trabajo.

  5. Agregue las siguientes instrucciones y variables import al principio del archivo FileUpload.py.

    import os
    from azure.iot.device import IoTHubDeviceClient
    from azure.core.exceptions import AzureError
    from azure.storage.blob import BlobClient
    
    CONNECTION_STRING = "[Device Connection String]"
    PATH_TO_FILE = r"[Full path to local file]"
    
  6. En el archivo, sustituya [Device Connection String] por la cadena de conexión del dispositivo de IoT Hub. Reemplace [Full path to local file] por la ruta de acceso del archivo de prueba que creó o de cualquier archivo del dispositivo que quiera cargar.

  7. Cree una función para cargar el archivo a Blob Storage:

    def store_blob(blob_info, file_name):
        try:
            sas_url = "https://{}/{}/{}{}".format(
                blob_info["hostName"],
                blob_info["containerName"],
                blob_info["blobName"],
                blob_info["sasToken"]
            )
    
            print("\nUploading file: {} to Azure Storage as blob: {} in container {}\n".format(file_name, blob_info["blobName"], blob_info["containerName"]))
    
            # Upload the specified file
            with BlobClient.from_blob_url(sas_url) as blob_client:
                with open(file_name, "rb") as f:
                    result = blob_client.upload_blob(f, overwrite=True)
                    return (True, result)
    
        except FileNotFoundError as ex:
            # catch file not found and add an HTTP status code to return in notification to IoT Hub
            ex.status_code = 404
            return (False, ex)
    
        except AzureError as ex:
            # catch Azure errors that might result from the upload operation
            return (False, ex)
    

    Esta función analiza la estructura blob_info que se ha pasado para crear una dirección URL que se usa para inicializar un objeto azure.storage.blob.BlobClient. Después, carga el archivo a Azure Blob Storage mediante este cliente.

  8. Agregue el siguiente código para conectar el cliente y cargar el archivo:

    def run_sample(device_client):
        # Connect the client
        device_client.connect()
    
        # Get the storage info for the blob
        blob_name = os.path.basename(PATH_TO_FILE)
        storage_info = device_client.get_storage_info_for_blob(blob_name)
    
        # Upload to blob
        success, result = store_blob(storage_info, PATH_TO_FILE)
    
        if success == True:
            print("Upload succeeded. Result is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], True, 200, "OK: {}".format(PATH_TO_FILE)
            )
    
        else :
            # If the upload was not successful, the result is the exception object
            print("Upload failed. Exception is: \n") 
            print(result)
            print()
    
            device_client.notify_blob_upload_status(
                storage_info["correlationId"], False, result.status_code, str(result)
            )
    
    def main():
        device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        try:
            print ("IoT Hub file upload sample, press Ctrl-C to exit")
            run_sample(device_client)
        except KeyboardInterrupt:
            print ("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            device_client.shutdown()
    
    
    if __name__ == "__main__":
        main()
    

    Este código crea un IoTHubDeviceClient y usa las siguientes API para administrar la carga de archivos con el centro de IoT:

    • get_storage_info_for_blob obtiene información del centro de IoT sobre la cuenta de almacenamiento vinculada que creó anteriormente. Esta información incluye el nombre de host, el nombre del contenedor, el nombre del blob y un token de SAS. La información de almacenamiento se pasa a la función store_blob función de (creada en el paso anterior), para que el elemento BlobClient en esa función pueda autenticarse con Azure Storage. El método get_storage_info_for_blob también devuelve un correlation_id, que se usa en el método notify_blob_upload_status. El correlation_id es la manera en que IoT Hub muestra en qué blob está trabajando.

    • notify_blob_upload_status notifica a IoT Hub del estado de la operación de almacenamiento de blobs. Se le pasa el correlation_id que obtuvo a través del método get_storage_info_for_blob. IoT Hub lo usa para notificar a cualquier servicio que pueda estar escuchando sobre el estado de la tarea de carga de archivos.

  9. Guarde y cierre el archivo FileUpload.py.

Ejecución de la aplicación

Ahora está listo para ejecutar la aplicación.

  1. En un símbolo del sistema de la carpeta de trabajo, ejecute el siguiente comando:

    python FileUpload.py
    
  2. En la captura de pantalla siguiente se muestra la salida de la aplicación FileUpload:

    Captura de pantalla que muestra la salida de la aplicación FileUpload.

  3. Puede usar el portal para ver el archivo cargado en el contenedor de almacenamiento que configuró:

    Captura de pantalla del contenedor en el Azure Portal que muestra el archivo cargado.

Pasos siguientes

En este artículo ha aprendido a usar la función de carga de archivos de IoT Hub para simplificar la carga de archivos desde los dispositivos. Puede seguir explorando esta característica con los siguientes artículos:

Obtenga más información sobre Azure Blob Storage con los siguientes vínculos: