Share via


Charger des fichiers sur le cloud à partir d’un appareil avec Azure IoT Hub (Python)

Cet article montre les capacités de chargement de fichiers d’IoT Hub pour charger un fichier vers un stockage blob Azure en utilisant Python.

Les articles de démarrage rapide Envoyer des données de télémétrie d’un appareil vers un hub IoT et Envoyer des messages cloud-à-appareil avec IoT Hub illustrent les fonctionnalités de messages appareil-à-cloud et cloud-à-appareil de base offertes par IoT Hub. Le tutoriel Configurer le routage des messages avec IoT Hub montre un moyen de stocker de façon fiable les messages appareil-à-cloud dans Stockage Blob Microsoft Azure. Cependant, dans certains scénarios, vous ne pouvez pas mapper facilement les données que vos appareils envoient dans les messages appareil-à-cloud relativement petits acceptés par IoT Hub. Par exemple :

  • Vidéos
  • Fichiers volumineux qui contiennent des images
  • Données de vibration échantillonnées à une fréquence élevée
  • Un certain type de données prétraitées.

Ces fichiers sont généralement traités par lot dans le cloud à l’aide d’outils tels que Azure Data Factory ou de la pile Hadoop. Si vous avez besoin de charger des fichiers à partir d’un appareil, vous pouvez toujours exploiter la sécurité et la fiabilité d’IoT Hub. Cet article vous montre comment procéder.

À la fin de cet article, vous exécutez l’application console Python FileUpload.py, qui charge un fichier sur le stockage à l’aide du kit Python Device SDK.

Notes

IoT Hub offre la prise en charge de nombreux langages (notamment C, Java, Python et JavaScript) et plateformes d’appareils par le biais des Kits Azure IoT device SDK. Consultez le Centre de développement Azure IoT pour savoir comment connecter votre appareil à Azure IoT Hub.

Important

La fonctionnalité de chargement de fichiers sur les appareils qui utilisent l’authentification par l’autorité de certification X.509 est en préversion publique, et le mode aperçu doit être activé. Elle est généralement disponible sur les appareils qui utilisent l’authentification par empreinte X.509 ou l’attestation de certificat X.509 avec le service de provisionnement des appareils Azure. Pour en savoir plus sur l’authentification X.509 avec IoT Hub, consultez les certificats X.509 pris en charge.

Prérequis

  • Un compte Azure actif. (Si vous ne possédez pas de compte, vous pouvez créer un compte gratuit en quelques minutes seulement.)

  • Un IoT Hub. Créez-en un avec l’interface CLI ou le portail Azure.

  • Appareil inscrit. Inscrivez-en un dans le portail Azure.

  • Python version 3.7 ou ultérieure est recommandé. Veillez à utiliser l’installation 32 bits ou 64 bits comme requis par votre programme d’installation. Lorsque vous y êtes invité pendant l’installation, veillez à ajouter Python à votre variable d’environnement propre à la plateforme.

  • Le port 8883 doit être ouvert dans votre pare-feu. L’exemple d’appareil décrit dans cet article utilise le protocole MQTT, qui communique via le port 8883. Ce port peut être bloqué dans certains environnements réseau professionnels et scolaires. Pour plus d’informations sur les différentes façons de contourner ce problème, consultez Connexion à IoT Hub (MQTT).

Associer un compte Azure Storage à IoT Hub

Pour télécharger des fichiers à partir d’un appareil, vous devez disposer d’un compte de stockage Azure et d’un conteneur Stockage Blob Azure associés à votre IoT Hub. Une fois que vous associez le compte de stockage et le conteneur à votre hub IoT, il peut fournir les éléments d’un URI SAS lorsqu’il est demandé par un appareil. L’appareil peut ensuite utiliser ces éléments pour construire l’URI SAS qu’il utilise pour s’authentifier auprès du Stockage Azure et charger des fichiers dans le conteneur d’objets blob.

Pour associer un compte de Stockage Azure à votre hub IoT :

  1. DansParamètres hub, sélectionnez Chargement de fichiers dans le volet gauche de votre hub IoT.

    Capture d’écran présentant les paramètres de téléchargement de fichiers à partir du portail.

  2. Dans le voletChargement de fichiers sélectionnez Conteneur de stockage Azure. Pour cet article, il est recommandé que votre compte de stockage et votre IoT Hub se trouvent dans la même région.

    • Si vous avez déjà un compte de stockage que vous souhaitez utiliser, sélectionnez-le dans la liste.

    • Pour créer un nouveau compte de stockage, sélectionnez +Compte de stockage. Donnez un nom au compte de stockage et veillez à ce que l’Emplacement soit défini sur la même région que votre hub IoT, puis sélectionnez OK. Le nouveau compte est créé dans le même groupe de ressources que votre IoT Hub. Une fois le déploiement terminé, sélectionnez le compte de stockage dans la liste.

    Une fois le compte de stockage sélectionné, le volet Conteneurs s’ouvre.

  3. Dans le volet Conteneurs, sélectionnez le conteneur d’objets blob.

    • Si vous disposez déjà d’un conteneur d’objets blob que vous souhaitez utiliser, sélectionnez-le dans la liste et cliquez sur Sélectionner.

    • Sélectionnez + Conteneur pour créer un nouveau conteneur d’objets blob. Donnez un nom au nouveau conteneur. Dans le cadre de cet article, vous pouvez conserver les valeurs par défaut de tous les autres champs. Sélectionnez Create (Créer). Une fois le déploiement terminé, sélectionnez le conteneur dans la liste et cliquez sur Sélectionner.

  4. De nouveau dans le volet Chargement de fichiers veillez à ce que les notifications de fichiers soient configurées sur On. Vous pouvez garder les valeurs par défaut de tous les autres paramètres. Sélectionnez Enregistrer et attendez l’exécution des paramètres avant de passer à la section suivante.

    Capture d’écran présentant les paramètres de confirmation de chargement du fichier dans le portail.

Pour plus d’informations sur la création d’un compte de stockage Azure, consultez Créer un compte de stockage. Pour obtenir des instructions plus détaillées sur la façon d’associer un compte de stockage et un conteneur d’objets blob à un hub IoT, consultez Configurer les chargements de fichiers à l’aide du portail Azure.

Charger un fichier à partir d’une application d’appareil

Dans cette section, créez l’application d’appareil pour charger un fichier sur IoT Hub.

  1. À partir de votre invite de commandes, exécutez la commande suivante pour installer le package azure-iot-device. Vous utilisez ce package pour coordonner le chargement du fichier avec votre hub IoT.

    pip install azure-iot-device
    
  2. À partir de votre invite de commandes, exécutez la commande suivante pour installer le package azure.storage.blob. Vous utilisez ce package pour effectuer le chargement du fichier.

    pip install azure.storage.blob
    
  3. Créez un fichier de test que vous téléchargerez dans le stockage Blob.

  4. À l’aide d’un éditeur de texte, créez un fichier FileUpload.py dans votre dossier de travail.

  5. Ajoutez les variables et instructions import ci-dessous au début du fichier 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. Dans votre fichier, remplacez [Device Connection String] par la chaîne de connexion de l’appareil de votre hub IoT. Remplacez [Full path to local file] par le chemin d’accès du fichier test que vous avez créé ou de tout fichier figurant sur votre appareil, que vous souhaitez télécharger.

  7. Créez une fonction pour charger le fichier dans le stockage Blob :

    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)
    

    Cette fonction analyse la structure blob_info qui lui est transmise pour créer une URL qu’il utilise pour initialiser un azure.storage.blob.BlobClient. Ensuite, elle charge votre fichier dans le stockage Blob Azure à l’aide de ce client.

  8. Pour connecter le client et charger le fichier, ajoutez le code suivant :

    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()
    

    Celui-ci crée un IoTHubDeviceClient asynchrone et utilise les API suivantes pour gérer le chargement de fichier avec votre hub IoT :

    • get_storage_info_for_blob obtient des informations de votre hub IoT concernant le compte de stockage lié que vous avez créé précédemment. Ces informations incluent le nom d’hôte, le nom du conteneur, le nom de l’objet Blob et un jeton SAP. Les informations de stockage sont transmises à la fonction store_blob (créée à l’étape précédente), ce qui permet au BlobClient dans cette fonction de s’authentifier auprès du stockage Azure. La méthode get_storage_info_for_blob retourne également un correlation_id qui est utilisé dans la méthode notify_blob_upload_status. Le correlation_id est le moyen qu’IoT Hub utilise pour marquer l’objet Blob sur lequel vous travaillez.

    • notify_blob_upload_status notifie IoT Hub de l’état de votre opération de stockage Blob. Vous lui transmettez le correlation_id obtenu par la méthode get_storage_info_for_blob. IoT Hub utilise celui-ci pour notifier à un service qui pourrait écouter dans l’attente d’une notification sur l’état de la tâche de chargement de fichier.

  9. Enregistrez et fermez le fichier FileUpload.py.

Exécution de l'application

Vous êtes maintenant prêt à exécuter l’application.

  1. À partir d’une invite de commandes dans votre dossier de travail, exécutez la commande suivante :

    python FileUpload.py
    
  2. La capture d’écran ci-dessous montre la sortie de l’application FileUpload :

    Capture d’écran montrant le résultat de l’exécution de l’application FileUpload.

  3. Vous pouvez utiliser le portail pour afficher le fichier chargé dans le conteneur de stockage que vous avez configuré :

    Capture d’écran du conteneur dans le portail Azure qui montre le fichier chargé.

Étapes suivantes

Dans cet article, vous avez appris à utiliser les fonctionnalités de téléchargement de fichier d’IoT Hub pour simplifier les chargements de fichiers à partir d’appareils. Vous pouvez approfondir cette fonctionnalité en lisant les articles suivants :

Suivez les liens suivants pour en savoir plus sur Stockage Blob Azure :