シナリオ: HTTPを使用したカスタム形式での構造化データの送信

このシナリオを使用して、デバイスから構造化データをカスタム形式で送信およびモニターします。デバイスがカスタム形式でデータを送信する場合、つまり、その出力を変更するようにデバイスをプログラムすることはできません。

この場合、カスタム・デジタル・ツイン・アダプタ・マッピングを定義して、受信データをIoTプラットフォームで認識される形式に変換します。

管理者は、テナンシおよび使用するコンパートメントにポリシーを追加する必要があります。ポリシーの例および前提条件については、Internet of Things (IoT)プラットフォームのポリシー詳細およびIoTの前提条件を参照してください。

ステップ1: IoTドメイン・グループおよびIoTドメインの作成

既存のIoTドメイン・グループおよびIoTドメインを使用するか、IoTドメイン・グループを作成して、このシナリオに使用するIoTドメインを作成します。

作業するIoTドメイン・グループおよびIoTドメインがある場合は、次のステップに従って、構造化データをデバイスからカスタム形式で受信するようにデジタル・ツイン・リソースを設定します。すべてのIoTリソースは同じリージョンに存在する必要があります。

IoTドメインの<domain-short-id-from-device-host>を取得したり、IoTドメインOCIDを取得したりするには、作業するIoTドメインの詳細を取得できます。

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

  1. この例と同様のデジタル・ツイン・モデルのデジタル・ツイン定義言語(DTDL)を使用して、収集するデータを使用して仕様を作成します。

    この例を使用するには、このコード・スニペットをdigital-twin-model.jsonファイルとして保存し、デジタル・ツイン・モデルを作成するときに次のステップでこのファイルを参照します。

    デジタル・ツイン・モデルには、一意の識別子としてデジタル・ツイン・モデル識別子(DTMI)が必要です。たとえば: dtmi:com:oracle:example:hvac;1

    {
      "@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"
        },
        {
          "@type": "Property",
          "name": "power",
          "schema": "boolean"
        },
        {
          "@type": "Property",
          "name": "batteryLevel",
          "schema": "integer"
        }
      ]
    }
  2. oci iot digital-twin-model createコマンドを必須パラメータとともに使用して、デジタル・ツイン・モデルを作成します。<iot-domain-OCID>を、このデジタル・ツイン・モデルに関連付けるIoTドメインのOCIDに置き換えます。前のステップで作成したdigital-twin-model.jsonファイルまたは特定のシナリオの仕様ファイルを参照します。ファイルの参照の詳細は、複合入力へのJSONファイルの使用を参照してください。
    oci iot digital-twin-model create --iot-domain-id <iot-domain-OCID> --spec file://digital-twin-model.json
    前のステップのdigital-twin-model.jsonファイルを使用したレスポンスの例。このレスポンス例は、DTMI URIおよびIoTデジタル・ツイン・モデルOCIDを示しています。
    {
      "data": {
        "defined-tags": {
          "Oracle-Tags": {
            "CreatedBy": "default/user@oracle.com",
            "CreatedOn": "2025-09-11T05:56:50.514Z"
          }
        },
        "description": "A digital twin model for HVAC",
        "display-name": "HVAC",
        "freeform-tags": {},
        "id": "<iot-digital-twin-model-OCID>",
        "iot-domain-id": "<iot-domain-OCID>",
        "lifecycle-state": "ACTIVE",
        "spec-uri": "dtmi:com:oracle:example:hvac;1",
        "system-tags": {},
        "time-created": "2025-09-11T05:56:50.587000+00:00",
        "time-updated": "2025-09-11T05:56:50.587000+00:00"
      },
      "etag": "<unique-id>"
    }
    

ステップ3: カスタム形式のデジタル・ツイン・アダプタの作成

デバイスがカスタム形式でデータを送信する場合、つまり、その出力を変更するようにデバイスをプログラムすることはできません。この場合、デジタルツインアダプタマッピングでカスタムフォーマットを定義します。

そのためには、inbound-envelopeおよびinbound-routesJSON形式で定義し、データをOracleサービスおよびアプリケーションで操作する形式に変換して、接続してIoTデータを表示できるようにしてください。

CLIの使用

  1. インバウンド・エンベロープfile://inbound-envelope.jsonを定義して、デバイスのペイロードからメタデータを抽出する方法を指定します。受信JSONから$.timeの値を抽出し、デジタル・ツイン・モデルのtimeObservedフィールドにマップします。これらのマッピングにより、JQ式を使用してタイムスタンプなどの特定のメタデータを抽出できます。

    この例では、デバイス・エンドポイント、サンプル・ペイロード、およびJQ式を適用してデータを抽出または再形成するインバウンド・エンベロープ・マッピングを示します。

    {
      "reference-endpoint": "telemetry/health",
      "reference-payload": {
        "dataFormat": "JSON",
        "data": {
          "time": "<timestamp>",
          "data": {
            "temp": 0,
            "hum": 0,
            "power": false,
            "batteryLevel": 0
          }
        }
      },
      "envelope-mapping": {
        "timeObserved": "$.time"
      }
    }
  2. file://inbound-routes.jsonファイルを作成して、デバイス・メッセージからの特定のペイロード・データをデジタル・ツイン・インスタンスにマッピングおよびルーティングする方法を定義します。

    各ルートには、エンドポイントに一致する条件、参照ペイロード構造、および値を転送または変換するためのマッピング指示が含まれます。

    この例は、定義された2つのペイロード条件を示しています。
    ノート

    許可されるインバウンド・ルートの最大数は128です。
    [
      {
        "condition": "${endpoint(2) == \"heartbeat\"}",
        "reference-payload": {
          "data": {
            "temp": 75,
            "hum": 62
          }
        },
        "payload-mapping": {
          "$.temperature": "$.data.temp",
          "$.humidity": "${.data.hum - 5}"
        }
      },
      {
        "condition": "${endpoint(2) == \"health\"}",
        "reference-payload": {
          "data": {
            "power": false,
            "batteryLevel": 60
          }
        },
        "payload-mapping": {
          "$.power": "$.data.power",
          "$.batteryLevel": "${.data.batteryLevel - 5}"
        }
      }
    ]
  3. oci iot digital-twin-adapter createコマンドを使用して、デジタル・ツイン・アダプタを作成します。<iot-domain-OCID>をIoTドメインのOCIDに置き換え、<dtmi:com:oracle:example:hvac>を、このデジタル・ツイン・アダプタに関連付けるデジタル・ツイン・モデルのDTMI URIでDTMI URIに置き換えます。

    次の例では、DTMI URIパラメータを使用してデジタルツインモデルを関連付けます。または、このデジタル・ツイン・アダプタに関連付けるデジタル・ツイン・モデルに対して、--digital-twin-model-idパラメータを<digital-twin-model-OCID>とともに使用できます。

    前のステップで作成したファイルfile://inbound-enevelop.jsonおよびfile://inbound-enevelop.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://inbound-enevelop.json> --inbound-routes <file://inbound-routes.json>
    このレスポンス例では、jsonファイルを参照して、--inbound-envelopeおよび--inbound-routesオプションで定義されたカスタム・ペイロード・マッピングと、一意のDTMI URIおよびデジタル・ツイン・モデルOCIDを持つ特定のデジタル・ツイン・モデルに関連付けられている特定のデジタル・ツイン・アダプタOCIDを示します。

    dtmi:com:oracle:example:core:hvac:sp;1

    {
      "data": {
        "defined-tags": {
          "Oracle-Tags": {
            "CreatedBy": "default/user@oracle.com",
            "CreatedOn": "2025-09-11T06:09:27.323Z"
          }
        },
        "description": null,
        "digital-twin-model-id": "<iot-digital-twin-model-OCID>",
        "digital-twin-model-spec-uri": "dtmi:com:oracle:example:hvac;1",
        "display-name": "<digital-twin-adapter-display-name>",
        "freeform-tags": {},
        "id": "<iot-digital-twin-adapter-OCID>",
        "inbound-envelope": {
          "envelope-mapping": {
            "time-observed": "$.time"
          },
          "reference-endpoint": "telemetry/health",
          "reference-payload": {
            "data": {
              "time": "2025-09-11T06:09:27.878106Z"
            },
            "data-format": "JSON"
          }
        },
        "inbound-routes": [
          {
            "condition": "${endpoint(2) == \"heartbeat\"}",
            "description": null,
            "payload-mapping": {
              "$.humidity": "${.hum-1}",
              "$.temperature": "$.temp"
            },
            "reference-payload": {
              "data": {
                "hum": 62,
                "temp": 75
              },
              "data-format": "JSON"
            }
          },
          {
            "condition": "${endpoint(2) == \"health\"}",
            "description": null,
            "payload-mapping": {},
            "reference-payload": {
              "data": {
                "batteryPercentage": 60,
                "on": false
              },
              "data-format": "JSON"
            }
          }
        ],
        "iot-domain-id": "<iot-domain-OCID>",
        "lifecycle-state": "ACTIVE",
        "system-tags": {},
        "time-created": "2025-09-30T19:55:36.293000+00:00",
        "time-updated": "2025-09-30T19:55:36.293000+00:00"
      },
      "etag": "<unique-id>"
    }
    

ステップ4: アダプタを使用したデジタル・ツイン・インスタンスの作成

CLIの使用

デジタル・ツイン・インスタンスを作成するには、oci iot digital-twin-instance create<iot-domain-OCID>および<certificate-or-secret-OCID>の必須パラメータを使用します。<certificate-or-secret-OCID>を、使用するボールト・シークレットOCIDに置き換え、<iot-domain-OCID>を環境のIoTドメインのOCIDに置き換えます。

デジタル・ツイン・インスタンスがデバイス・データを受信するように設定されている場合、デジタル・ツインが認証できるように、ボールト・シークレットまたは証明書OCIDとともに認証IDパラメータを使用する必要があります。これを行うには、他の関連するIoTリソースと同じリージョンおよびテナンシにシークレットを作成するか、証明書を作成します。

この例では、--display-nameオプションを使用し、<your-digital-twin-instance-name>をデジタル・ツイン・インスタンスのわかりやすい名前に置き換えます。

<digital-twin-adapter-OCID>を、前のステップで作成したデジタル・ツイン・アダプタに置き換えます。
oci iot digital-twin-instance create --iot-domain-id <iot-domain-OCID> --display-name <your-digital-twin-instance-name> --auth-id <certificate-or-secret-OCID> --digital-twin-adapter-id <digital-twin-adapter-OCID>
このレスポンス例は、このデジタル・ツイン・インスタンスに関連付けられたデジタル・ツイン・モデルに対して定義されたデジタル・ツイン・アダプタおよびDTMI URIを示しています。

dtmi:com:oracle:example:hvac;1

{
  "data": {
    "auth-id": "<vault-secret-OCID>",
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "default/user@oracle.com",
        "CreatedOn": "2025-08-14T17:41:11.973Z"
      }
    },
    "description": null,
    "digital-twin-adapter-id": "<iot-digital-twin-adapter-OCID>",
    "digital-twin-model-id": "<digital-twin-model-OCID>",
    "digital-twin-model-spec-uri": "dtmi:com:oracle:example:hvac;1",
    "display-name": "<your-digital-twin-instance-name>",
    "external-key": "<digital-twin-instance-external-key>",
    "freeform-tags": {},
    "id": "<digital-twin-instance-OCID>",
    "iot-domain-id": "<iot-domain-OCID>",
    "lifecycle-state": "ACTIVE",
    "system-tags": {},
    "time-created": "2025-08-14T17:41:13.638000+00:00",
    "time-updated": "2025-08-14T17:41:13.638000+00:00"
  },
  "etag": "<unique-id>"
}

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

次のcurlコマンドおよび<digital-twin-instance-external-key>を使用して、データを送付します。詳細は、「cURLの使用」を参照してください

送信するデータ型に応じて、次の例を使用してテレメトリを送信します。
curl -u 'digital-twin-instance-external-key:device-password' -H "content-type: application/json" https://<domain-short-id-from-device-host>.device.iot.<region>.oci.oraclecloud.com/telemetry/heartbeat -d '{"temp": 70, "hum": 55}'
Accepted%
curl -i -X POST \
     -u "<digital-twin-instance-external-key>:<device-password>" \
     -H "Content-Type: application/json" \
     "https://<domain-short-id-from-device-host>.device.iot.<region>.oci.oraclecloud.com/telemetry/heartbeat" \
     -d '{
           "digital_twin_instance_id": "<iot-digital-twin-instance-OCID>",
           "received_at": "2024-08-14T06:01:30.432829Z",
           "endpoint": "telemetry/heartbeat",
           "content_type": "application/json",
           "content": {
             "time": "<time>",
             "data": {
               "temp": 70,
               "hum": 65
             }
           }
         }'

ステップ6: テレメトリ・データの表示

Internet of Things Data APIを使用したデータの取得

ORDSを使用してIoTデータにアクセスするように構成し、必要な認証トークンがある場合は、Internet of ThingsデータAPIを使用して、モニターするデータを取得できます。

この例では、HTTPを使用します。または、MQTTおよびMQTTをWebSockets上で使用できます。具体的な例は、シナリオを参照してください。

変数は、ご使用の環境の値に置換します。
curl -H "Authorization: Bearer <token>" \
     -X GET "https://<domain-group-short-id>.data.iot.<region>.oci.oraclecloud.com/ords/<domain-short-id>/20250531/rawData?q={\"$and\":[{\"digital_twin_instance_id\":\"<iot-digital-twin-OCID>\"}]}"

SQL文を使用したデータの表示

データベース内のデータの表示に直接アクセスするように構成している場合、またはAPEX内のデータを表示するためのアクセス権を構成している場合は、このSQL文を使用してrawテレメトリ・データを表示できます:
select * from <domain-short-id-from-device-host>__IOT.RAW_DATA where digital_twin_instance_id = '<iot-digital-twin-OCID>';
ノート

スキーマ名には、__IOTという2つのアンダースコアが含まれていることに注意してください。

または、このSQL文を使用して、rejectedテレメトリ・データを表示します。<domain-short-id-from-device-host>をIoTドメインのドメイン短縮ID、<iot-digital-twin-OCID>を、拒否されたデータを表示するデジタル・ツインのOCIDに置き換えます。

select * from <domain-short-id-from-device-host>__IOT.REJECTED_DATA where digital_twin_instance_id = '<digital-twin-OCID>';
または、このSQL文を使用して、履歴されたテレメトリ・データを表示します。<domain-short-id-from-device-host>をIoTドメインのドメイン短縮IDに置き換え、<iot-digital-twin-OCID>を、拒否されたデータを表示するデジタル・ツインのOCIDに置き換えます:
select * from <domain-short-id-from-device-host>__IOT.HISTORIZED_DATA where digital_twin_id = '<digital-twin-OCID>';