次の方法で共有


IoT Edge の透過的なゲートウェイを経由してデバイスを接続する方法

IoT Edge デバイスは、ローカル ネットワーク上の他のデバイスと IoT Central アプリケーションの間の接続を提供するゲートウェイとして機能できます。 ゲートウェイは、デバイスから IoT Central アプリケーションに直接アクセスできない場合に使用します。

IoT Edge では、透過的変換のゲートウェイ パターンがサポートされています。 この記事では、透過的ゲートウェイ パターンを実装する方法の概要を示します。 このパターンでは、ゲートウェイは、ダウンストリーム デバイスから IoT Central アプリケーションの IoT Hub エンドポイントにメッセージを渡します。 ゲートウェイは、メッセージを通すときに操作しません。 IoT Central では、各ダウンストリーム デバイスはゲートウェイ デバイスの子として表示されます。

Diagram that shows IoT Edge as a transparent gateway.

わかりやすくするために、この記事では、ダウンストリーム デバイスとゲートウェイ デバイスのホストに仮想マシンを使います。 実際のシナリオでは、ダウンストリーム デバイスとゲートウェイはローカル ネットワーク上の物理デバイス上で実行されます。

この記事では、IoT Edge 1.4 ランタイムを使ってシナリオを実装する方法について説明します。

前提条件

この記事の手順を完了するには、次のものが必要です。

この記事の手順を実行するには、次のファイルをコンピューターにダウンロードします。

配置マニフェストをインポートする

すべての IoT Edge デバイスには、IoT Edge ランタイムを構成するための配置マニフェストが必要です。 IoT Edge 透過的なゲートウェイの配置マニフェストをインポートするには:

  1. [Edge マニフェスト] に移動します。

  2. [+ 新規] を選択し、配置マニフェストの名前 (透過的なゲートウェイなど) を入力してから、前にダウンロードした EdgeTransparentGatewayManifest.json ファイルをアップロードします。

  3. [作成] を選択して、配置マニフェストをアプリケーションに保存します。

デバイス テンプレートの追加

ダウンストリーム デバイスとゲートウェイ デバイスの両方が、IoT Central のデバイス テンプレートを使用できます。 IoT Central を使用して、ダウンストリーム デバイスとゲートウェイ間の関係をモデル化し、それらが接続された後にそれらを表示および管理することができます。 ダウンストリーム デバイスをゲートウェイに接続するためにデバイス テンプレートは必要ありません。

ダウンストリーム デバイスのデバイス テンプレートを作成するには、デバイスの機能をモデル化する標準のデバイス テンプレートを作成します。 この記事で紹介する例では、ダウンロードしたサーモスタット デバイス モデルを使っています。

ダウンストリーム デバイスのデバイス テンプレートを作成するには、次のようにします。

  1. デバイス テンプレートを作成し、テンプレートの種類として [IoT デバイス] を選択します。

  2. ウィザードの [カスタマイズ] ページで、デバイス テンプレートの名前 (Thermostat など) を入力します。

  3. デバイス テンプレートを作成したら、[Import a model]\(モデルのインポート\) を選択します。 以前にダウンロードした thermostat-1.json ファイルなどのモデルを選択します。

  4. サーモスタット用の既定のビューを生成するには、ビューを選択してから [既定のビューを生成する] を選択します。

  5. デバイス テンプレートを発行する。

IoT Edge の透過的なゲートウェイ デバイス用にデバイス テンプレートを作成するには

  1. デバイス テンプレートを作成し、テンプレートの種類として [Azure IoT Edge] を選択します。

  2. ウィザードの [カスタマイズ] ページで、デバイス テンプレートの名前 (Edge Gateway など) を入力します。

  3. ウィザードの [カスタマイズ] ページで、[これはゲートウェイ デバイスです] をオンにします。

  4. [Review](レビュー) ページで、 [Create](作成) を選択します。

  5. [モデルの作成] ページで、[カスタム モデル] を選びます。

  6. [Relationships]\(関係\) のエントリをダウンストリーム デバイス テンプレートに追加します。

次のスクリーンショットは、サーモスタット デバイス テンプレートを使用するダウンストリーム デバイスがある IoT Edge ゲートウェイ デバイスの [関係] ページを示しています。

Screenshot showing IoT Edge gateway device template relationship with a thermostat downstream device template.

前のスクリーンショットは、モジュールが定義されていない IoT Edge ゲートウェイ デバイス テンプレートを示しています。 IoT Edge ランタイムによって、ダウンストリーム デバイスから IoT Central にメッセージが直接転送されるため、透過的なゲートウェイにはモジュールは必要ありません。 ゲートウェイ自体でテレメトリを送信したり、プロパティを同期したり、コマンドを処理したりする必要がある場合は、これらの機能をルート コンポーネントまたはモジュールで定義できます。

クラウドのプロパティとビューで必要なものがあれば、ゲートウェイとダウンストリーム デバイスのテンプレートを発行する前に追加します。

デバイスの追加

デバイスを IoT Central アプリケーションに追加するときに、ダウンストリーム デバイスと透過的なゲートウェイの間の関係を定義できます。

デバイスを追加するには、次の手順を実行します。

  1. IoT Central アプリケーションのデバイス ページにアクセスします。

  2. 透過的なゲートウェイの IoT Edge デバイスのインスタンスを追加します。 デバイスを追加するときは、必ず透過的なゲートウェイの配置マニフェストを選択してください。 この記事では、ゲートウェイ デバイス ID は edgegateway です。

  3. ダウンストリーム デバイスの 1 つ以上のインスタンスを追加します。 この記事では、ダウンストリーム デバイスは ID が thermostat1thermostat2 であるサーモスタットです。

  4. デバイスの一覧で、それぞれのダウンストリーム デバイスを選択して [ゲートウェイに接続] を選択します。

次のスクリーンショットは、ゲートウェイに接続されているデバイスの一覧を [ダウンストリーム デバイス] ページで表示できることを示しています。

Screenshot that shows the list of downstream devices connected to a transparent gateway.

透過的なゲートウェイでは、ダウンストリーム デバイスはゲートウェイ自体に接続し、ゲートウェイによってホストされるカスタム モジュールには接続しません。

デバイスをデプロイする前に、次のものが必要です。

  • IoT Central アプリケーションの ID スコープ
  • ゲートウェイとダウンストリーム デバイスのデバイス ID の値。
  • ゲートウェイとダウンストリーム デバイスの主キーの値。

これらの値を確認するには、デバイスの一覧で各デバイスにアクセスして [接続] を選択します。 続行する前に、これらの値をメモしておきます。

ヒント

最初にデバイスのデバイス テンプレートを作成しなくても、デバイスを接続して関係を確立することができます。 未割り当てのダウンストリーム デバイスを、未割り当てのゲートウェイ デバイスに接続できます。

ゲートウェイとデバイスのデプロイ

このシナリオを試すことができるよう、次の手順では、ゲートウェイとダウンストリーム デバイスを Azure 仮想マシンにデプロイする方法を示しています。

ヒント

IoT Edge ランタイムを物理デバイスにデプロイする方法については、IoT Edge ドキュメントの「IoT Edge デバイスを作成する」を参照してください。

透過的なゲートウェイのシナリオを試すには、次のボタンを選択して 2 つの Linux 仮想マシンをデプロイします。 1 つの仮想マシンには IoT Edge 1.4 ランタイムがインストールされており、透過的な IoT Edge ゲートウェイです。 もう 1 つの仮想マシンは、シミュレートされたサーモスタット テレメトリを送信するコードを実行するダウンストリーム デバイスです。

Deploy to Azure Button

2 つの仮想マシンがデプロイされて実行状態になったら、IoT Edge ゲートウェイ デバイスが edgegateway 仮想マシンで実行されていることを確認します。

  1. IoT Central アプリケーションの [デバイス] ページにアクセスします。 IoT Edge ゲートウェイ デバイスが IoT Central に接続されている場合、そのステータスは "プロビジョニング済み" です。

  2. IoT Edge ゲートウェイ デバイスを開き、[モジュール] ページでモジュールのステータスを確認します。 IoT Edge ランタイムが正常に開始された場合、$edgeAgent および $edgeHub モジュールのステータスは "実行中" です。

    Screenshot showing the $edgeAgent and $edgeHub version 1.4 modules running on the IoT Edge gateway.

    ヒント

    仮想マシンが起動してデバイスが IoT Central アプリケーションでプロビジョニングされる間、数分待つことが必要な場合があります。

ゲートウェイを構成する

IoT Edge デバイスが透過的なゲートウェイとして機能するためには、あらゆるダウンストリーム デバイスに対してその ID を証明するための証明書がいくつか必要です。 この記事ではデモ証明書を使用します。 運用環境では、利用している証明機関からの証明書を使用してください。

デモ証明書を生成してゲートウェイ デバイスにインストールするには、次のようにします。

  1. SSH を使用して、ゲートウェイ デバイスの仮想マシンに接続してサインインします。

  2. 次のコマンドを実行して、IoT Edge リポジトリをクローンし、デモ証明書を生成します。

    # Clone the repo
    cd ~
    git clone https://github.com/Azure/iotedge.git
    
    # Generate the demo certificates
    mkdir certs
    cd certs
    cp ~/iotedge/tools/CACertificates/*.cnf .
    cp ~/iotedge/tools/CACertificates/certGen.sh .
    ./certGen.sh create_root_and_intermediate
    ./certGen.sh create_edge_device_ca_certificate "mycacert"
    

    上記のコマンドを実行すると、後続の手順で下記のファイルを使用する準備が整います。

    • ~/certs/certs/azure-iot-test-only.root.ca.cert.pem - IoT Edge シナリオをテストするための、その他すべてのデモ用証明書を作成するために使用されるルート CA 証明書。
    • ~/certs/certs/iot-edge-device-mycacert-full-chain.cert.pem - IoT Edge 構成ファイルから参照されるデバイス CA 証明書。 ゲートウェイのシナリオでは、IoT Edge デバイスはこの CA 証明書によって、ダウンストリーム デバイスに対して自らの ID を検証します。
    • ~/certs/private/iot-edge-device-mycacert.key.pem - デバイス CA 証明書に関連付けられた秘密キー。

    これらのデモ証明書の詳細については、「IoT Edge デバイスの機能をテストするためのデモ用の証明書を作成する」を参照してください。

  3. config.toml ファイルをテキスト エディターで開きます。 次に例を示します。

    sudo nano /etc/aziot/config.toml
    
  4. 構成ファイルで次の設定を見つけます。 証明書の設定を次のように変更します。

    trust_bundle_cert = "file:///home/AzureUser/certs/certs/azure-iot-test-only.root.ca.cert.pem"
    
    [edge_ca]
    cert = "file:///home/AzureUser/certs/certs/iot-edge-device-ca-mycacert-full-chain.cert.pem"
    pk = "file:///home/AzureUser/certs/private/iot-edge-device-ca-mycacert.key.pem"
    

    前の例では、AzureUser としてサインイン済みであり、"mycacert" という名前のデバイス CA 証明書が作成済みであると想定しています。

  5. 変更を保存して IoT Edge ランタイムを再起動します。

    sudo iotedge config apply
    

変更後に IoT Edge ランタイムが正常に起動すると、IoT Central で、対象のゲートウェイ デバイスの [モジュール] ページにおいて $edgeAgent および $edgeHub モジュールのステータスが "実行中" に変わります。

ランタイムが起動しない場合は、IoT Edge 構成ファイルで行った変更を確認し、「IoT Edge デバイスのトラブルシューティング」を参照してください。

透過的なゲートウェイが構成され、ダウンストリーム デバイスからテレメトリの転送を開始する準備ができました。

ダウンストリーム デバイスのプロビジョニング

IoT Central は、IoT Central でデバイスをプロビジョニングするために Device Provisioning Service (DPS) を利用しています。 現時点では、IoT Edge で DPS を使ってダウンストリーム デバイスを IoT Central アプリケーションにプロビジョニングすることはできません。 次の手順は、手動で thermostat1 デバイスをプロビジョニングする方法を示しています。 これらの手順を完了するには、Python がインストールされ、インターネットに接続されている環境が必要です。 現在の Python バージョンの要件については、Azure IoT Python SDK を確認してください。 Azure Cloud Shell には Python がペレプレインストールされています:

  1. 次のコマンドを実行して、azure.iot.device モジュールをインストールします。

    pip install azure.iot.device
    
  2. 次のコマンドを実行して、デバイス プロビジョニングを実行する Python スクリプトをダウンロードします。

    wget https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/transparent-gateway-1-4/provision_device.py
    
  3. IoT Central アプリケーションで thermostat1 ダウンストリーム デバイスをプロビジョニングするには、次のコマンドを実行します。{your application id scope}{your device primary key} は適宜置き換えてください。 IoT Central アプリケーションにデバイスを追加するときに、次の値をメモしました。

    export IOTHUB_DEVICE_DPS_DEVICE_ID=thermostat1
    export IOTHUB_DEVICE_DPS_ID_SCOPE={your application id scope}
    export IOTHUB_DEVICE_DPS_DEVICE_KEY={your device primary key}
    python provision_device.py
    

IoT Central アプリケーションで、thermostat1 デバイスの [デバイスの状態] が "プロビジョニング済み" になっていることを確認します。

ダウンストリームのデバイスを構成する

前のセクションでは、デモ証明書を使用して edgegateway 仮想マシンを構成し、ゲートウェイとして実行できるようにしました。 leafdevice 仮想マシンは、ゲートウェイを使用して IoT Central に接続するサーモスタット シミュレーターをインストールする準備ができています。

leafdevice 仮想マシンには、edgegateway 仮想マシン上で作成したルート CA 証明書のコピーが必要です。 edgegateway 仮想マシンの /home/AzureUser/certs/certs/azure-iot-test-only.root.ca.cert.pem ファイルを、leafdevice 仮想マシンの home ディレクトリにコピーします。 scp コマンドを使用して、Linux 仮想マシンとの間でファイルをコピーできます。 たとえば、leafdevice マシンから:

scp AzureUser@edgegateway:/home/AzureUser/certs/certs/azure-iot-test-only.root.ca.cert.pem .

ダウンストリーム デバイスからゲートウェイへの接続を確認する方法については、「ゲートウェイ接続をテストする」を参照してください。

leafdevice 仮想マシン上でサーモスタット シミュレーターを実行するには、次のようにします。

  1. SSH を使用して、leafdevice の仮想マシンに接続してサインインします。

  2. Python サンプルをホーム ディレクトリにダウンロードします。

    cd ~
    wget https://raw.githubusercontent.com/Azure-Samples/iot-central-docs-samples/main/transparent-gateway-1-4/simple_thermostat.py
    
  3. Azure IoT デバイスの Python モジュールをインストールします。

    sudo apt update
    sudo apt install python3-pip
    pip3 install azure.iot.device
    
  4. サンプルを構成するための環境変数を設定します。 {your device shared key} は、以前にメモしておいた thermostat1 の主キーに置き換えてください。 これらの変数では、ゲートウェイ仮想マシンの名前が edgegateway、サーモスタット デバイスの ID が thermostat1 であると想定しています。

    export IOTHUB_DEVICE_SECURITY_TYPE=connectionString
    export IOTHUB_DEVICE_CONNECTION_STRING="HostName=edgegateway;DeviceId=thermostat1;SharedAccessKey={your device shared key}"
    export IOTEDGE_ROOT_CA_CERT_PATH=~/azure-iot-test-only.root.ca.cert.pem
    

    接続文字列で、IoT ハブの名前ではなくゲートウェイ デバイスの名前を使用していることに注目してください。

  5. コードを実行するには、次のコマンドを使用します。

    python3 simple_thermostat.py
    

    このコマンドの出力は次のようになります。

    Connecting using Connection String HostName=edgegateway;DeviceId=thermostat1;SharedAccessKey={your device shared key}
    Listening for command requests and property updates
    Press Q to quit
    Sending telemetry for temperature
    Sent message
    Sent message
    Sent message
    ...
    

    ヒント

    ダウンストリーム デバイスが接続しようとしたときにエラーが表示される場合。 デバイス プロビジョニング手順を再実行してみてください。

  6. IoT Central でテレメトリを確認するには、thermostat1 デバイスの [概要] ページにアクセスします。

    Screenshot showing telemetry from the downstream device.

    [About]\(詳細情報\) ページでは、ダウンストリーム デバイスから送信されたプロパティ値を表示できます。[コマンド] ページでは、ダウンストリーム デバイスに対してコマンドを呼び出すことができます。