Cenário: Enviando Dados Não Estruturados Usando HTTPs

Este cenário explica como usar a Plataforma Internet of Things para conectar um dispositivo e enviar dados de telemetria não estruturados para a nuvem usando HTTPs e como exibir os dados no APEX.

  1. Criar um grupo de domínios IoT
  2. Criar um domínio IoT
  3. Criar uma instância de gêmeo digital
  4. Enviar dados
  5. Configurar o domínio IoT para acessar o APEX
  6. Acessar dados do IoT no APEX

Para cada dispositivo que deseja conectar à sua Internet of Things, execute as seguintes etapas:

Etapa 1: Criar um Grupo de Domínios IoT

Use o comando oci iot domain-group create, o <compartment-OCID> e os parâmetros necessários do <domain-group-name> para criar um grupo de domínios do IoT em um compartimento específico. Substitua a <compartment-OCID> pelo OCID do compartimento no qual você deseja criar o grupo de domínios. Substitua a <domain-group-name> pelo nome do grupo de domínios e, opcionalmente, substitua a <your-sample-description> por uma descrição:

oci iot domain-group create --compartment-id <compartment-OCID> --display-name <domain-group-name> --description <your-sample-description>

A criação de um grupo de domínios IoT pode levar alguns minutos. Este exemplo de resposta mostra que o grupo de domínios está criando e usa este URL do host de dados:

wtmn2xs4ifkba.data.iot.us-phoenix-1.oci.oraclecloud.com

id curto do grupo de domínios: wtmn2xs4ifkba

data-host:<domain-group-short-id>.data.iot.<region>.oci.oraclecloud.com

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "data-host": "wtmn2xs4ifkba.data.iot.<region>.oci.oraclecloud.com",
    "db-allow-listed-vcn-ids": null,
    "db-connection-string": null,
    "db-token-scope": null,
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "default/user@oracle.com",
        "CreatedOn": "2025-08-14T16:43:02.950Z"
      }
    },
    "description": "<your-domain-group-description>",
    "display-name": "<your-domain-group-name>",
    "freeform-tags": {},
    "id": "<domain-group-OCID>",
    "lifecycle-state": "CREATING",
    "system-tags": {},
    "time-created": "2025-08-14T16:43:03.307000+00:00",
    "time-updated": "2025-08-14T16:43:03.307000+00:00"
  },
  "etag": "<unique-id>",
  "opc-work-request-id": "<work-request-OCID>"
}
        
Etapa opcional: Obter Atualizações da Solicitação de Serviço ao Criar um Grupo de Domínios IoT
Opcional. Durante o tempo necessário para criar o grupo de domínios, use o comando oci iot work-request get e o parâmetro necessário para obter as atualizações da solicitação de serviço para o processo de criação de um grupo de domínios. Substitua o <work-request-id> pelo OCID da solicitação de serviço da criação de uma resposta do grupo de domínios IoT:
oci iot work-request get --work-request-id <work-request-OCID>

Este exemplo de resposta mostra que a criação de uma operação de grupo de domínios está em andamento.

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "id": "<work-request-OCID>",
    "operation-type": "CREATE_IOT_DOMAIN_GROUP",
    "percent-complete": 50.0,
    "resources": [
      {
        "action-type": "IN_PROGRESS",
        "entity-type": "iotDomainGroup",
        "entity-uri": "/20250531/iotDomainGroups/<iot-domain-group-OCID>",
        "identifier": "<work-request-OCID>",
        "metadata": null
      }
    ],
    "status": "ACCEPTED",
    "time-accepted": "2025-08-14T16:43:03.327000+00:00",
    "time-finished": null,
    "time-started": null,
    "time-updated": "2025-08-14T16:43:22.121000+00:00"
  },
  "etag": "<unique-id>"
}
        
Etapa Opcional: Listar Erros da Solicitação de Serviço ao Criar um Grupo de Domínio IoT
Opcional. Durante o tempo necessário para criar o grupo de domínios, se quiser verificar se há erros, você poderá usar o comando oci iot work-request list-errors e o parâmetro necessário para listar quaisquer erros de solicitações de serviço para o processo de criação de um grupo de domínios:
oci iot work-request list-errors --work-request-id <work-request-OCID>
Exemplo de resposta:
{
  "data": {
    "items": []
  }
}
Etapa Opcional: Listar Logs de Solicitação de Serviço ao Criar um Grupo de Domínios IoT
Opcional. Durante o tempo necessário para criar o grupo de domínios, se quiser listar as entradas de logs, você poderá usar o comando oci iot work-request list-logs e o parâmetro necessário para listar entradas de log da solicitação de serviço:
oci iot work-request list-logs --work-request-id <work-request-OCID>

Este exemplo de resposta mostra as etapas para criar o grupo de domínios IoT e que ele está sendo finalizado:

{
  "data": {
    "items": [
      {
        "message": "Generating database credentials",
        "timestamp": "2025-08-14T16:43:12.150000+00:00"
      },
      {
        "message": "Creating database",
        "timestamp": "2025-08-14T16:43:18.156000+00:00"
      },
      {
        "message": "Provisioning database",
        "timestamp": "2025-08-14T16:43:22.121000+00:00"
      },
      {
        "message": "Enabling data guard",
        "timestamp": "2025-08-14T16:48:25.138000+00:00"
      },
      {
        "message": "Configuring admin secret rotation ",
        "timestamp": "2025-08-14T16:53:59.878000+00:00"
      },
      {
        "message": "Generating DNS record(s)",
        "timestamp": "2025-08-14T16:54:05.318000+00:00"
      },
      {
        "message": "Configuring routing policy",
        "timestamp": "2025-08-14T16:54:06.455000+00:00"
      },
      {
        "message": "Finishing work request",
        "timestamp": "2025-08-14T16:54:58.139000+00:00"
      }
    ]
  }
}
Etapa Opcional: Obter Solicitação de Serviço para Confirmar Criação do Grupo de Domínios IoT Concluída
  1. Opcional. Use o comando oci iot work-request get e o parâmetro necessário para obter a atualização da solicitação de serviço para o grupo de domínios. Substitua o <work-request-id> pelo OCID da solicitação de serviço:
    oci iot work-request get --work-request-id <work-request-OCID>

    Este exemplo de resposta mostra que a criação do grupo de domínios IoT foi bem-sucedida.

    {
      "data": {
        "compartment-id": "<compartment-OCID>",
        "id": "<work-request-OCID>",
        "operation-type": "CREATE_IOT_DOMAIN_GROUP",
        "percent-complete": 100.0,
        "resources": [
          {
            "action-type": "CREATED",
            "entity-type": "iotDomainGroup",
            "entity-uri": "/20250531/iotDomainGroups/<domain-group-OCID>",
            "identifier": "<domain-group-OCID>",
            "metadata": null
          }
        ],
        "status": "SUCCEEDED",
        "time-accepted": "2025-08-14T16:43:03.327000+00:00",
        "time-finished": "2025-08-14T16:54:58.139000+00:00",
        "time-started": "2025-08-14T16:43:12.131000+00:00",
        "time-updated": "2025-08-14T16:54:58.139000+00:00"
      },
      "etag": "<unique-id>"
    }
    

Etapa Opcional: Obter os Detalhes do Grupo de Domínios IoT

Use o comando oci iot domain-group get e o parâmetro necessário para obter os detalhes do grupo de domínios IoT, incluindo os detalhes de conexão do banco de dados do grupo de domínios, se configurado. Substitua o <iot-domain-group-OCID> pelo OCID do seu grupo de domínios IoT:

oci iot domain-group get --iot-domain-group-id <iot-domain-group-OCID>
Este exemplo de resposta mostra que o grupo de domínios está ativo, "lifecycleState": "ACTIVE" e usa o seguinte host de dados: wtmn2xs4ifkba.data.iot.us-phoenix-1.oci.oraclecloud.com. Neste exemplo, o wtmn2xs4ifkba é o IoT id curto do grupo de domínios.
{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "data-host": "wtmn2xs4ifkba.data.iot.<region>.oci.oraclecloud.com",
    "db-allow-listed-vcn-ids": null,
    "db-connection-string": null,
    "db-token-scope": null,
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "default/user@oracle.com",
        "CreatedOn": "2025-08-14T16:43:02.950Z"
      }
    },
    "description": "This is a sample domain group",
    "display-name": "Sample Domain Group",
    "freeform-tags": {},
    "id": "<iot-domain-group-OCID>",
    "lifecycle-state": "ACTIVE",
    "system-tags": {},
    "time-created": "2025-08-14T16:43:03.307000+00:00",
    "time-updated": "2025-08-14T16:54:58.187000+00:00"
  },
  "etag": "<unique-id>"
}

Etapa 2: Criar um Domínio IoT

Use o comando oci iot domain create e os parâmetros <domain-group-OCID> e <compartment-OCID> necessários para criar um domínio do Internet of Things. Substitua o <domain-group-OCID> pelo OCID do grupo de domínios que você deseja associar a esse domínio IoT. Substitua <your-sample-description> por uma descrição para seu domínio IoT.

oci iot domain create --compartment-id <compartment-OCID> --iot-domain-group-id <domain-group-OCID> --display-name <your-iot-domain-name> --description <your-iot-domain-description>

A criação de um domínio pode levar alguns minutos. Neste exemplo de resposta, você vê a URL do host do dispositivo com o id curto do domínio:

"device-host": "cuay2mrhlgrrg.device.iot.<region>.oci.oraclecloud.com"

id curto do domínio: cuay2mrhlgrrg

"device-host": "<domain-short-id>.device.iot.<region>.oci.oraclecloud.com"

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "data-retention-periods-in-days": {
      "historized-data": 30,
      "raw-command-data": 16,
      "raw-data": 16,
      "rejected-data": 16
    },
    "db-allow-listed-identity-group-names": null,
    "db-allowed-identity-domain-host": null,
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "default/user@oracle.com",
        "CreatedOn": "2025-08-14T16:57:03.140Z"
      }
    },
    "description": "<your-iot-domain-description>",
    "device-host": "cuay2mrhlgrrg.device.iot.<region>.oci.oraclecloud.com",
    "display-name": "<your-iot-domain-name>",
    "freeform-tags": {},
    "id": "<iot-domain-OCID>",
    "iot-domain-group-id": "<iot-domain-group-OCID>",
    "lifecycle-state": "CREATING",
    "system-tags": {},
    "time-created": "2025-08-14T16:57:03.384000+00:00",
    "time-updated": "2025-08-14T16:57:03.384000+00:00"
  },
  "etag": "<unique-id>",
  "opc-work-request-id": "<work-request-OCID>"
}
Etapa Opcional: Obter Solicitação de Serviço ao Criar um Domínio IoT

Opcional. Durante o tempo necessário para criar o domínio, use o comando oci iot work-request get e o parâmetro necessário para obter a atualização da solicitação de serviço para criar o domínio. Substitua o <work-request-id> pelo id da solicitação de serviço da resposta anterior:

oci iot work-request get --work-request-id <work-request-OCID>

O exemplo de resposta mostra que a criação de um domínio IoT foi aceita e está em andamento.

{
  "data": {
    "compartment-id": "<iot-domain-OCID>",
    "id": "<work-request-OCID>",
    "operation-type": "CREATE_IOT_DOMAIN",
    "percent-complete": 50.0,
    "resources": [
      {
        "action-type": "IN_PROGRESS",
        "entity-type": "iotDomain",
        "entity-uri": "/20250531/iotDomains/<iot-domain-OCID>",
        "identifier": "<iot-domain-OCID>",
        "metadata": null
      }
    ],
    "status": "ACCEPTED",
    "time-accepted": "2025-08-14T16:57:03.413000+00:00",
    "time-finished": null,
    "time-started": null,
    "time-updated": "2025-08-14T16:57:23.124000+00:00"
  },
  "etag": "<unique-id>"
}
Etapa Opcional: Obter Logs da Solicitação de Serviço
Opcional. Durante o tempo necessário para criar o domínio, se quiser listar as entradas de log da solicitação de serviço, você poderá usar o comando oci iot work-request list-logs e o parâmetro necessário para listar entradas de log para a criação de uma solicitação de serviço de domínio IoT:
oci iot work-request list-logs --work-request-id <work-request-OCID>

Este exemplo de resposta mostra as etapas para criar o domínio IoT e que ele está sendo finalizado:

{
  "data": {
    "items": [
      {
        "message": "Generating DNS record(s)",
        "timestamp": "2025-08-14T16:57:22.148000+00:00"
      },
      {
        "message": "Onboarding domain schema(s)",
        "timestamp": "2025-08-14T16:57:23.124000+00:00"
      },
      {
        "message": "Successfully onboarded domain schemas",
        "timestamp": "2025-08-14T16:58:43.508000+00:00"
      },
      {
        "message": "Finishing work request",
        "timestamp": "2025-08-14T16:58:43.771000+00:00"
      }
    ]
  }
}
Etapa Opcional: Obter Solicitação de Serviço ao Criar o Domínio IoT
Opcional. Use o comando oci iot work-request get e os parâmetros necessários para obter a atualização da solicitação de serviço para criar o domínio. Substitua o <work-request-id> pelo OCID da solicitação de serviço:
oci iot work-request get --work-request-id <work-request-OCID>

Este exemplo de resposta mostra a criação bem-sucedida do domínio IoT.

"status": "SUCCEEDED",

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "id": "<work-request-OCID>",
    "operation-type": "CREATE_IOT_DOMAIN",
    "percent-complete": 100.0,
    "resources": [
      {
        "action-type": "CREATED",
        "entity-type": "iotDomain",
        "entity-uri": "/20250531/iotDomains/<iot-domain-OCID>",
        "identifier": "<iot-domain-OCID>",
        "metadata": null
      }
    ],
    "status": "SUCCEEDED",
    "time-accepted": "2025-08-14T16:57:03.413000+00:00",
    "time-finished": "2025-08-14T16:58:43.771000+00:00",
    "time-started": "2025-08-14T16:57:22.147000+00:00",
    "time-updated": "2025-08-14T16:58:43.771000+00:00"
  },
  "etag": "<unique-id>"
}

Etapa Opcional: Obtenha os Detalhes do Domínio IoT

Para confirmar se o domínio está ativo, use o comando oci iot domain get e o parâmetro necessário para obter os detalhes de um domínio. Substitua o <iot-domain-OCID> pelo OCID do seu domínio IoT.
oci iot domain get --iot-domain-id <iot-domain-OCID>

Este exemplo de resposta mostra que o domínio está ativo: "lifecycle-state": "ACTIVE" e a URL do host do dispositivo com o id curto do domínio:

<domain-short-id>.device.iot.<region>.oci.oraclecloud.com

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "data-retention-periods-in-days": {
      "historized-data": 30,
      "raw-command-data": 16,
      "raw-data": 16,
      "rejected-data": 16
    },
    "db-allow-listed-identity-group-names": null,
    "db-allowed-identity-domain-host": null,
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "default/user@oracle.com",
        "CreatedOn": "2025-08-14T16:57:03.140Z"
      }
    },
    "description": "<your-iot-domain-description>",
    "device-host": "<domain-short-id>.device.iot.<region>.oci.oraclecloud.com",
    "display-name": "<your-iot-domain-name>",
    "freeform-tags": {},
    "id": "<iot-domain-OCID>",
    "iot-domain-group-id": "<iot-domain-group-OCID>",
    "lifecycle-state": "ACTIVE",
    "system-tags": {},
    "time-created": "2025-08-14T16:57:03.384000+00:00",
    "time-updated": "2025-08-14T16:58:43.789000+00:00"
  },
  "etag": "<unique-id>"
}

Etapa 3: Criar uma Instância Digital Twin

Use o comando oci iot digital-twin-instance create e o parâmetro <iot-domain-OCID> necessário para criar uma instância de gêmeo digital para um domínio IoT associado. Quando você cria uma instância de gêmeo digital, é necessário um ID de autenticação. Use um certificado ou um segredo. Consulte Criando um Segredo.

Substitua o <iot-domain-OCID> pelo OCID do domínio IoT para a instância de gêmeo digital. Este exemplo de comando inclui o nome para exibição opcional, substitua <display-name> por um nome amigável para sua instância de gêmeo digital:
oci iot digital-twin-instance create --iot-domain-id <iot-domain-OCID> --auth-id <vault-secret-OCID> --display-name <display-name>
Exemplo de resposta:
{
  "data": {
    "auth-id": "<vault-secret-OCID>",
    "defined-tags": {
      "Oracle-Tags": {
        "CreatedBy": "default/user@oracle.com",
        "CreatedOn": "2025-08-14T06:12:43.393Z"
      }
    },
    "description": null,
    "digital-twin-adapter-id": "<iot-digital-twin-adapter-OCID>",
    "digital-twin-model-id": "<iot-digital-twin-model-OCID>",
    "digital-twin-model-spec-uri": "dtmi:com:oracle:example:core:Space:sp;1",
    "display-name": "device for conference room 103",
    "external-key": "<unique-id>",
    "freeform-tags": {},
    "id": "<iot-digital-twin-instance-OCID>",
    "iot-domain-id": "<iot-domain-OCID>",
    "lifecycle-state": "ACTIVE",
    "system-tags": {},
    "time-created": "2025-09-11T06:12:44.178000+00:00",
    "time-updated": "2025-09-11T06:12:44.178000+00:00"
  },
  "etag": "<unique-id>"
}

Etapa 4: Enviar Dados

Envie dados usando o URL do host do dispositivo da etapa anterior.

Você pode enviar quantos dados quiser. Este exemplo mostra o envio de 2 mensagens de dados de texto simples. O primeiro exemplo mostra o comando usando valores deste cenário. O segundo comando mostra os nomes dos valores. Para obter mais informações, consulte Usando cURL.

Substitua o <domain-short-id> e o <region> pelos valores do seu ambiente:

https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/sampletopic

Este exemplo de comando curl inclui o URL do host do dispositivo e mostra os valores com base nesse cenário e inclui um tópico de amostra:
curl -u '9K7F8Y3HJGX1FA1GFG9QVV9E2C<vault-secret-OCID>' https://<domain-short-id>.device.iot.us-phoenix-1.oci.oraclecloud.com/sampletopic -H 'Content-Type: plain-text' -d "sample data 2"
Este comando curl de exemplo mostra o nome dos valores sem os valores de exemplo deste cenário:
curl -u '<external-key>:<vault-secret-OCID>' https://<domain-short-id>.device.iot.<region>.oci.oraclecloud.com/sampletopic -H 'Content-Type: plain-text' -d "sample data 1"

Etapa 5: Configurar o Acesso do Domínio IoT ao APEX

Para exibir seus dados no APEX, é necessário configurar o acesso para exibir seus dados IoT no APEX. Uma etapa desse processo usa o comando a seguir para adicionar a senha do APEX ao domínio IoT para que ele possa acessar o APEX.

Use o comando oci iot domain configure-apex-data-access e os parâmetros necessários para configurar o acesso de um domínio IoT ao APEX. Substitua o <your-initial-apex-password> e o <iot-domain-OCID> pelos valores do seu ambiente:
oci iot domain configure-apex-data-access --iot-domain-id <iot-domain-OCID> --db-workspace-admin-initial-password <your-inital-apex-password>

Exemplo de resposta:

{
  "opc-work-request-id": "<work-request-OCID>"
}
Etapa Opcional: Obter Solicitação de Serviço para Acesso aos Dados

Opcional. Durante o tempo necessário para configurar o acesso ao APEX, use o comando oci iot work-request get e o parâmetro necessário para obter a atualização da solicitação de serviço. Substitua o <work-request-id> pelo id da solicitação de serviço da resposta anterior:

oci iot work-request get --work-request-id <work-request-OCID>

Exemplo de resposta:

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "id": "<work-request-OCID>",
    "operation-type": "CONFIGURE_DOMAIN_DATA_ACCESS",
    "percent-complete": 0.0,
    "resources": [
      {
        "action-type": "IN_PROGRESS",
        "entity-type": "iotDomain",
        "entity-uri": "/20250531/iotDomains/<iot-domain-OCID>",
        "identifier": "<iot-domain-OCID>",
        "metadata": null
      }
    ],
    "status": "ACCEPTED",
    "time-accepted": "2025-08-14T17:44:44.716000+00:00",
    "time-finished": null,
    "time-started": null,
    "time-updated": "2025-08-14T17:44:44.716000+00:00"
  },
  "etag": "<unique-id>"
}
Etapa Opcional: Listar Logs de Solicitação de Serviço
Opcional. Durante o tempo necessário para configurar o acesso ao APEX para o domínio, se você quiser listar as entradas de log, poderá usar o comando oci iot work-request list-logs e o parâmetro necessário para listar as entradas de log da solicitação de serviço:
oci iot work-request list-logs --work-request-id <work-request-OCID>

Este exemplo de resposta mostra que o acesso ao APEX para o domínio está em andamento e que ele está sendo concluído:

{
  "data": {
    "items": [
      {
        "message": "Configuring domain data access is in Progress",
        "timestamp": "2025-08-14T17:45:19.708000+00:00"
      },
      {
        "message": "Finishing work request",
        "timestamp": "2025-08-14T17:45:19.978000+00:00"
      }
    ]
  }
}
Etapa Opcional: Listar Erros da Solicitação de Serviço
Opcional. Durante o tempo necessário para configurar o acesso ao APEX para o domínio, se quiser verificar se há erros, você poderá usar o comando oci iot work-request list-errors e o parâmetro necessário para listar erros de solicitações de serviço:
oci iot work-request list-errors --work-request-id <work-request-OCID>
Exemplo de resposta:
{
  "data": {
    "items": []
  }
}
Etapa Opcional: Obter Solicitação de Serviço
Opcional. Para confirmar a conclusão da configuração do acesso ao APEX, use o comando oci iot work-request get e o parâmetro necessário para obter a solicitação de serviço. Substitua o <work-request-id> pelo ID da Solicitação de Serviço:
oci iot work-request get --work-request-id <work-request-OCID>

Este exemplo de resposta mostra que a configuração do acesso ao APEX para o domínio IoT foi atualizada:

"status": "SUCCEEDED"

{
  "data": {
    "compartment-id": "<compartment-OCID>",
    "id": "<work-request-OCID>",
    "operation-type": "CONFIGURE_DOMAIN_DATA_ACCESS",
    "percent-complete": 100.0,
    "resources": [
      {
        "action-type": "UPDATED",
        "entity-type": "iotDomain",
        "entity-uri": "/20250531/iotDomains/<iot-domain-OCID>",
        "identifier": "<iot-domain-OCID>",
        "metadata": null
      }
    ],
    "status": "SUCCEEDED",
    "time-accepted": "2025-08-14T17:44:44.716000+00:00",
    "time-finished": "2025-08-14T17:45:19.978000+00:00",
    "time-started": "2025-08-14T17:45:19.708000+00:00",
    "time-updated": "2025-08-14T17:45:19.978000+00:00"
  },
  "etag": "<unique-id>"
}

Etapa 6: Acessar Dados IoT no APEX

  1. Use o id short de domínio proveniente do host do dispositivo para fazer log-in no APEX:

    https://<domain-group-short-id-from-data-host>.data.iot.<region>.oci.oraclecloud.com/ords/r/apex

    device-host:<domain-short-id>.device.iot.<region>.oci.oraclecloud.com

    No APEX, faça log-in usando:
    Observação

    Observe os dois sublinhados: __WKSP e __IOT.
  2. Para consultar os dados do IoT, selecione o esquema do <domain-short-id-from-device-host>__IOT. Selecione SQL Workshop e, em seguida, Object Browser.

    URL do SQL workshop:

    https://<domain-group-short-id-from-data-host>.data.iot.<region>.oci.oraclecloud.com/ords/r/apex/sql-workshop
  3. Consulte os dados IoT informando e executando um comando SQL. Confirme se você selecionou o esquema correto para a tabela de banco de dados que deseja consultar. Execute o seguinte comando:
    select * from RAW_DATA

    Agora, você pode ver as views de banco de dados, esquemas e dados brutos do seu dispositivo conectado à Internet of Things.

    Para ver uma captura de tela maior, clique com o botão direito do mouse e abra a imagem em uma nova janela do navegador.

APEX IoT