Todos os produtos
Search
Central de documentação

IoT Platform:Exemplo

Última atualização: Jun 26, 2026

Para configurar sombras de dispositivo com , use o arquivo de código de exemplo ./demos/shadow_basic_demo.c.

Informações básicas

  • Para obter mais informações sobre sombras de dispositivo, consulte Visão geral.

  • O usa conexões MQTT. Para exemplos de código relacionados, consulte Conexão MQTT.

no heading

Etapa 1: Inicialização

  1. Adicione os arquivos de cabeçalho.

    ...
    ...
    
    #include "aiot_shadow_api.h"
  2. Configure as dependências subjacentes e a saída de log.

        aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile);
        aiot_state_set_logcb(demo_state_logcb);
  3. Chame a operação aiot_shadow_init para crie uma instância shadow.

        shadow_handle = aiot_shadow_init();
        if (shadow_handle == NULL) {
            printf("aiot_shadow_init failed\n");
            return -1;
        }

no heading

Etapa 2: Configurar recursos

Chame a operação aiot_shadow_setopt para configure os itens a seguir.

  1. Associe um identificador de conexão MQTT.

    Importante

    Antes de defina parâmetros específicos da sombra do dispositivo,

    •     aiot_shadow_setopt(shadow_handle, AIOT_SHADOWOPT_MQTT_HANDLE, mqtt_handle);
    • Parâmetro

      Exemplo

      Descrição

      AIOT_SHADOWOPT_MQTT_HANDLE

      mqtt_handle

      As solicitações TSL usam esta conexão.

  2. Configure um callback de mensagem

    •     aiot_shadow_setopt(shadow_handle, AIOT_SHADOWOPT_RECV_HANDLER, (void *)demo_shadow_recv_handler);
    • Parâmetro

      Exemplo

      Descrição

      AIOT_SHADOWOPT_RECV_HANDLER

      demo_shadow_recv_handler

      Esta função é chamada quando a mensagem da sombra do dispositivo é recebida.

Etapa 3: Envie o status do dispositivo

  1. O dispositivo chama a operação aiot_shadow_send para envie o status mais recente à sombra do dispositivo no IoT Platform.

    Ao enviar o status, observe os seguintes itens:

    • aiot_shadow_msg_t indica o formato dos dados. Este é um parâmetro de entrada do callback aiot_shadow_send().

    • AIOT_SHADOWMSG_UPDATE indica o tipo de mensagem.

    int32_t demo_update_shadow(void *shadow_handle, char *reported_data, int64_t version)
    {
        aiot_shadow_msg_t message;
    
        memset(&message, 0, sizeof(aiot_shadow_msg_t));
        message.type = AIOT_SHADOWMSG_UPDATE;
        message.data.update.reported = reported_data;
        message.data.update.version = version;
    
        return aiot_shadow_send(shadow_handle, &message);
    }
  2. Especifique o conteúdo da mensagem.

    •         res = demo_update_shadow(shadow_handle, "{\"LightSwitch\":1}", 0);
              if (res < 0) {
                  printf("demo_delete_shadow_report failed, res = -0x%04x\r\n", -res);
              }
    • Mensagem de exemplo:

      Mensagem de exemploFormato AlinkDescrição
      {
          "LightSwitch": 1
      }
      {
            "method": "update", 
            "state": {
              "reported": {
                "LightSwitch": 1
              }
            }, 
            "version": 0
          }
      O conteúdo da mensagem está no formato JSON e é indicado pelo parâmetro state nos dados Alink. Para obter mais informações, consulte Um dispositivo relata seu status.

      Os itens a seguir descrevem o conteúdo da mensagem neste exemplo:

      • Defina a propriedade LightSwitch como 1.
      • Defina o número da versão como 0.
        Nota
        • Os números de versão das operações subsequentes devem ser incrementados. Caso contrário, o IoT Platform retornará um erro.
        • Se você definir o número da versão como -1, o IoT Platform limpará os dados da sombra do dispositivo e atualizará o número da versão para 0.
  3. Após receber a mensagem, o IoT Platform atualize o arquivo de sombra e retorna uma resposta ao dispositivo.

  4. Quando o dispositivo recebe a resposta, o callback demo_shadow_recv_handler é chamado.

    Ao defina a lógica do callback, observe os seguintes itens:

    • aiot_shadow_recv_t indica o formato dos dados. Este é um parâmetro de entrada do callback.

    • AIOT_SHADOWRECV_GENERIC_REPLY indica o tipo de mensagem.

    • A tabela a seguir descreve uma resposta de exemplo e o formato Alink correspondente.

      ExemploFormato AlinkDescrição
      {
          "status":"success",
          "version":0
      }
      {
            "method": "reply", 
            "payload": {
              "status": "success", 
              "version": 0
            }, 
            "timestamp": 1626317187
          }
      A resposta é indicada pelo parâmetro payload nos dados Alink.

      Esta resposta de exemplo indica que o status foi enviado.

    • Neste exemplo, a mensagem é impressa.

    void demo_shadow_recv_handler(void *handle, const aiot_shadow_recv_t *recv, void *userdata)
    {
        printf("demo_shadow_recv_handler, type = %d, productKey = %s, deviceName = %s\r\n",
                recv->type, recv->product_key, recv->device_name);
    
        switch (recv->type) {
    
            case AIOT_SHADOWRECV_GENERIC_REPLY: {
                const aiot_shadow_recv_generic_reply_t *generic_reply = &recv->data.generic_reply;
    
                printf("payload = \"%.*s\", status = %s, timestamp = %ld\r\n",
                       generic_reply->payload_len,
                       generic_reply->payload,
                       generic_reply->status,
                       (unsigned long)generic_reply->timestamp);
            }
    ……
    ...
            default:
                break;
        }
    }

Etapa 4: Alterar o status do dispositivo usando propriedades desejadas

Para alterar o status do dispositivo, use um aplicativo para envie propriedades desejadas à sombra do dispositivo. Você também pode fazer login no console do IoT Platform e modifique as propriedades desejadas na sombra do dispositivo.

  1. Atualize as propriedades desejadas na sombra do dispositivo. Os métodos a seguir estão disponíveis:

    • Desenvolva um aplicativo em nuvem e chame a operação de API para envie propriedades desejadas à sombra do dispositivo. Para obter mais informações, consulte UpdateDeviceShadow.

    • Na página Device Details do IoT Platform, modifique as propriedades desejadas na sombra do dispositivo. Para obter mais informações, consulte Visualize e atualize uma sombra de dispositivo.

  2. O IoT Platform atualize o arquivo de sombra e o envia ao dispositivo.

  3. Após o dispositivo receber o arquivo de sombra, o callback demo_shadow_recv_handler é chamado.

    Importante

    Se o dispositivo estiver offline, solicite a sombra do dispositivo após ele ficar online. Para obter mais informações, consulte

    Etapa 5: Solicitar a sombra do dispositivo

    .

    Ao defina a lógica do callback, observe os seguintes itens:

    • aiot_shadow_recv_t indica o formato dos dados. Este é um parâmetro de entrada do callback.

    • AIOT_SHADOWRECV_CONTROL indica o tipo de mensagem.

    • A tabela a seguir descreve uma mensagem de exemplo e o formato Alink correspondente.

      ExemploFormato AlinkDescrição
      {
          "state": {
              "desired": {
                  "LightSwitch": 0
              }
          },
          "metadata": {
              "desired": {
                  "LightSwitch": {
                      "timestamp": 1626319658
                  }
              }
          }
      }
      {
            "method": "control", 
            "payload": { 
             "state": {
                  "desired": {
                      "LightSwitch": 0
                  }
              },
              "metadata": {
                  "desired": {
                      "LightSwitch": {
                          "timestamp": 1626319658 
                 }
                }
              }
            }, 
            "version": 2, 
            "timestamp": 1469564576
          }
      A resposta é indicada pelo parâmetro payload nos dados Alink.

      Neste exemplo, a propriedade desejada LightSwitch é definida como 0.

    • Neste exemplo, a mensagem é impressa.

    void demo_shadow_recv_handler(void *handle, const aiot_shadow_recv_t *recv, void *userdata)
    {
        printf("demo_shadow_recv_handler, type = %d, productKey = %s, deviceName = %s\r\n",
                recv->type, recv->product_key, recv->device_name);
    
        switch (recv->type) {
    ...
    ...
            case AIOT_SHADOWRECV_CONTROL: {
                const aiot_shadow_recv_control_t *control = &recv->data.control;
    
                printf("payload = \"%.*s\", version = %ld\r\n",
                       control->payload_len,
                       control->payload,
                       (unsigned long)control->version);
            }
    ……
    ...
            default:
                break;
        }
    }
  4. Após atualize o status local, o dispositivo envia o status mais recente para a sombra do dispositivo e processa a resposta.

    Para obter mais informações, consulte

    Etapa 3: Envie o status do dispositivo

    .

  5. O dispositivo chama a operação aiot_shadow_send para exclua as propriedades desejadas.

    Ao excluir propriedades desejadas, observe os seguintes itens:

    • aiot_shadow_msg_t indica o formato dos dados. Este é um parâmetro de entrada do callback aiot_shadow_send().

    • AIOT_SHADOWMSG_CLEAN_DESIRED indica o tipo de mensagem.

    • Neste exemplo, todas as propriedades desejadas são excluídas e o número da versão é definido como 1.

    int32_t demo_clean_shadow_desired(void *shadow_handle, int64_t version)
    {
        aiot_shadow_msg_t message;
    
        memset(&message, 0, sizeof(aiot_shadow_msg_t));
        message.type = AIOT_SHADOWMSG_CLEAN_DESIRED;
        message.data.clean_desired.version = version;
    
        return aiot_shadow_send(shadow_handle, &message);
    }
    ……
    ...
            res = demo_clean_shadow_desired(shadow_handle, 1);
            if (res < 0) {
                printf("demo_clean_shadow_desired failed, res = -0x%04x\r\n", -res);
            }
  6. Após o IoT Platform receber a solicitação para exclua propriedades desejadas, ele retorna uma resposta. Nesse caso, o callback demo_shadow_recv_handler é chamado.

    Para obter mais informações, consulte

    Configure um callback para processar respostas

    .

Etapa 5: Solicitar a sombra do dispositivo

  1. O dispositivo chama a operação aiot_shadow_send para solicitar o conteúdo da sombra do dispositivo ao IoT Platform.

    AIOT_SHADOWMSG_GET

    indica o tipo de mensagem.

    int32_t demo_get_shadow(void *shadow_handle)
    {
        aiot_shadow_msg_t message;
    
        memset(&message, 0, sizeof(aiot_shadow_msg_t));
        message.type = AIOT_SHADOWMSG_GET;
    
        return aiot_shadow_send(shadow_handle, &message);
    }
    ……
    ...
            res = demo_get_shadow(shadow_handle);
            if (res < 0) {
                printf("demo_get_shadow failed, res = -0x%04x\r\n", -res);
            }
  2. Após o IoT Platform receber a solicitação, ele retorna uma resposta. Quando o dispositivo recebe a resposta, o callback demo_shadow_recv_handler é chamado.

    Ao defina a lógica do callback, observe os seguintes itens:

    • aiot_shadow_recv_t indica o formato dos dados. Este é um parâmetro de entrada do callback.

    • AIOT_SHADOWRECV_GET_REPLY indica o tipo de mensagem.

    • A tabela a seguir descreve uma resposta de exemplo e o formato Alink correspondente.

      ExemploFormato AlinkDescrição
      {
          "status": "success",
          "state": {
              "reported": {
      
              }
          },
          "metadata": {
              "reported": {
      
              }
          }
      }
      {
            "method": "reply", 
            "payload": {
              "status": "success",
              "state": {
                  "reported": {
      
                  }
              },
              "metadata": {
                  "reported": {
      
                  }
              }
          }, 
            "version": 5, 
            "timestamp": 1626320690
          }
      A resposta é indicada pelo parâmetro payload nos dados Alink.

      Esta resposta de exemplo indica que a solicitação foi bem-sucedida. O parâmetro reported não contém dados, o que indica que nenhuma propriedade foi enviada.

    • Neste exemplo, a mensagem é impressa.

    void demo_shadow_recv_handler(void *handle, const aiot_shadow_recv_t *recv, void *userdata)
    {
        printf("demo_shadow_recv_handler, type = %d, productKey = %s, deviceName = %s\r\n",
                recv->type, recv->product_key, recv->device_name);
    
        switch (recv->type) {
    ...
    ...
            case AIOT_SHADOWRECV_GET_REPLY: {
                const aiot_shadow_recv_get_reply_t *get_reply = &recv->data.get_reply;
    
                printf("payload = \"%.*s\", version = %ld\r\n",
                       get_reply->payload_len,
                       get_reply->payload,
                       (unsigned long)get_reply->version);
            }
            default:
                break;
        }
    }

Etapa 6: Exclua propriedades na sombra do dispositivo

  1. O dispositivo chama a operação aiot_shadow_send para exclua propriedades especificadas na sombra do dispositivo.

    Ao enviar uma solicitação, observe os seguintes itens:

    • aiot_shadow_msg_t indica o formato dos dados. Este é um parâmetro de entrada do callback aiot_shadow_send().

    • AIOT_SHADOWMSG_DELETE_REPORTED indica o tipo de mensagem.

    int32_t demo_delete_shadow_report(void *shadow_handle, char *reported, int64_t version)
    {
        aiot_shadow_msg_t message;
    
        memset(&message, 0, sizeof(aiot_shadow_msg_t));
        message.type = AIOT_SHADOWMSG_DELETE_REPORTED;
        message.data.delete_reporte.reported = reported;
        message.data.delete_reporte.version = version;
    
        return aiot_shadow_send(shadow_handle, &message);
    }
  2. Especifique as propriedades a serem excluídas.

    •         res = demo_delete_shadow_report(shadow_handle, "{\"LightSwitch\":\"null\"}", 2);
              if (res < 0) {
                  printf("demo_delete_shadow_report failed, res = -0x%04x\r\n", -res);
              }
    • Mensagem de exemplo:

      ExemploFormato AlinkDescrição
      "{\"LightSwitch\":\"null\"}", 2
      {
            "method": "delete", 
            "state": {
              "reported": {
                "LightSwitch": "null", 
              }
            }, 
            "version": 2
          }
      O conteúdo da mensagem está no formato JSON e é indicado pelo parâmetro state nos dados Alink. Para obter mais informações, consulte Um dispositivo exclui propriedades da sombra.

      Os itens a seguir descrevem o conteúdo da mensagem neste exemplo:

      • Defina a propriedade LightSwitch como null. Este valor indica que todos os dados na sombra do dispositivo foram limpos.
      • Defina o número da versão como 2.
  3. Após o IoT Platform receber a solicitação, ele retorna uma resposta. Quando o dispositivo recebe a resposta, o callback demo_shadow_recv_handler é chamado.

    Para obter mais informações, consulte

    Configure um callback para processar respostas

    .

Etapa 7: Sair do programa

Chame a operação aiot_shadow_deinit para destruir a instância shadow.

    res = aiot_shadow_deinit(&shadow_handle);
    if (res < STATE_SUCCESS) {
        printf("aiot_shadow_deinit failed: -0x%04X\n", -res);
        return -1;
    }

Próximos passos

  • Neste exemplo, o arquivo executável ./demos/shadow-basic-demo é gerado.

    Para obter mais informações, consulte Compilar e execute.

    Importante
    • Ao configure o arquivo de código de exemplo, remova os símbolos de comentário (/* e */) em ambos os lados do código e altere os números de versão conforme os cenários reais.

    • Ao alterar números de versão, observe os seguintes itens:

      • Os números de versão das operações subsequentes devem ser incrementados. Caso contrário, o IoT Platform retornará um erro.

      • Se você defina o número da versão como -1, o IoT Platform limpará os dados da sombra do dispositivo e atualize o número da versão para 0.

  • Logs de execução.