IoT Hub を使用してデバイスからクラウドにファイルをアップロードする (Python)Upload files from your device to the cloud with IoT Hub (Python)

この記事では、IoT Hub のファイル アップロード機能を使用してファイルを Azure Blob Storage にアップロードする方法を説明します。This article shows how to use the file upload capabilities of IoT Hub to upload a file to Azure blob storage. このチュートリアルでは、次の操作方法について説明します。The tutorial shows you how to:

  • ファイルをアップロードするためのストレージ コンテナーを安全に提供します。Securely provide a storage container for uploading a file.

  • Python クライアントを使用して、IoT ハブ経由でファイルをアップロードします。Use the Python client to upload a file through your IoT hub.

デバイスから IoT ハブへのテレメトリの送信に関するクイックスタートでは、IoT Hub のデバイスからクラウドへの基本的なメッセージング機能が示されます。The Send telemetry from a device to an IoT hub quickstart demonstrates the basic device-to-cloud messaging functionality of IoT Hub. ただし、一部のシナリオでは、デバイスから送信されるデータを、IoT Hub が受け取る、クラウドからデバイスへの比較的小さなメッセージにマッピングすることは簡単ではありません。However, in some scenarios you cannot easily map the data your devices send into the relatively small device-to-cloud messages that IoT Hub accepts. デバイスからファイルをアップロードする必要がある場合も、IoT Hub のセキュリティを信頼性を使用できます。When you need to upland files from a device, you can still use the security and reliability of IoT Hub.

このチュートリアルの最後に、Python コンソール アプリを実行します。At the end of this tutorial, you run the Python console app:

  • FileUpload.py は、Python デバイス SDK を使用してファイルをストレージにアップロードします。FileUpload.py, which uploads a file to storage using the Python Device SDK.

注意

IoT Hub には、Azure IoT device SDK を介した多数のデバイス プラットフォームや言語 (C、Java、Javascript、Python など) に対する SDK サポートがあります。IoT Hub has SDK support for many device platforms and languages (including C, Java, Javascript, and Python) through Azure IoT device SDKs. このチュートリアルのコード (一般的には Azure IoT Hub) にデバイスを接続するために Python を使用する方法の手順については、Azure IoT Python SDK に関するページを参照してください。For instructions on how to use Python to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the Azure IoT Python SDK.

前提条件Prerequisites

  • アクティブな Azure アカウントアカウントがない場合、Azure 試用版にサインアップして、最大 10 件の無料 Mobile Apps を入手できます。An active Azure account. (アカウントがない場合は、無料アカウント を数分で作成できます)。(If you don't have an account, you can create a free account in just a couple of minutes.)

  • Python バージョン 3.7 以降をお勧めします。Python version 3.7 or later is recommended. 必ず、セットアップに必要な 32 ビットまたは 64 ビットのインストールを使用してください。Make sure to use the 32-bit or 64-bit installation as required by your setup. インストール中に求められた場合は、プラットフォーム固有の環境変数に Python を追加します。When prompted during the installation, make sure to add Python to your platform-specific environment variable. サポートされる他のバージョンの Python については、SDK ドキュメントの「Azure IoT デバイスの機能」を参照してください。For other versions of Python supported, see Azure IoT Device Features in the SDK documentation.

    重要

    この記事のデバイス コードでは非同期 API が使用されているため、Python 2.7 を使用することはできません。Because the device code in this article uses the asynchronous API, you cannot use Python 2.7.

  • ポート 8883 がファイアウォールで開放されていることを確認してください。Make sure that port 8883 is open in your firewall. この記事のデバイス サンプルでは、ポート 8883 を介して通信する MQTT プロトコルを使用しています。The device sample in this article uses MQTT protocol, which communicates over port 8883. このポートは、企業や教育用のネットワーク環境によってはブロックされている場合があります。This port may be blocked in some corporate and educational network environments. この問題の詳細と対処方法については、「IoT Hub への接続 (MQTT)」を参照してください。For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

IoT Hub への Azure Storage アカウントの関連付けAssociate an Azure Storage account to IoT Hub

シミュレート対象デバイス アプリによって BLOB にファイルがアップロードされるため、お使いの IoT ハブに関連付けられている Azure Storage アカウントが必要です。Because the simulated device app uploads a file to a blob, you must have an Azure Storage account associated with your IoT hub. Azure Storage アカウントを IoT ハブに関連付けると、IoT ハブによって SAS URI が生成されます。When you associate an Azure Storage account with an IoT hub, the IoT hub generates a SAS URI. デバイスは、この SAS URI を使って安全にファイルを BLOB コンテナーにアップロードすることができます。A device can use this SAS URI to securely upload a file to a blob container. SAS URI を生成し、デバイスでファイルのアップロードに使用できるようにするプロセスは、IoT Hub サービスとデバイス SDK によって調整されます。The IoT Hub service and the device SDKs coordinate the process that generates the SAS URI and makes it available to a device to use to upload a file.

Azure portal を使用してファイルのアップロードを構成する」の手順に従います。Follow the instructions in Configure file uploads using the Azure portal. ご利用の IoT ハブに BLOB コンテナーが関連付けられていること、またファイル通知が有効になっていることを確認します。Make sure that a blob container is associated with your IoT hub and that file notifications are enabled.

ポータルでファイル通知を有効にする

デバイス アプリからのファイルのアップロードUpload a file from a device app

このセクションでは、IoT Hub にファイルをアップロードするデバイス アプリを作成します。In this section, you create the device app to upload a file to IoT hub.

  1. コマンド プロンプトで次のコマンドを実行して azure-iot-device パッケージをインストールします。At your command prompt, run the following command to install the azure-iot-device package. このパッケージを使用して、IoT ハブでファイルのアップロードを調整します。You use this package to coordinate the file upload with your IoT hub.

    pip install azure-iot-device
    
  2. コマンド プロンプトで次のコマンドを実行して azure.storage.blob パッケージをインストールします。At your command prompt, run the following command to install the azure.storage.blob package. このパッケージを使用して、ファイルのアップロードを実行します。You use this package to perform the file upload.

    pip install azure.storage.blob
    
  3. BLOB ストレージにアップロードするテスト ファイルを作成します。Create a test file that you'll upload to blob storage.

  4. テキスト エディターを使用して、作業フォルダーに FileUpload.py ファイルを作成します。Using a text editor, create a FileUpload.py file in your working folder.

  5. FileUpload.py ファイルの先頭に次の import ステートメントと変数を追加します。Add the following import statements and variables at the start of the FileUpload.py file.

    import os
    import asyncio
    from azure.iot.device.aio 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. ファイル内で、[Device Connection String] を IoT Hub デバイスの接続文字列に置き換えます。In your file, replace [Device Connection String] with the connection string of your IoT hub device. [Full path to local file] を、作成したテスト ファイル、またはアップロードするデバイス上の任意のファイルのパスに置き換えます。Replace [Full path to local file] with the path to the test file that you created or any file on your device that you want to upload.

  7. ファイルを BLOB ストレージにアップロードする関数を作成します。Create a function to upload the file to blob storage:

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

    この関数は、渡されたblob_info 構造体を解析して、azure.storage.blob.BlobClient を初期化するために使用する URL を作成します。This function parses the blob_info structure passed into it to create a URL that it uses to initialize an azure.storage.blob.BlobClient. 次に、このクライアントを使用して、ファイルが Azure BLOB ストレージにアップロードされます。Then it uploads your file to Azure blob storage using this client.

  8. 次のコードを追加して、クライアントを接続し、ファイルをアップロードします。Add the following code to connect the client and upload the file:

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

    このコードでは、非同期の IoTHubDeviceClient が作成され、次の API を使用して IoT ハブでファイルのアップロードを管理します。This code creates an asynchronous IoTHubDeviceClient and uses the following APIs to manage the file upload with your IoT hub:

    • get_storage_info_for_blob は、前に作成したリンクされたストレージ アカウントに関する情報を IoT ハブから取得します。get_storage_info_for_blob gets information from your IoT hub about the linked Storage Account you created previously. この情報には、ホスト名、コンテナー名、BLOB 名、および SAS トークンが含まれます。This information includes the hostname, container name, blob name, and a SAS token. ストレージ情報は store_blob 関数 (前の手順で作成) に渡されるため、その関数の BlobClient は Azure ストレージで認証できます。The storage info is passed to the store_blob function (created in the previous step), so the BlobClient in that function can authenticate with Azure storage. get_storage_info_for_blob メソッドでは、notify_blob_upload_status メソッドで使用される correlation_id も返されます。The get_storage_info_for_blob method also returns a correlation_id, which is used in the notify_blob_upload_status method. correlation_id は、IoT Hub で作業している BLOB をマークする方法です。The correlation_id is IoT Hub's way of marking which blob you're working on.

    • notify_blob_upload_status により、BLOB ストレージ操作の状態が IoT Hub に通知されます。notify_blob_upload_status notifies IoT Hub of the status of your blob storage operation. get_storage_info_for_blob メソッドによって取得された correlation_id を渡します。You pass it the correlation_id obtained by the get_storage_info_for_blob method. これは、ファイルのアップロード タスクの状態に関する通知をリッスンしている可能性があるサービスに通知するために IoT Hub によって使用されます。It's used by IoT Hub to notify any service that might be listening for a notification on the status of the file upload task.

  9. UploadFile.py ファイルを保存して閉じます。Save and close the UploadFile.py file.

アプリケーションの実行Run the application

これで、アプリケーションを実行する準備が整いました。Now you're ready to run the application.

  1. 作業フォルダーのコマンド プロンプトで、次のコマンドを実行します。At a command prompt in your working folder, run the following command:

    python FileUpload.py
    
  2. 次のスクリーン ショットは、FileUpload アプリからの出力を示しています。The following screenshot shows the output from the FileUpload app:

    simulated-device アプリからの出力

  3. ポータルを使用して、構成したストレージ コンテナーにアップロードされたファイルを表示できます。You can use the portal to view the uploaded file in the storage container you configured:

    アップロードされたファイル

次のステップNext steps

このチュートリアルでは、IoT Hub のファイル アップロード機能を使用して、デバイスからのファイルのアップロードを簡素化する方法を学習しました。In this tutorial, you learned how to use the file upload capabilities of IoT Hub to simplify file uploads from devices. 次の記事で IoT Hub の機能やシナリオをさらに詳しく調べることができます。You can continue to explore IoT hub features and scenarios with the following articles:

Azure Blob Storage の詳細については、次のリンク先を参照してください。Learn more about Azure Blob Storage with the following links: