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

このチュートリアルは、IoT Hub を使用した cloud-to-device メッセージの送信に関するページ内のコードに基づいて作成されており、IoT Hub のファイル アップロード機能を使用する方法を説明します。This tutorial builds on the code in the Send cloud-to-device messages with IoT Hub tutorial to show you how to use the file upload capabilities of IoT Hub. 次の方法について説明します。It shows you how to:

  • ファイルのアップロードで Azure BLOB URI を使用してデバイスをセキュリティで保護する。Securely provide a device with an Azure blob URI for uploading a file.

  • IoT Hub ファイル アップロード通知を使用して、アプリのバックエンドでのファイルの処理を開始する。Use the IoT Hub file upload notifications to trigger processing the file in your app back end.

デバイスから IoT ハブにテレメトリを送信する方法のクイックスタートと IoT Hub で cloud-to-device メッセージを送信する方法のチュートリアルには、IoT Hub のデバイスからクラウドへのメッセージングと cloud-to-device メッセージの基本的な機能が示されています。The Send telemetry from a device to an IoT hub quickstart and Send cloud-to-device messages with IoT Hub tutorial show the basic device-to-cloud and cloud-to-device messaging functionality of IoT Hub. IoT Hub を使用したメッセージ ルーティングの構成に関するチュートリアルでは、デバイスからクラウドへのメッセージを Microsoft Azure Blob ストレージに確実に格納する方法について説明しています。The Configure Message Routing with IoT Hub tutorial describes a way to reliably store device-to-cloud messages in Microsoft Azure Blob storage. ただし、一部のシナリオでは、デバイスが送信するデータを、IoT Hub が受け付けるデバイスからクラウドへの比較的小さなメッセージには簡単にマップできません。However, in some scenarios you can't easily map the data your devices send into the relatively small device-to-cloud messages that IoT Hub accepts. 次に例を示します。For example:

  • イメージを含む大きなファイルLarge files that contain images

  • ビデオVideos

  • 高頻度でサンプリングされる振動データVibration data sampled at high frequency

  • 何らかの形式の前処理済みデータSome form of preprocessed data

これらのファイルは通常、Azure Data FactoryHadoop スタックなどのツールを使用してクラウドでバッチ処理されます。These files are typically batch processed in the cloud using tools such as Azure Data Factory or the Hadoop stack. デバイスからファイルをアップロードする必要がある場合も、IoT Hub のセキュリティと信頼性を利用できます。When you need to upload files from a device, you can still use the security and reliability of IoT Hub.

このチュートリアルの最後に、次の 2 つの .NET コンソール アプリを実行します。At the end of this tutorial you run two .NET console apps:

  • SimulatedDeviceSimulatedDevice. このアプリは、IoT Hub によって提供された SAS URI を使用してストレージにファイルをアップロードします。This app uploads a file to storage using a SAS URI provided by your IoT hub. これは、IoT Hub を使用したクラウドからデバイスへのメッセージの送信に関するチュートリアルで作成されたアプリの変更されたバージョンです。It is a modified version of the app created in the Send cloud-to-device messages with IoT Hub tutorial.

  • ReadFileUploadNotificationReadFileUploadNotification. このアプリは、IoT ハブからのファイル アップロード通知を受信します。This app receives file upload notifications from your IoT hub.

注意

IoT Hub は、Azure IoT device SDK を通して、多数のデバイス プラットフォームと言語 (C、Java、Python、Javascript を含む) をサポートしています。IoT Hub supports many device platforms and languages, including C, Java, Python, and Javascript, through Azure IoT device SDKs. Azure IoT Hub にデバイスを接続するための詳しい手順については、Azure IoT デベロッパー センターを参照してください。Refer to the Azure IoT Developer Center for step-by-step instructions on how to connect your device to Azure IoT Hub.

重要

File upload functionality is not supported on devices that use X.509 certificate authority (CA) authentication. It is supported on devices that use X.509 thumbprint authentication. To learn more about X.509 authentication with IoT Hub, see Supported X.509 certificates.

前提条件Prerequisites

  • Visual StudioVisual Studio

  • アクティブな 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.

  • ポート 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 でクラウドからデバイスへのメッセージ送信で作成したデバイス アプリを変更して、クラウドからデバイスへのメッセージを IoT Hub から受信するようにします。In this section, you modify the device app you created in Send cloud-to-device messages with IoT Hub to receive cloud-to-device messages from the IoT hub.

  1. Visual Studio ソリューション エクスプローラーで、 [SimulatedDevice] プロジェクトを右クリックし、 [追加] > [既存の項目] の順に選択します。In Visual Studio Solution Explorer, right-click the SimulatedDevice project, and select Add > Existing Item. イメージ ファイルを見つけ、それをプロジェクトに含めます。Find an image file and include it in your project. このチュートリアルでは、イメージ名が image.jpgという前提で説明します。This tutorial assumes the image is named image.jpg.

  2. イメージを右クリックし、 [プロパティ] を選択します。Right-click the image, and then select Properties. [出力ディレクトリにコピー][常にコピーする] に設定されていることを確認します。Make sure that Copy to Output Directory is set to Copy always.

    [出力ディレクトリにコピー] の画像のプロパティを更新する場所を示します

  3. Program.cs ファイルの先頭に、次のステートメントを追加します。In the Program.cs file, add the following statements at the top of the file:

    using System.IO;
    
  4. Program クラスに次のメソッドを追加します。Add the following method to the Program class:

    private static async void SendToBlobAsync()
    {
        string fileName = "image.jpg";
        Console.WriteLine("Uploading file: {0}", fileName);
        var watch = System.Diagnostics.Stopwatch.StartNew();
    
        using (var sourceData = new FileStream(@"image.jpg", FileMode.Open))
        {
            await deviceClient.UploadToBlobAsync(fileName, sourceData);
        }
    
        watch.Stop();
        Console.WriteLine("Time to upload file: {0}ms\n", watch.ElapsedMilliseconds);
    }
    

    UploadToBlobAsync メソッドは、アップロードするファイルのファイル名とストリーム ソースを取り込み、ストレージへのアップロードを処理します。The UploadToBlobAsync method takes in the file name and stream source of the file to be uploaded and handles the upload to storage. コンソール アプリには、ファイルのアップロードにかかる時間が表示されます。The console app displays the time it takes to upload the file.

  5. Main メソッドの Console.ReadLine() の直前に次の行を追加します。Add the following line in the Main method, right before Console.ReadLine():

    SendToBlobAsync();
    

注意

わかりやすくするために、このチュートリアルでは再試行ポリシーは実装しません。For simplicity's sake, this tutorial does not implement any retry policy. 運用コードでは、「一時的な障害の処理」で推奨されているように、再試行ポリシー (エクスポネンシャル バックオフなど) を実装してください。In production code, you should implement retry policies, such as exponential backoff, as suggested in Transient fault handling.

IoT ハブ接続文字列を取得するGet the IoT hub connection string

この記事では、デバイスから IoT ハブへのテレメトリの送信に関するページで作成した IoT ハブからのファイル アップロード通知メッセージを受信するバックエンド サービスを作成します。In this article, you create a back-end service to receive file upload notification messages from the IoT hub you created in Send telemetry from a device to an IoT hub. ファイル アップロード通知メッセージを受信するサービスには、サービス接続のアクセス許可が必要となります。To receive file upload notification messages, your service needs the service connect permission. 既定では、どの IoT Hub も、このアクセス許可を付与する service という名前の共有アクセス ポリシーがある状態で作成されます。By default, every IoT Hub is created with a shared access policy named service that grants this permission.

サービス ポリシーの IoT Hub 接続文字列を取得するには、次の手順を実行します。To get the IoT Hub connection string for the service policy, follow these steps:

  1. Azure portal で、 [リソース グループ] を選択します。In the Azure portal, select Resource groups. ハブが配置されているリソース グループを選択し、リソースの一覧からハブを選択します。Select the resource group where your hub is located, and then select your hub from the list of resources.

  2. IoT ハブの左側のウィンドウで、 [共有アクセス ポリシー] を選択します。On the left-side pane of your IoT hub, select Shared access policies.

  3. ポリシーの一覧から、サービス ポリシーを選択します。From the list of policies, select the service policy.

  4. [共有アクセス キー] で、 [接続文字列 - プライマリ キー] のコピー アイコンを選択し、その値を保存します。Under Shared access keys, select the copy icon for the Connection string -- primary key and save the value.

    接続文字列を取得する方法を示す画面

IoT Hub の共有アクセス ポリシーとアクセス許可の詳細については、「アクセス制御とアクセス許可」を参照してください。For more information about IoT Hub shared access policies and permissions, see Access control and permissions.

ファイル アップロードの通知の受信Receive a file upload notification

このセクションでは、IoT Hub からファイル アップロードの通知メッセージを受信する .NET コンソール アプリケーションを作成します。In this section, you write a .NET console app that receives file upload notification messages from IoT Hub.

  1. 現在の Visual Studio ソリューションで、ファイル > 新規 > 、プロジェクト の順に選択します。In the current Visual Studio solution, select File > New > Project. [新しいプロジェクトの作成] で、 [コンソール アプリ (.NET Framework)] を選択してから、 [次へ] を選択します。In Create a new project, select Console App (.NET Framework), and then select Next.

  2. プロジェクトに ReadFileUploadNotificationという名前を付けます。Name the project ReadFileUploadNotification. [ソリューション] で、 [ソリューションに追加] を選択します。Under Solution, select Add to solution. [作成] を選択してプロジェクトを作成します。Select Create to create the project.

    Visual Studio で ReadFileUploadNotification プロジェクトを構成する

  3. ソリューション エクスプローラーで、 [ReadFileUploadNotification] プロジェクトを右クリックし、 [NuGet パッケージの管理] を選択します。In Solution Explorer, right-click the ReadFileUploadNotification project, and select Manage NuGet Packages.

  4. NuGet パッケージ マネージャーで、 [参照] を選択します。In NuGet Package Manager, select Browse. [Microsoft.Azure.Devices] を検索して選択した後、 [インストール] を選択します。Search for and select Microsoft.Azure.Devices, and then select Install.

    この手順によって Azure IoT サービス SDK NuGet パッケージがダウンロードしてインストールされ、その参照が ReadFileUploadNotification プロジェクトに追加されます。This step downloads, installs, and adds a reference to the Azure IoT service SDK NuGet package in the ReadFileUploadNotification project.

  5. このプロジェクトの Program.cs ファイルで、ファイルの先頭に次のステートメントを追加します。In the Program.cs file for this project, add the following statement at the top of the file:

    using Microsoft.Azure.Devices;
    
  6. Program クラスに次のフィールドを追加します。Add the following fields to the Program class. プレースホルダー {iot hub connection string} の値を、先ほど「IoT ハブ接続文字列を取得する」でコピーしておいた IoT ハブ接続文字列に置き換えます。Replace the {iot hub connection string} placeholder value with the IoT hub connection string that you copied previously in Get the IoT hub connection string:

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    
  7. Program クラスに次のメソッドを追加します。Add the following method to the Program class:

    private async static void ReceiveFileUploadNotificationAsync()
    {
        var notificationReceiver = serviceClient.GetFileNotificationReceiver();
    
        Console.WriteLine("\nReceiving file upload notification from service");
        while (true)
        {
            var fileUploadNotification = await notificationReceiver.ReceiveAsync();
            if (fileUploadNotification == null) continue;
    
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("Received file upload notification: {0}", 
              string.Join(", ", fileUploadNotification.BlobName));
            Console.ResetColor();
    
            await notificationReceiver.CompleteAsync(fileUploadNotification);
        }
    }
    

    この受信パターンは、クラウドからデバイスへのメッセージをデバイス アプリから受信するために使用するものと同じであることに注意してください。Note this receive pattern is the same one used to receive cloud-to-device messages from the device app.

  8. 最後に、Main メソッドに次の行を追加します。Finally, add the following lines to the Main method:

    Console.WriteLine("Receive file upload notifications\n");
    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    ReceiveFileUploadNotificationAsync();
    Console.WriteLine("Press Enter to exit\n");
    Console.ReadLine();
    

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

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

  1. ソリューション エクスプローラーで、ソリューションを右クリックし、 [スタートアップ プロジェクトの設定] を選択します。In Solutions Explorer, right-click your solution, and select Set StartUp Projects.

  2. [共通プロパティ] > [スタートアップ プロジェクト] で、 [マルチ スタートアップ プロジェクト] を選択してから、 [ReadFileUploadNotification][SimulatedDevice][開始] アクションを選択します。In Common Properties > Startup Project, select Multiple startup projects, then select the Start action for ReadFileUploadNotification and SimulatedDevice. [OK] を選択して変更を保存します。Select OK to save your changes.

  3. F5キーを押します。Press F5. 両方のアプリケーションが開始されます。Both applications should start. 1 つのコンソール アプリケーションでアップロードの完了が表示され、もう 1 つのコンソール アプリケーションでアップロード通知メッセージが受信されます。You should see the upload completed in one console app and the upload notification message received by the other console app. Azure Portal または Visual Studio サーバー エクスプローラーを使用して、Azure Storage アカウントにアップロードされたファイルがあるかどうかを確認できます。You can use the Azure portal or Visual Studio Server Explorer to check for the presence of the uploaded file in your Azure Storage account.

    出力の表示画面のスクリーンショット

次のステップ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:

IoT Hub の機能を詳しく調べるには、次のリンクを使用してください。To further explore the capabilities of IoT Hub, see: