IoT Hub モジュール ID とモジュール ツイン (Node.js) の概要

モジュール ID とモジュール ツインは Azure IoT Hub のデバイス ID とデバイス ツインに類似していますが、より細かい粒度で設定できます。 Azure IoT Hub のデバイス ID とデバイス ツインを使用した場合、バックエンド アプリケーションからデバイスを構成し、デバイスの状態を可視化できるのに対し、モジュール ID とモジュール ツインでは、デバイスの各コンポーネントごとにこれらの機能を実現できます。 複数のコンポーネントで構成され、この機能をサポートしているデバイス (オペレーティング システム デバイスやファームウェア デバイスなど) であれば、各コンポーネントの状態を可視化し、個別に構成することができます。

注意

この記事で説明されている機能は、Standard レベルの IoT Hub でのみ使用できます。 Basic および Standard または Free の IoT Hub のレベルの詳細については、「ソリューションに適した IoT Hub のレベルを選択する」を参照してください。

この記事の最後には、次の 2 つの Node.js アプリが完成します。

  • CreateIdentities: ユーザーのデバイスおよびモジュール クライアントに接続するための、デバイス ID、モジュール ID、および関連づけられたセキュリティ キーを作成します。

  • UpdateModuleTwinReportedProperties: 更新されたモジュール ツインと報告されたプロパティを IoT ハブに送信します。

注意

デバイスとバックエンド アプリの両方の構築に使用できる SDK ツールに関する詳細については、「Azure IoT SDK」を参照してください。

前提条件

  • IoT Hub。 CLI または Azure portal を使って作成します。

  • Node.js バージョン 10.0.x 以降。 開発環境を準備するでは、このアーティクルのために Node.js を Windows または Linux にインストールする方法が説明されています。

モジュールの認証

モジュール ID の認証には、対称キーまたは X.509 証明書を使用することができます。 X.509 証明書認証の場合、モジュールの証明書には、CN=<deviceid>/<moduleid> のような書式のモジュールの共通名が含まれている 必要があります。 次に例を示します。

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

IoT ハブ接続文字列を取得する

この記事では、ID レジストリにデバイスを追加してそのデバイスにモジュールを追加するバックエンド サービスを作成します。 サービスには、レジストリ書き込みのアクセス許可が必要です。 既定では、どの IoT ハブも、このアクセス許可を付与する registryReadWrite という名前の共有アクセス ポリシーがある状態で作成されます。

registryReadWrite ポリシーの IoT Hub 接続文字列を取得するには、次の手順を実行します。

  1. Azure portal で、 [リソース グループ] を選択します。 ハブが配置されているリソース グループを選択し、リソースの一覧からハブを選択します。

  2. ハブの左側のウィンドウで、 [共有アクセス ポリシー] を選択します。

  3. ポリシーの一覧から、 [registryReadWrite] ポリシーを選択します。

  4. [プライマリ接続文字列] をコピーし、値を保存します。

    接続文字列を取得する方法を示すスクリーン キャプチャ

IoT Hub の共有アクセス ポリシーとアクセス許可の詳細については、「アクセス制御とアクセス許可」を参照してください。

IoT Hub でデバイス ID とモジュール ID を作成する

このセクションでは、IoT ハブの ID レジストリにデバイス ID とモジュール ID を作成する Node.js アプリを作成します。 ID レジストリにエントリがない限り、デバイスまたはモジュールは IoT ハブに接続できません。 詳細については、「IoT Hub の ID レジストリを理解する」を参照してください。 このコンソール アプリを実行すると、デバイスとモジュール両方に対して一意のデバイス ID とキーが生成されます。 ID とキーは大文字と小文字が区別されます。 デバイスとモジュールは、IoT ハブに device-to-cloud メッセージを送信するときにこれらの値を使用して自分自身を識別します。

  1. コードを保持するためのディレクトリを作成します。

  2. そのディレクトリ内で最初に npm init -y を実行して、既定値で空の package.json を作成します。 これは、コードのプロジェクト ファイルです。

  3. npm install -S azure-iothub@modules-preview を実行して、node_modules サブディレクトリ内にサービス SDK をインストールします。

    注意

    サブディレクトリ名 node_modules では、"ノード ライブラリ" を意味する用語モジュールを使用します。 ここで言う用語は IoT Hub モジュールとは関係ありません。

  4. ディレクトリ内に次の .js ファイルを作成します。 これを add.js と呼びます。 ハブの接続文字列とハブ名をコピーして貼り付けます。

    var Registry = require('azure-iothub').Registry;
    var uuid = require('uuid');
    // Copy/paste your connection string and hub name here
    var serviceConnectionString = '<hub connection string from portal>';
    var hubName = '<hub name>.azure-devices.net';
    // Create an instance of the IoTHub registry
    var registry = Registry.fromConnectionString(serviceConnectionString);
    // Insert your device ID and moduleId here.
    var deviceId = 'myFirstDevice';
    var moduleId = 'myFirstModule';
    // Create your device as a SAS authentication device
    var primaryKey = new Buffer(uuid.v4()).toString('base64');
    var secondaryKey = new Buffer(uuid.v4()).toString('base64');
    var deviceDescription = {
      deviceId: deviceId,
      status: 'enabled',
      authentication: {
        type: 'sas',
        symmetricKey: {
          primaryKey: primaryKey,
          secondaryKey: secondaryKey
        }
      }
    };
    
    // First, create a device identity
    registry.create(deviceDescription, function(err) {
      if (err) {
        console.log('Error creating device identity: ' + err);
        process.exit(1);
      }
      console.log('device connection string = "HostName=' + hubName + ';DeviceId=' + deviceId + ';SharedAccessKey=' + primaryKey + '"');
    
      // Then add a module to that device
      registry.addModule({ deviceId: deviceId, moduleId: moduleId }, function(err) {
        if (err) {
          console.log('Error creating module identity: ' + err);
          process.exit(1);
        }
    
        // Finally, retrieve the module details from the hub so we can construct the connection string
        registry.getModule(deviceId, moduleId, function(err, foundModule) {
          if (err) {
            console.log('Error getting module back from hub: ' + err);
            process.exit(1);
          }
          console.log('module connection string = "HostName=' + hubName + ';DeviceId=' + foundModule.deviceId + ';ModuleId='+foundModule.moduleId+';SharedAccessKey=' + foundModule.authentication.symmetricKey.primaryKey + '"');
          process.exit(0);
        });
      });
    });
    
    

このアプリは、ID myFirstDevice のデバイス ID と ID myFirstModule のモジュール ID をデバイス myFirstDevice の下に作成します。 (そのモジュール ID が既に ID レジストリに存在する場合は、単にその既存のモジュール情報を取得します。)続けてその ID のプライマリ キーが表示されます。 シミュレートされたモジュール アプリでこのキーを使用し、IoT ハブに接続します。

ノード add.js を使用してこれを実行します。 これにより、デバイス ID とモジュール ID の各接続文字列を取得できます。

注意

IoT ハブの ID レジストリには、IoT ハブに対するセキュリティで保護されたアクセスを有効にするためのデバイス ID とモジュール ID のみが格納されます。 ID レジストリには、セキュリティ資格情報として使用されるデバイス ID とキーが格納されます。 ID レジストリには、そのデバイスのアクセスを無効にするために使用できる各デバイスの有効/無効フラグも格納されます。 その他デバイス固有のメタデータをアプリケーションで保存する必要がある場合は、アプリケーション固有のストアを使用する必要があります。 モジュール ID 用の有効/無効フラグはありません。 詳細は、「IoT Hub 開発者ガイドの IoT Hub への ID レジストリの理解」を参照してください。

Node.js デバイス SDK を使用してモジュール ツインを更新する

このセクションでは、モジュール ツインによって報告されるプロパティを更新する Node.js アプリをシミュレートされたデバイス上に作成します。

  1. モジュールの接続文字列を取得します。 Azure portal にサインインします。 お使いの IoT Hub に移動し、[IoT デバイス] を選択します。 myFirstDevice を検索して開くと、myFirstModule が正常に作成されていることを確認できます。 モジュールの接続文字列をコピーします。 これは、次の手順で必要になります。

    Azure Portal モジュールの詳細

  2. 前のセクションで行ったように、デバイス コードのディレクトリを作成し、NPM を使用してこれを初期化して、デバイス SDK (npm install -S azure-iot-device-amqp@modules-preview) をインストールします。

    注意

    npm install コマンドが遅くなったように感じる場合があります。 パッケージ リポジトリから大量のコードがプル ダウンされますので、しばらくお待ちください。

    注意

    json の解析中に npm ERR! レジストリ エラーが発生したというエラーが表示されたら、 そのエラーは無視できます。 json の解析中に npm ERR! レジストリ エラーが発生したというエラーが表示されたら、 そのエラーは無視できます。

  3. twin.js という名前でファイルを作成します。 モジュールの ID 文字列をコピーして貼り付けます。

    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-amqp').Amqp;
    // Copy/paste your module connection string here.
    var connectionString = '<insert module connection string here>';
    // Create a client using the Amqp protocol.
    var client = Client.fromConnectionString(connectionString, Protocol);
    client.on('error', function (err) {
      console.error(err.message);
    });
    // connect to the hub
    client.open(function(err) {
      if (err) {
        console.error('error connecting to hub: ' + err);
        process.exit(1);
      }
      console.log('client opened');
    // Create device Twin
      client.getTwin(function(err, twin) {
        if (err) {
          console.error('error getting twin: ' + err);
          process.exit(1);
        }
        // Output the current properties
        console.log('twin contents:');
        console.log(twin.properties);
        // Add a handler for desired property changes
        twin.on('properties.desired', function(delta) {
            console.log('new desired properties received:');
            console.log(JSON.stringify(delta));
        });
        // create a patch to send to the hub
        var patch = {
          updateTime: new Date().toString(),
          firmwareVersion:'1.2.1',
          weather:{
            temperature: 72,
            humidity: 17
          }
        };
        // send the patch
        twin.properties.reported.update(patch, function(err) {
          if (err) throw err;
          console.log('twin state reported');
        });
      });
    });
    
  4. 次に、コマンド node twin.js を使用してこれを実行します。

    F:\temp\module_twin>node twin.js
    

    すると、次のように表示されます。

    client opened
    twin contents:
    { reported: { update: [Function: update], '$version': 1 },
      desired: { '$version': 1 } }
    new desired properties received:
    {"$version":1}
    twin state reported
    

次のステップ

引き続き IoT Hub の使用方法を確認すると共に、他の IoT のシナリオについて調べるには、次のページを参照してください。