Scénario : Envoi de données structurées dans un format personnalisé à l'aide de HTTP

Utilisez ce scénario pour envoyer et surveiller des données structurées à partir d'un appareil dans un format personnalisé. Si un périphérique envoie des données dans un format personnalisé, cela signifie que le périphérique ne peut pas être programmé pour modifier sa sortie.

Dans ce cas, définissez le mappage d'adaptateur jumeau numérique personnalisé pour traduire les données entrantes dans un format reconnu par la plate-forme IoT.

Un administrateur doit ajouter une politique à votre location et aux compartiments à utiliser. Pour obtenir des exemples de politique et des préalables, voir Informations détaillées sur les politiques pour la plate-forme Internet of Things (IoT) et IoT Prerequisites.

Étape 1 : Créer un groupe de domaines IoT et un domaine IoT

Utilisez un groupe de domaines IoT et un domaine IoT existants ou créez un groupe de domaines IoT et créez un domaine IoT à utiliser pour ce scénario.

Une fois que vous avez le groupe de domaines IoT et le domaine IoT que vous voulez utiliser, suivez ces étapes pour configurer les ressources de jumeau numérique afin de recevoir des données structurées dans un format personnalisé à partir d'un appareil. Toutes les ressources IoT doivent se trouver dans la même région.

Pour obtenir <domain-short-id-from-device-host> pour le domaine IoT ou pour obtenir l'OCID du domaine IoT, vous pouvez obtenir les détails du domaine IoT avec lequel vous voulez travailler.

Étape 2 : Créer un modèle de jumeau numérique

  1. Créez des spécifications à l'aide du langage de définition des jumeaux numériques (DTDL) pour votre modèle de jumeau numérique, comme dans cet exemple, avec les données à collecter.

    Pour utiliser cet exemple, enregistrez cet extrait de code en tant que fichier digital-twin-model.json, puis référencez ce fichier à l'étape suivante lorsque vous créez un modèle de jumeau numérique.

    Un modèle de jumeau numérique nécessite un identificateur de modèle de jumeau numérique (DTMI) comme identificateur unique. Par exemple : 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. Utilisez la commande oci iot digital-twin-model create avec le paramètre requis pour créer un modèle de jumeau numérique. Remplacez <iot-domain-OCID> par l'OCID du domaine IoT à associer à ce modèle de jumeau numérique. Référencez le fichier digital-twin-model.json créé à l'étape précédente ou un fichier de spécifications pour votre scénario spécifique. Pour plus d'informations sur le référencement de fichiers, voir Utilisation d'un fichier JSON pour les entrées complexes :
    oci iot digital-twin-model create --iot-domain-id <iot-domain-OCID> --spec file://digital-twin-model.json
    Exemple de réponse à l'aide du fichier digital-twin-model.json de l'étape précédente. Cet exemple de réponse présente l'URI DTMI et l'OCID du modèle de jumeau numérique IoT :
    {
      "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>"
    }
    

Étape 3 : Créer un adaptateur de jumeau numérique pour un format personnalisé

Si un périphérique envoie des données dans un format personnalisé, cela signifie que le périphérique ne peut pas être programmé pour modifier sa sortie. Dans ce cas, définissez le format personnalisé dans le mappage d'adaptateur jumeau numérique,

Pour ce faire, définissez inbound-envelope et inbound-routes au format JSON afin de convertir les données dans un format que vous souhaitez utiliser dans les services et applications Oracle afin que vous puissiez vous connecter pour voir vos données IoT dans différents systèmes.

Utilisation de l'interface de ligne de commande

  1. Définissez une enveloppe entrante file://inbound-envelope.json pour spécifier comment extraire les métadonnées des données utiles de l'appareil. Pour extraire la valeur à $.time du JSON entrant et la mapper au champ timeObserved dans le modèle de jumeau numérique. Ces mappages vous permettent d'extraire des métadonnées spécifiques telles que des horodatages à l'aide d'expressions JQ.

    Cet exemple présente le point d'extrémité du périphérique, un exemple de données utiles et un mappage d'enveloppe entrante qui applique des expressions JQ pour extraire ou remodeler les données.

    {
      "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. Créez un fichier file://inbound-routes.json pour définir comment des données utiles spécifiques à partir de messages d'appareil sont mappées et acheminées vers votre instance de jumeau numérique.

    Chaque route comprend une condition correspondant au point d'extrémité, une structure de données utiles de référence et des instructions de mappage pour le transfert ou la transformation de valeurs.

    Cet exemple montre 2 conditions de données utiles définies.
    Note

    Le nombre maximal de routes entrantes autorisées est de 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. Utilisez la commande oci iot digital-twin-adapter create pour créer un adaptateur jumeau numérique. Remplacez <iot-domain-OCID> par l'OCID de votre domaine IoT et remplacez <dtmi:com:oracle:example:hvac> par l'URI DTMI par l'URI DTMI du modèle de jumeau numérique à associer à cet adaptateur de jumeau numérique.

    L'exemple suivant utilise le paramètre URI DTMI pour associer le modèle de jumeau numérique. Vous pouvez également utiliser le paramètre --digital-twin-model-id avec <digital-twin-model-OCID> pour le modèle de jumeau numérique que vous souhaitez associer à cet adaptateur de jumeau numérique.

    Référencez les fichiers file://inbound-enevelop.json et file://inbound-enevelop.json créés à l'étape précédente.
    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>
    Cet exemple de réponse présente un mappage de données utiles personnalisé défini dans les options --inbound-envelope et --inbound-routes, en référençant les fichiers json, et un OCID d'adaptateur jumeau numérique spécifique associé à un modèle jumeau numérique spécifique avec un URI DTMI unique et un OCID de modèle jumeau numérique :

    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>"
    }
    

Étape 4 : Créer une instance de jumeau numérique avec l'adaptateur

Utilisation de l'interface de ligne de commande

Utilisez les paramètres oci iot digital-twin-instance create et <iot-domain-OCID> et <certificate-or-secret-OCID> requis pour créer une instance de jumeau numérique. Remplacez <certificate-or-secret-OCID> par l'OCID de la clé secrète de la chambre forte à utiliser et remplacez <iot-domain-OCID> par l'OCID du domaine IoT pour votre environnement.

Si l'instance de jumeau numérique est configurée pour recevoir des données d'appareil, vous devez utiliser le paramètre d'ID authentification avec une clé secrète de chambre forte ou un OCID de certificat, afin que le jumeau numérique puisse s'authentifier. Pour ce faire, créez une clé secrète ou créez un certificat dans la même région et la même location que toutes les autres ressources IoT connexes.

Cet exemple utilise l'option --display-name, remplacez <your-digital-twin-instance-name> par un nom convivial pour votre instance de jumeau numérique.

Remplacez <digital-twin-adapter-OCID> par l'adaptateur jumeau numérique créé à l'étape précédente.
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>
Cet exemple de réponse montre l'adaptateur jumeau numérique et l'URI DTMI définis pour le modèle jumeau numérique associé à cette instance de jumeau numérique.

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>"
}

Étape 5 : Envoyer les données de télémétrie

Utilisez la commande curl suivante et la commande <digital-twin-instance-external-key> pour envoyer ou publier des données. Pour plus d'informations, voir Utilisation de cURL.

Selon le type de données à envoyer, utilisez l'exemple suivant pour envoyer de la télémétrie :
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
             }
           }
         }'

Étape 6 : Voir les données de télémétrie

Utiliser l'API de données Internet of Things pour obtenir les données

Si vous avez configuré l'accès à vos données IoT à l'aide d'ORDS et que vous disposez du jeton d'authentification requis, vous pouvez utiliser l'API de données Internet of Things pour obtenir les données à surveiller.

Cet exemple utilise des HTTP. Vous pouvez également utiliser MQTT et MQTT sur WebSockets. Pour des exemples spécifiques, voir Scénarios.

Remplacez les variables par les valeurs de votre environnement :
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>\"}]}"

Utiliser des instructions SQL pour afficher vos données

Si vous avez configuré l'accès à vos données directement dans la base de données ou si vous avez configuré l'accès pour voir vos données dans APEX, vous pouvez utiliser cet énoncé SQL pour voir les données de télémétrie raw :
select * from <domain-short-id-from-device-host>__IOT.RAW_DATA where digital_twin_instance_id = '<iot-digital-twin-OCID>';
Note

Notez que le nom du schéma contient deux traits de soulignement : __IOT

Ou utilisez cet énoncé SQL pour voir les données de télémétrie rejected. Remplacez <domain-short-id-from-device-host> par l'ID abrégé de domaine pour votre domaine IoT et <iot-digital-twin-OCID> par l'OCID du jumeau numérique à partir duquel vous voulez voir les données rejetées :

select * from <domain-short-id-from-device-host>__IOT.REJECTED_DATA where digital_twin_instance_id = '<iot-digital-twin-OCID>';
Ou utilisez cette instruction SQL pour afficher les données de télémétrie historiques. Remplacez <domain-short-id-from-device-host> par l'ID abrégé de domaine de votre domaine IoT et <iot-digital-twin-OCID> par l'OCID du jumeau numérique à partir duquel vous voulez voir les données rejetées :
select * from <domain-short-id>__IOT.DIGITAL_TWIN_HISTORIZED_DATA where digital_twin_id = '<digital-twin-OCID>';