シナリオ: ゲートウェイを使用した間接接続デバイスのデジタル・ツインの作成

共有ゲートウェイを介してテレメトリおよびコマンドをルーティングできるように、デジタル・ツイン・モデル、アダプタ、ゲートウェイ、直接および間接デバイスのデジタル・ツイン・インスタンスを作成します。

このシナリオを使用して、1つの再利用可能なゲートウェイ、1つの直接接続デバイスおよび複数の間接接続デバイスを作成します。

このシナリオを説明するために、例は次のような小規模な建物暖房、換気および空調システム(HVAC)をモデル化します。
  • Bosch Gateway 1という名前のゲートウェイは、IoTドメインに対して認証を行い、HVACユニット、ボイラー、除湿器などのデバイスのデータを収集またはルーティングします。
  • 直接接続された HVACインスタンスには、独自のテレメトリを送信するデバイスが表示されます。
  • 間接的に接続された HVAC、ボイラー、および除湿器インスタンスは、テレメトリとコマンドが代わりにゲートウェイを通過するデバイスを表示します。

その他の概念については、Indirectly Connected Devices FAQを参照してください。

図を確認して、ゲートウェイ、直接接続されたデバイスおよび間接接続されたデバイスが、3種類のデジタル・ツイン・インスタンスとどのように相互作用するかを理解します。

デジタルツインインスタンス

ステップ1: デジタル・ツイン・モデルの作成

シナリオのデバイス・タイプごとに、ゲートウェイ用のデジタル・ツイン・モデルとデジタル・ツイン・モデルを1つ作成します。これらのデバイスは構造化データを生成します。

gateway-model.jsonhvac-model.jsonおよびboiler-model.jsonの各ファイルを保存するには、次のスニペットを使用します。

  • 保存したモデル・ファイルをアップロードする場合、または仕様を直接貼り付ける場合は、コンソールを使用します。

    1. 「IoTドメイン」リスト・ページで、操作するドメインを開きます。IoTドメイン・リスト・ページの検索に関するヘルプが必要な場合は、IoTドメインのリストまたは新しいIoTドメインの作成を参照してください。
    2. 「デジタル・ツイン・モデル」タブを選択し、「作成」を選択します。
    3. 名前と説明(オプション)を入力します。機密情報を入力しないでください。
    4. 「仕様のアップロード」または「仕様の貼付け」を選択し、このシナリオのサンプル・ファイルの1つを使用します。
    5. オプション: タグを追加します。
    6. 「作成」を選択します。

    仕様をアップロードまたは貼り付ける場合は、次のいずれかのファイルを使用します。

    ゲートウェイモデル.json
    {
      "@context": [
        "dtmi:dtdl:context;3"
      ],
      "@id": "dtmi:com:oracle:example:gateway;1",
      "@type": "Interface",
      "displayName": "Gateway",
      "description": "A digital twin model for Gateway",
      "contents": [
        {
          "@type": "Telemetry",
          "name": "cpuUtilization",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "memoryUtilization",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "storageUtilization",
          "schema": "integer"
        },
        {
          "@type": "Property",
          "name": "firmwareVersion",
          "schema": "string"
        }
      ]
    }
    hvacモデル.json
    {
      "@context": [
        "dtmi:dtdl:context;3"
      ],
      "@id": "dtmi:com:oracle:example:hvac;1",
      "@type": "Interface",
      "displayName": "HVAC",
      "description": "A digital twin model for HVAC",
      "contents": [
        {
          "@type": "Telemetry",
          "name": "temperature",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "humidity",
          "schema": "integer"
        }
      ]
    }
    ボイラーモデル.json
    {
      "@context": [
        "dtmi:dtdl:context;3"
      ],
      "@id": "dtmi:com:oracle:example:boiler;1",
      "@type": "Interface",
      "displayName": "Boiler",
      "description": "A digital twin model for Boiler",
      "contents": [
        {
          "@type": "Telemetry",
          "name": "temperature",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "pressure",
          "schema": "integer"
        }
      ]
    }
  • IoTドメインに各デジタル・ツイン・モデルを作成するには、oci iot digital-twin-model createコマンドを使用します。

    ゲートウェイ・モデルの作成

    oci iot digital-twin-model create \
      --iot-domain-id <iot-domain-OCID> \
      --spec file://gateway-model.json

    HVACモデルの作成

    oci iot digital-twin-model create \
      --iot-domain-id <iot-domain-OCID> \
      --spec file://hvac-model.json

    ボイラー・モデルの作成

    oci iot digital-twin-model create \
      --iot-domain-id <iot-domain-OCID> \
      --spec file://boiler-model.json

    この例では、これらのスニペットをgateway-model.jsonhvac-model.jsonおよびboiler-model.jsonというモデル・ファイルに保存します。

    ゲートウェイモデル.json
    {
      "@context": [
        "dtmi:dtdl:context;3"
      ],
      "@id": "dtmi:com:oracle:example:gateway;1",
      "@type": "Interface",
      "displayName": "Gateway",
      "description": "A digital twin model for Gateway",
      "contents": [
        {
          "@type": "Telemetry",
          "name": "cpuUtilization",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "memoryUtilization",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "storageUtilization",
          "schema": "integer"
        },
        {
          "@type": "Property",
          "name": "firmwareVersion",
          "schema": "string"
        }
      ]
    }
    hvacモデル.json
    {
      "@context": [
        "dtmi:dtdl:context;3"
      ],
      "@id": "dtmi:com:oracle:example:hvac;1",
      "@type": "Interface",
      "displayName": "HVAC",
      "description": "A digital twin model for HVAC",
      "contents": [
        {
          "@type": "Telemetry",
          "name": "temperature",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "humidity",
          "schema": "integer"
        }
      ]
    }
    ボイラーモデル.json
    {
      "@context": [
        "dtmi:dtdl:context;3"
      ],
      "@id": "dtmi:com:oracle:example:boiler;1",
      "@type": "Interface",
      "displayName": "Boiler",
      "description": "A digital twin model for Boiler",
      "contents": [
        {
          "@type": "Telemetry",
          "name": "temperature",
          "schema": "integer"
        },
        {
          "@type": "Telemetry",
          "name": "pressure",
          "schema": "integer"
        }
      ]
    }
  • CreateDigitalTwinModel操作を実行して、IoTドメインにデジタル・ツイン・モデルを作成します。

    APIをコールするときは、サンプル・デジタル・ツイン・モデル・ファイルに示されているものと同じDTDLペイロードを使用します。

ステップ2: デジタルツインアダプタを作成する

ゲートウェイ用に1つのアダプタを作成し、ペイロード・マッピングを必要とする構造化デバイス・タイプごとに1つのアダプタを作成します。

gateway-envelope.jsongateway-routes.jsonhvac-envelope.jsonhvac-routes.jsonboiler-envelope.jsonおよびboiler-routes.jsonの各ファイルを保存するには、次のスニペットを使用します。

インバウンド・エンベロープ内のターゲットの解決

転送されたすべてのデバイス・メッセージが同じトピックまたはペイロード規則に従っている場合、ゲートウェイ・アダプタはターゲットのデジタル・ツイン・インスタンスを識別できます。ゲートウェイはそれ自体として認証され、解決されたターゲットがそのゲートウェイに関連付けられた間接的に接続されたデジタル・ツイン・インスタンスであることを確認してから、構造化マッピングが必要な場合、サービスはペイロードをターゲット・デバイスのアダプタに委任します。

ゲートウェイは、ルートが実行される前に、メッセージ全体に対してtargetおよびcontentRootを1回解決します。targetが間接的に接続されたデバイスの外部キーに解決されると、ペイロードはそのデバイスに委任されます。targetが空またはnullの場合、メッセージはゲートウェイ・データとして扱われます。

  • 受信ペイロードをターゲット・デジタル・ツイン・モデルにマップする必要がある場合は、デジタル・ツイン・アダプタを使用します。デバイスが非構造化データを送信する場合、デジタル・ツイン・アダプタは不要で、変更せずにデータを渡すことができます。

    1. 「IoTドメイン」リスト・ページで、操作するドメインを開きます。
    2. 「デジタル・ツイン・アダプタ」タブを選択し、「作成」を選択します。
    3. 「名前」およびオプションの「説明」を入力します。機密情報を入力しないでください。
    4. マッピングするペイロードと一致するデジタル・ツイン・モデルを選択します。
    5. 「インバウンド・エンベロープおよびルートの指定」をオンにして、エンベロープJSONをアップロードまたは貼り付け、アダプタのJSONをルーティングします。
    6. オプション: タグを追加します。
    7. 「作成」を選択します。

    これらのゲートウェイ・ファイルを使用してゲートウェイ・アダプタを作成します。

    ゲートウェイエンベロープ.json
    {
      "referenceEndpoint": "/data",
      "referencePayload": {
        "dataFormat": "JSON",
        "data": {
          "time": 1773768299143534,
          "cpuUtil": 0,
          "memUtil": 0,
          "diskUtil": 0,
          "firmware": "Oracle Linux 9.1"
        }
      },
      "envelopeMapping": {
        "timeObserved": "$.time",
        "target": "${if ([\"boilers\", \"hvacs\", \"dehumidifiers\"] | contains([endpoint(1)])) then endpoint(2) else null end}",
        "contentRoot": "$"
      }
    }
    ゲートウェイルート.json
    [
      {
        "condition": "*",
        "payloadMapping": {
          "$.cpuUtilization": "$.cpuUtil",
          "$.memoryUtilization": "$.memUtil",
          "$.storageUtilization": "$.diskUtil",
          "$.firmwareVersion": "$.firmware"
        }
      }
    ]

    一致するデバイス・ファイルを使用してHVACアダプタおよびボイラー・アダプタを作成します。

    hvac-envelope.json
    {
      "referenceEndpoint": "/telemetry",
      "referencePayload": {
        "dataFormat": "JSON",
        "data": {
          "time": 1773768299143534,
          "temperature": 0,
          "humidity": 0
        }
      },
      "envelopeMapping": {
        "timeObserved": "$.time"
      }
    }
    hvac-routes.json
    [
      {
        "condition": "*",
        "payloadMapping": {
          "$.temperature": "$.temperature",
          "$.humidity": "$.humidity"
        }
      }
    ]
    ボイラエンベロープ.json
    {
      "referenceEndpoint": "/telemetry",
      "referencePayload": {
        "dataFormat": "JSON",
        "data": {
          "timestamp": 1773768299143534,
          "temperature": 0,
          "pressure": 0
        }
      },
      "envelopeMapping": {
        "timeObserved": "$.timestamp"
      }
    }
    ボイラ・ルート.json
    [
      {
        "condition": "*",
        "payloadMapping": {
          "$.temperature": "$.temperature",
          "$.pressure": "$.pressure"
        }
      }
    ]
  • IoTドメインに各アダプタを作成するには、oci iot digital-twin-adapter createコマンドを使用します。

    ゲートウェイ・アダプタの作成

    このコマンドを使用して、デジタル・ツイン・アダプタを作成します。この例では、DTMIを使用してデジタル・ツイン・モデルを関連付ける方法と、.jsonファイルを使用してエンベロープおよびルートを定義する方法を示します。

    oci iot digital-twin-adapter create \
      --iot-domain-id <iot-domain-OCID> \
      --digital-twin-model-spec-uri "dtmi:com:oracle:example:gateway;1" \
      --inbound-envelope file://gateway-envelope.json \
      --inbound-routes file://gateway-routes.json
    ゲートウェイエンベロープ.json
    {
      "referenceEndpoint": "/data",
      "referencePayload": {
        "dataFormat": "JSON",
        "data": {
          "time": 1773768299143534,
          "cpuUtil": 0,
          "memUtil": 0,
          "diskUtil": 0,
          "firmware": "Oracle Linux 9.1"
        }
      },
      "envelopeMapping": {
        "timeObserved": "$.time",
        "target": "${if ([\"boilers\", \"hvacs\", \"dehumidifiers\"] | contains([endpoint(1)])) then endpoint(2) else null end}",
        "contentRoot": "$"
      }
    }
    ゲートウェイルート.json
    [
      {
        "condition": "*",
        "payloadMapping": {
          "$.cpuUtilization": "$.cpuUtil",
          "$.memoryUtilization": "$.memUtil",
          "$.storageUtilization": "$.diskUtil",
          "$.firmwareVersion": "$.firmware"
        }
      }
    ]

    HVACアダプタを作成します

    このコマンドを使用して、デジタル・ツイン・アダプタを作成します。この例では、DTMIを使用してデジタル・ツイン・モデルを関連付ける方法と、.jsonファイルを使用してエンベロープおよびルートを定義する方法を示します。

    oci iot digital-twin-adapter create \
      --iot-domain-id <iot-domain-OCID> \
      --digital-twin-model-spec-uri "dtmi:com:oracle:example:hvac;1" \
      --inbound-envelope file://hvac-envelope.json \
      --inbound-routes file://hvac-routes.json
    hvac-envelope.json
    {
      "referenceEndpoint": "/telemetry",
      "referencePayload": {
        "dataFormat": "JSON",
        "data": {
          "time": 1773768299143534,
          "temperature": 0,
          "humidity": 0
        }
      },
      "envelopeMapping": {
        "timeObserved": "$.time"
      }
    }
    hvac-routes.json
    [
      {
        "condition": "*",
        "payloadMapping": {
          "$.temperature": "$.temperature",
          "$.humidity": "$.humidity"
        }
      }
    ]

    ボイラー・アダプタの作成

    このコマンドを使用して、デジタル・ツイン・アダプタを作成します。この例では、DTMIを使用してデジタル・ツイン・モデルを関連付ける方法と、.jsonファイルを使用してエンベロープおよびルートを定義する方法を示します。

    oci iot digital-twin-adapter create \
      --iot-domain-id <iot-domain-OCID> \
      --digital-twin-model-spec-uri "dtmi:com:oracle:example:boiler;1" \
      --inbound-envelope file://boiler-envelope.json \
      --inbound-routes file://boiler-routes.json
    ボイラエンベロープ.json
    {
      "referenceEndpoint": "/telemetry",
      "referencePayload": {
        "dataFormat": "JSON",
        "data": {
          "timestamp": 1773768299143534,
          "temperature": 0,
          "pressure": 0
        }
      },
      "envelopeMapping": {
        "timeObserved": "$.timestamp"
      }
    }
    ボイラ・ルート.json
    [
      {
        "condition": "*",
        "payloadMapping": {
          "$.temperature": "$.temperature",
          "$.pressure": "$.pressure"
        }
      }
    ]

    CLIからのファイルの参照の詳細は、「複雑な入力のためのJSONファイルの使用」を参照してください。

  • CreateDigitalTwinAdapter操作を実行して、IoTドメインにデジタル・ツイン・アダプタを作成します。

    サンプル・ファイルに示されているものと同じインバウンド・エンベロープおよびインバウンド・ルート・ペイロードを使用します。

ステップ3: ゲートウェイおよびデバイス・インスタンスの作成

最初にゲートウェイを作成して、間接的に接続されたデバイスを作成するときにゲートウェイを再利用できるようにします。

認証IDオプション:

  • デジタル・ツイン・インスタンスのテストでは、シークレットOCIDを認証IDとして使用する場合は、デバイス・ユーザー名を外部キーとして使用し、プレーン・テキストのシークレット・コンテンツをデバイス・パスワードとして使用します。手順については、シークレットの作成時にステップ7を参照し、すでに作成されているシークレットについては、シークレットのコンテンツの取得を参照してください。
  • 本番のデジタル・ツイン・インスタンスでは、認証IDとしてボールト・シークレットのかわりにmTLS証明書OCIDを使用します。mTLS証明書を使用する場合は、証明書詳細の共通名を外部キーとして使用する必要があります: --external-key <common-name-from-certificate-details>

  • コンソールを使用してゲートウェイを作成し、複数のデバイスをゲートウェイに関連付けます。

    コンソールには、IoTドメインのゲートウェイを作成する2つの方法があります。「デジタル・ツイン・インスタンス」タブからゲートウェイを作成するには、デジタル・ツイン・インスタンスの作成時にゲートウェイ・タイプを選択します。または、「ゲートウェイ」タブを選択してゲートウェイを作成できます。

    1. 「IoTドメイン」リスト・ページで、操作するIoTドメインを開きます。
    2. 「ゲートウェイ」タブを選択し、「作成」を選択して「ボッシュ・ゲートウェイ・インスタンス」を作成し、間接デバイスで使用できるようにします。
      • ゲートウェイの「名前」および「説明」を入力します。
      • 外部キーgateway1を入力します。
      • ステップ2で作成したgateway-envelope.jsonおよびgateway-routes.jsonを使用するアダプタを選択します。
      • 認証IDを選択するか、認証IDのOCIDを貼り付けて「作成」を選択します。
    3. 「IoTドメイン」ページで、「デジタル・ツイン・インスタンス」タブを選択し、「作成」を選択してから、タイプとして直接接続または間接接続を選択して、ステップ1およびステップ2で作成したモデルおよびアダプタを使用して、これらのデバイスのデジタル・ツイン・インスタンスを作成します:
      • LG HVACインスタンスと外部キー hvac1が直接接続されています。
      • 外部キーhvac2と間接的に接続されたHVACインスタンス
      • 外部キーboiler1と間接的に接続されたボイラー・インスタンス。
      • 外部キー dehumidifier1と間接的に接続された除湿器インスタンス。デフミディファイアは、構造化ペイロード・マッピングを必要としない非構造化生テレメトリを送信するため、デジタル・ツイン・アダプタまたはデジタル・ツイン・モデルを使用しません。また、ゲートウェイを介してrawコマンドを受信することもできます。
      ノート

      外部キーを入力しないと、外部キーが生成されます。
    4. 直接接続されたゲートウェイ・インスタンスの場合は、認証IDを選択します。
    5. 間接的に接続されたインスタンスの場合、デバイス認証資格証明を追加するのではなく、1つ以上の既存のゲートウェイを選択します。ワイヤレスデバイスがゲートウェイ間でローミングする場合、複数のゲートウェイを選択します。
    6. オプション: タグを追加します。
    7. デジタル・ツイン・インスタンスのサマリーを確認し、「作成」を選択します。
    デジタル・ツイン・インスタンスを作成した後、「ゲートウェイの詳細」ページを使用して、ゲートウェイに依存し、ゲートウェイに関連付けられているデバイスを表示します。
    • IoTドメイン・ページで「ゲートウェイの詳細」を検索するには、「ゲートウェイ」タブを選択してゲートウェイ・リストを表示し、ゲートウェイを選択してゲートウェイの詳細ページに移動します。
    • 「デジタル・ツイン・インスタンス」タブでは、タイプで検索して、IoTドメインの様々なデジタル・ツイン・インスタンス・タイプを表示できます。
    • デジタル・ツイン・インスタンス詳細ページから、直接的および間接的に接続されたデバイスを表示します。

    設定の完全なリストは、「デジタル・ツイン・インスタンスの作成」「デジタル・ツイン・インスタンスのリスト」および「デジタル・ツインのインスタンスの詳細の取得」を参照してください。

  • oci iot digital-twin-instance createコマンドを使用して、ゲートウェイおよび直接接続および間接接続されたデバイス・インスタンスを作成します。

    直接接続されたHVACインスタンスの作成

    このコマンドを使用して、外部キーhvac1を使用して、特定のIoTドメインに関連付けられ、直接接続されるデジタル・ツイン・インスタンスを作成します。

    oci iot digital-twin-instance create \
      --iot-domain-id <iot-domain-OCID> \
      --connectivity-type DIRECT \
      --display-name "LG HVAC 1" \
      --auth-id <certificate-or-secret-OCID> \
      --digital-twin-adapter-id <hvac-adapter-OCID> \
      --external-key hvac1

    ゲートウェイ・インスタンスの作成

    このコマンドを使用して、特定のIoTドメインに関連付けられたデジタル・ツイン・インスタンスを作成し、必要な--connectivity-typeパラメータをGATEWAY値とともに使用して、ゲートウェイであるデジタル・ツイン・インスタンスを作成します。外部キーはgateway1.です。

    oci iot digital-twin-instance create \
      --iot-domain-id <iot-domain-OCID> \
      --connectivity-type GATEWAY \
      --display-name "Bosch Gateway 1" \
      --auth-id <certificate-or-secret-OCID> \
      --digital-twin-adapter-id <gateway-adapter-OCID> \
      --external-key gateway1

    間接的に接続されたHVACインスタンスの作成

    このコマンドおよび必須パラメータ--connectivity-type INDIRECTを使用して、間接的に接続されたデバイスであるデジタル・ツインを作成します。このシナリオは、デバイスごとに1つのゲートウェイ・アソシエーションを示しています。デプロイメントでローミングがサポートされている場合、間接的に接続されたデバイスを複数のゲートウェイに関連付けて、デジタル・ツイン・インスタンスを変更せずにそれらの間を移動できるようにします。
    ノート

    必要な--gatewaysパラメータを使用して間接的に接続されたデバイスを作成する場合、これは複合型であり、JSON配列を使用する必要があります。例: --gateways '["<gateway-instance-OCID>"]'またはローミングの場合は、 --gateways '["<gateway-instance-1-OCID>","<gateway-instance-2-OCID>"]'を使用します。または、.jsonファイルを使用することもできます。
    oci iot digital-twin-instance create \
      --iot-domain-id <iot-domain-OCID> \
      --connectivity-type INDIRECT \
      --display-name "LG HVAC 2" \
      --gateways '["<gateway-instance-OCID>"]' \
      --digital-twin-adapter-id <hvac-adapter-OCID> \
      --external-key hvac2

    間接的に接続されたボイラー・インスタンスの作成

    このコマンドおよび必須パラメータ--connectivity-type INDIRECTを使用して、間接的に接続されたデバイスであるデジタル・ツインを作成します。

    oci iot digital-twin-instance create \
      --iot-domain-id <iot-domain-OCID> \
      --connectivity-type INDIRECT \
      --display-name "GE Boiler 1" \
      --gateways '["<gateway-instance-OCID>"]' \
      --digital-twin-adapter-id <boiler-adapter-OCID> \
      --external-key boiler1

    間接的に接続された除湿器インスタンスの作成

    このコマンドおよび必須パラメータ--connectivity-type INDIRECTを使用して、間接的に接続されたデバイスであるデジタル・ツインを作成します。

    oci iot digital-twin-instance create \
      --iot-domain-id <iot-domain-OCID> \
      --connectivity-type INDIRECT \
      --display-name Danby Dehumidifier 1 \
      --gateways '["<gateway-instance-OCID>"]' \
      --external-key dehumidifier1
  • CreateDigitalTwinInstance操作を実行して、ゲートウェイ・インスタンス、直接接続されたインスタンスおよび間接的に接続されたインスタンスを作成します。

    間接的に接続されたインスタンスを作成する場合は、リクエストにゲートウェイ・アソシエーションが含まれていることを確認してください。

ステップ4: Telemetryデータの送信

これらの例は、3つのデータパスを示しています。hvac1などの直接接続されたデバイスは、独自の外部キーで認証し、データを独自のデジタル・ツイン・インスタンスに送信します。また、ゲートウェイgateway1は、独自のCPU、メモリー、ストレージおよびファームウェアのテレメトリを送信するときに、独自の外部キーを使用して認証します。

間接的に接続されたデバイスはIoTドメインに対して認証されません。ゲートウェイはgateway1として認証され、エンドポイント・パス(hvacs/hvac2boilers/boiler1dehumidifiers/dehumidifier1など)はゲートウェイの背後にあるターゲット・デバイスを識別します。

    1. MQTTXをインストールおよび構成します

    2. <digital-twin-instance-external-key>をデバイスのユーザー名として使用します。デジタル・インスタンスの外部キーを検索する必要がある場合は、デジタル・ツインのインスタンス詳細の取得を実行できます。
    3. ポート8883<domain-short-id>.device.iot.<region>.oci.oraclecloud.comに接続し、SSL/TLSを有効にして、クリーン・セッションを使用します。

    直接接続されたHVACインスタンスからテレメトリを送信:

    mqttx pub \
      -h '<domain-short-id>.device.iot.<region>.oci.oraclecloud.com' \
      -p 8883 \
      -l mqtts \
      -t 'data' \
      -m '{
        "temperature": 70,
        "humidity": 60
      }' \
      -u hvac1 \
      -P '<secret-contents>'

    ゲートウェイ・インスタンスからのテレメトリの送信:

    mqttx pub \
      -h '<domain-short-id>.device.iot.<region>.oci.oraclecloud.com' \
      -p 8883 \
      -l mqtts \
      -t 'data' \
      -m '{
        "cpuUtil": 30,
        "memUtil": 25,
        "diskUtil": 20,
        "firmware": "Oracle Linux 9.1"
      }' \
      -u gateway1 \
      -P '<secret-contents>'

    ゲートウェイを介して間接的に接続されたHVACインスタンスのテレメトリを送信します:

    mqttx pub \
      -h '<domain-short-id>.device.iot.<region>.oci.oraclecloud.com' \
      -p 8883 \
      -l mqtts \
      -t 'hvacs/hvac2' \
      -m '{
        "temperature": 75,
        "humidity": 65
      }' \
      -u gateway1 \
      -P '<secret-contents>'

    ゲートウェイを介して間接的に接続されたボイラー・インスタンスのテレメトリを送信します:

    mqttx pub \
      -h '<domain-short-id>.device.iot.<region>.oci.oraclecloud.com' \
      -p 8883 \
      -l mqtts \
      -t 'boilers/boiler1' \
      -m '{
        "temperature": 80,
        "pressure": 90
      }' \
      -u gateway1 \
      -P '<secret-contents>'

    ゲートウェイを介して間接的に接続された除湿器インスタンスの遠隔測定を送信します:

    mqttx pub \
      -h '<domain-short-id>.device.iot.<region>.oci.oraclecloud.com' \
      -p 8883 \
      -l mqtts \
      -t 'dehumidifiers/dehumidifier1' \
      -m 'humidity=50,fanSpeed=medium' \
      -u gateway1 \
      -P '<secret-contents>'
  • curlを使用して、HTTPS経由でテレメトリを送信します。これらの例では、デジタル・ツイン・インスタンスの外部キーおよびプレーン・テキストのシークレット・コンテンツとともにHTTP Basic認証を使用します。

    1. ユーザー名としてデジタル・ツイン・インスタンスの外部キーを使用します。たとえば、直接接続されたテレメトリの場合は、インスタンスの外部キー(hvac1など)を使用します。
    2. プレーン・テキストのシークレット・コンテンツをパスワードとして使用します。
    3. リクエストをhttps://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/<endpoint-path>に送信します。
    4. 間接的に接続されたデバイスの場合は、ゲートウェイ・インスタンスとして認証し、エンドポイント・パスを使用してターゲット・デバイス(hvacs/hvac2boilers/boiler1など)を識別します。

    直接接続されたHVACインスタンスからテレメトリを送信:

    curl -i -u "hvac1:<secret-contents>" \
      -H "Content-Type: application/json" \
      -X POST \
      "https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/data" \
      -d '{
        "temperature": 70,
        "humidity": 60
      }'

    ゲートウェイ・インスタンスからのテレメトリの送信:

    curl -i -u "gateway1:<secret-contents>" \
      -H "Content-Type: application/json" \
      -X POST \
      "https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/data" \
      -d '{
      "cpuUtil": 30,
      "memUtil": 25,
      "diskUtil": 20,
      "firmware": "Oracle Linux 9.1"
    }'

    ゲートウェイを介して間接的に接続されたHVACインスタンスのテレメトリを送信します:

    curl -i -u "gateway1:<secret-contents>" \
      -H "Content-Type: application/json" \
      -X POST \
      "https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/hvacs/hvac2" \
      -d '{
        "temperature": 75,
        "humidity": 65
      }'

    ゲートウェイを介して間接的に接続されたボイラー・インスタンスのテレメトリを送信します:

    curl -i -u "gateway1:<secret-contents>" \
      -H "Content-Type: application/json" \
      -X POST \
      "https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/boilers/boiler1" \
      -d '{
        "temperature": 80,
        "pressure": 90
      }'

    ゲートウェイを介して間接的に接続された除湿器インスタンスの遠隔測定を送信します:

    curl -i -u "gateway1:<secret-contents>" \
      -H "Content-Type: text/plain" \
      -X POST \
      "https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/dehumidifiers/dehumidifier1" \
      -d 'humidity=50,fanSpeed=medium'

オプションのステップ5: デジタル・ツインのインスタンス・コンテンツの取得

デジタル・ツイン・インスタンスのデータが取得されたことを確認するには、コンソール、CLIまたはAPIを使用して、デジタル・ツインのインスタンス・コンテンツ(最新のスナップショット・データ)を表示します。

非構造化データのデジタル・ツイン・インスタンスの場合、通常、デジタル・ツイン・モデルが関連付けられていないため、デジタル・ツイン・インスタンスのコンテンツの取得を使用してそのデータを表示することはできません。

    1. 「ドメイン」リスト・ページで、操作するドメインを選択します。IoTドメインのリスト・ページまたはIoTドメインの検索に関するヘルプが必要な場合は、IoTドメインのリストを参照してください。
    2. 「デジタル・ツイン・インスタンス」タブを選択します。
    3. デジタル・ツイン・インスタンス名を選択すると、詳細ページが開きます。
    4. 「Data」タブを選択して、このインスタンスの最新のスナップショット・データを表示します。詳細は、IoTドメイン・データベース・スキーマ・リファレンスを参照してください。
  • デジタル・ツインのインスタンス・コンテンツを取得するには、oci iot digital-twin-instance get-contentコマンドと必要なパラメータを使用します:

    直接接続されたHVACインスタンスを確認します。

    oci iot digital-twin-instance get-content \
      --digital-twin-instance-id <lg-hvac-1-OCID>

    ゲートウェイ・インスタンスを確認します:

    oci iot digital-twin-instance get-content \
      --digital-twin-instance-id <bosch-gateway-1-OCID>

    間接的に接続されているHVACインスタンスを確認します。

    oci iot digital-twin-instance get-content \
      --digital-twin-instance-id <lg-hvac-2-OCID>

    間接的に接続されたボイラー・インスタンスを確認します:

    oci iot digital-twin-instance get-content \
      --digital-twin-instance-id <ge-boiler-1-OCID>
  • GetDigitalTwinInstanceContent操作を実行して、デジタル・ツイン・インスタンスからコンテンツを取得します。

ステップ6: コマンドの起動

間接的に接続されたデバイスの場合は、at-least-once配信ポリシーを使用し、再試行または重複配信を予期します。

レスポンスが必要な場合、ゲートウェイがターゲット・デバイスのかわりにレスポンスを公開できるように、レスポンス・エンドポイントを構成します。

  • デジタル・ツイン・インスタンスの詳細ページからRAWコマンドを送信する場合は、コンソールを使用します。

    1. IoTドメインを開き、「デジタル・ツイン・インスタンス」タブを選択します。
    2. 制御するインスタンスを1つ選択します。
    3. 「アクション」メニューから、「RAWコマンドの送信」を選択します。
    4. リクエスト・エンドポイント、リクエスト期間およびコマンド・ペイロードを入力します。
    5. オプション: レスポンス・エンドポイントおよびレスポンス期間を構成し、「RAWコマンドの送信」を選択します。次のファイルの値を使用します: gateway-command.jsonboiler-command.json
    gateway-command.json
    {
      "force": true
    }
    boiler-command.json
    {
      "hardReset": false
    }
  • oci iot digital-twin-instance invoke-raw-json-commandコマンドを使用して、このシナリオのアクション例を呼び出します。詳細は、デジタル・ツイン・インスタンスからのRAWコマンドの送信を参照してください。

    ゲートウェイ・インスタンスを再起動します。

    oci iot digital-twin-instance invoke-raw-json-command \
      --digital-twin-instance-id <bosch-gateway-1-OCID> \
      --request-endpoint "actions/reboot" \
      --request-data '{"force": true}'

    間接的に接続されたボイラー・インスタンスのリセット

    この例では、boilers/boiler1/actions/reset--request-endpointを指定します。

    この例では、boilers/boiler1/actions/response--response-endpointを指定します。

    レスポンスが必要な場合、--response-durationパラメータを含める必要があります。そうでない場合、コマンドはレスポンスを受信せずにCOMPLETED状態に遷移します。その結果、コマンドのレスポンスはRAW_COMMAND_DATAデータベース表には取得されません。

    oci iot digital-twin-instance invoke-raw-json-command \
      --digital-twin-instance-id <ge-boiler-1-OCID> \
      --request-endpoint "boilers/boiler1/actions/reset" \
      --request-data '{"hardReset": false}' \
      --response-endpoint "boilers/boiler1/actions/response" \
      --response-duration PT10M

    ボイラー・レスポンスの公開

    Use the response endpoint to publish the boiler response to this endpoint: boilers/boiler1/actions/response in this example gateway1 is the external key and the device username.

    mqttx pub \
      -h '<domain-short-id>.device.iot.<region>.oci.oraclecloud.com' \
      -p 8883 \
      -l mqtts \
      -t "boilers/boiler1/actions/response" \
      -m '{
        "status": "OK"
      }' \
      -u gateway1 \
      -P '<secret-contents>'

    間接的に接続された除湿ファンをオフにする

    このコマンドを使用して、除湿器のファンをシャットダウンするデバイスでraw JSONコマンドを呼び出します。

    oci iot digital-twin-instance invoke-raw-json-command \
      --digital-twin-instance-id <danby-dehumidifier-1-OCID> \
      --request-endpoint "dehumidifiers/dehumidifier1/actions/fanOff" \
      --request-data '{"fanOff": true}'
  • InvokeRawCommand操作を実行して、デバイスでRAWコマンドを起動します。

    レスポンス・エンドポイントは、コマンドがアプリケーション・レベルの確認を返す場合に使用します。

デジタル・ツイン・インスタンスに適した接続タイプの選択

デジタル・ツイン・インスタンスに使用する接続タイプを決定する方法:

直接に接続済

使用条件
デバイスは、単独でIoTドメインに接続します。
必須のパラメータ
認証IDは、テストにはシークレットを使用し、本番にはmTLS証明書を使用します。
構造化データに必要
デジタル・ツイン・モデルに一致するデジタル・ツイン・アダプタは、アダプタから提供または推測でき、モデルにはテレメトリ、プロパティまたはコマンドが少なくとも1つ含まれている必要があります。
非構造化データ用
デジタルツインアダプタやデジタルツインモデルを使用しないでください。
オプションの入力
外部キーを指定しないと、サービスによって外部キーが生成されます。デバイスのユーザー名に使用します。
使用しない
ゲートウェイと直接接続されたデバイスとの関連付け。

Gateway

使用条件
デバイスは、自身や他のデバイスのデータやコマンドを転送します。
必要なパラメータ
認証IDとゲートウェイ・アダプタ。ゲートウェイ・インスタンスは非構造化テレメトリをサポートしていないため、アダプタが必要です。
デジタルツイン・モデル
ゲートウェイのデジタルツインモデルは、デジタルツインアダプタから関連付けまたは推測することができ、モデルには少なくとも1つのテレメトリ、プロパティー、またはコマンドが含まれている必要があります。モデルを指定せずにアダプタでデジタル・ツイン・インスタンスを作成でき、モデルはアダプタを介して関連付けられます。
非構造化データの場合、通常はアダプタまたはモデルのいずれも使用しません。
オプションの入力
外部キーを指定しない場合、サービスによって生成されます。
推奨
変更または削除する前に、ゲートウェイの詳細ページを参照して、ゲートウェイに依存するデバイスの数を確認してください。
しない
ゲートウェイ・インスタンスを別のゲートウェイ・インスタンスに関連付けます。

間接接続

使用条件
別のデバイス(通常はゲートウェイ)は、デバイスの代わりにテレメトリデータを送信し、コマンドを受信します。
必須
1つ以上のゲートウェイ・アソシエーションが必要です。ワイヤレスデバイスがゲートウェイ間でローミングする場合、複数のゲートウェイを使用します。ご使用の環境で機能する場合は、管理者に確認してください。
構造化データ用
構造化データには、デジタルツインアダプタが必要です。対応するデジタル・ツイン・モデルは、DTMIまたはデジタル・ツイン・モデルOCIDを指定することで、アダプタから提供または推測できます。モデルには、少なくとも1つのテレメトリ、プロパティまたはコマンドが含まれている必要があります。
非構造化データ用
非構造化データの場合、デジタル・ツイン・アダプタまたはデジタル・ツイン・モデルは使用しません。非構造化データのコンテンツは、デジタル・ツイン・モデルを含んでいないため取得できません。
オプションの入力
外部キーを指定しない場合、サービスは外部キーを生成します。
認証ID
間接的に接続されたデジタル・ツイン・インスタンスには認証IDを使用しないでください。

未接続

使用条件
デバイス・データの認証、送信または受信を行わないデジタル・ツイン・インスタンスのテストにより、デジタル・ツイン関係をテストして、データや認証の複雑さなしにIoT構成をテストできます。
必須
構造化データの場合、デジタルツインモデルが必要であり、テレメトリ、プロパティー、またはコマンドを含めることはできません。
オプション
テスト用のデジタル・ツイン関係。詳細は、「デジタル・ツイン関係」を参照してください。
使用しない
接続されていないデジタル・ツイン・インスタンスの認証ID、外部キー、デジタル・ツイン・アダプタ、ゲートウェイ・アソシエーションまたはデバイス・データ。

FAQ

このFAQでは、このシナリオで説明するゲートウェイ・ユーザー・ストーリーについて説明します。

別のデバイスがかわりにデータを送信するようにデジタル・ツイン・インスタンスを間接的に接続するように構成できますか。
はい。INDIRECT接続タイプのデバイスのデジタル・ツイン・インスタンスを作成し、デバイスに独自の認証IDを指定するのではなく、1つ以上のゲートウェイ・デジタル・ツイン・インスタンスに関連付けます。
特定のゲートウェイを介して接続されているデバイスを判別し、そのゲートウェイを失うことによる影響を理解するにはどうすればよいですか。
ゲートウェイの詳細ページを使用して、関連付けられたデバイス数および依存するデジタル・ツイン・インスタンスのリストを確認します。これにより、メンテナンス、移行または削除操作の前に、ゲートウェイの影響範囲を最速で確認できます。
デジタル・ツイン・インスタンスのうち、直接接続されているもの、間接的に接続されているもの、またはゲートウェイがいくつあるかを知るにはどうすればよいですか。
デジタル・ツイン・インスタンスのリスト・ページまたはゲートウェイのリスト・ページでは、ゲートウェイのリストを確認できます。
各デジタル・ツインのデジタル・ツイン・インスタンス接続タイプを確認し、ドメイン・レベルのゲートウェイおよびトポロジ・ビューを使用して環境に関するインサイトを取得します。このシナリオでは、3つのパターンを比較できるように、1つの直接デバイス、1つのゲートウェイおよび複数の間接デバイスを示します。
着信テレメトリが正しいターゲットデバイスにルーティングされるようにゲートウェイのアダプタを構成するにはどうすればよいですか。
エンベロープにtargetマッピングを含むゲートウェイにデジタル・ツイン・アダプタを使用します。ステップ2: デジタル・ツイン・アダプタの作成を参照してください。
インバウンド・エンベロープではなくインバウンド・ルートにtargetを配置する必要があるのはどのような場合ですか。
番号インバウンド・エンベロープにtargetを配置します。
targetが空またはnullの場合はどうなりますか。
メッセージは、間接的に接続されたデバイスに委任されるのではなく、ゲートウェイデータとして扱われます。
1つのゲートウェイ・アダプタで、ゲートウェイのテレメトリと間接的に接続されたデバイスのテレメトリの両方を処理できますか。
はい。これがゲートウェイ・ルーティングの主な目的です。転送されたデバイスメッセージは解決済みのターゲットに送信されますが、不一致または空のターゲットデータはゲートウェイに残ります。
定義を複製せずに、直接接続されたデバイスや間接的に接続されたデバイス間で1つのゲートウェイを再利用できますか。
はい。ゲートウェイを再使用可能なアセットとして処理し、一致するアダプタを1回作成してから、そのアダプタ・ルート条件を使用する間接的に接続された各デバイスにゲートウェイを関連付けます。
間接的に接続されたデバイスから非構造化テレメトリを送信できますか。
はい。ターゲット・デバイスの構造化ペイロード・マッピングが不要な場合は、ゲートウェイを介してRAWペイロードを送信し、デバイス固有のアダプタをスキップできます。
間接的に接続されているデバイスとゲートウェイ自体で非構造化コマンドを呼び出すことはできますか。
はい。両方のパターンにrawコマンドエンドポイントを使用します。ターゲット・デバイスのアプリケーション・レベルの確認をゲートウェイに公開する必要がある場合は、非構造化コマンドにレスポンス・エンドポイントを追加します。
--request-endpoint。例: boilers/boiler1/actions/reset
--response-endpoint。例: boilers/boiler1/actions/response
1つのデバイスを複数のゲートウェイに関連付けて、ローミングできるようにすることはできますか。
はい。間接的に接続されたデバイスは、1つ以上のゲートウェイに関連付けることができます。これにより、ワイヤレスデバイスは、使用可能なゲートウェイ間で移動しながら、同じデジタルツインインスタンスを保持できます。
CLIでは、デジタル・ツイン・モデルのゲートウェイ・アソシエーションにアレイを使用してマルチゲートウェイ・ローミングを構成できます。
ゲートウェイ・デジタル・ツイン・インスタンスOCIDsのJSON配列で--gatewaysオプションを使用します:
oci iot digital-twin-instance create \
  --iot-domain-id <iot-domain-OCID> \
  --connectivity-type INDIRECT \
  --display-name "Roaming Wireless Device 1" \
  --gateways '["<gateway-instance-1-OCID>","<gateway-instance-2-OCID>"]' \
  --external-key roaming-device1
シェル引用の問題を回避する場合は、ゲートウェイ・リストをroaming-device.json入力ファイルに配置し、--from-jsonを使用します。
oci iot digital-twin-instance create \
  --from-json file://roaming-device.json
roaming-device.json
{
  "iotDomainId": "<iot-domain-OCID>",
  "connectivityType": "INDIRECT",
  "displayName": "Roaming Wireless Device 1",
  "gateways": [
    "<gateway-instance-1-OCID>",
    "<gateway-instance-2-OCID>"
  ],
  "externalKey": "roaming-device1"
}
本番でマルチゲートウェイ・ローミングに依存する前に、テスト環境での動作を確認し、ゲートウェイが使用するハンドオフ・パターンを検証します。

トラブルシューティング

コマンドはACCEPTED状態のままです

「ステップ6: コマンドの起動」で、--request-dataパラメータを含めない場合、コマンドはACCEPTED状態のままとなり、次のエラーが発生します: Invalid Command Invocation id [unique-id]: [Previous command invocation is not finished yet]