Todos os produtos
Search
Central de documentação

IoT Platform:Exemplo de uso

Última atualização: Jun 26, 2026

Use o arquivo de demonstração ./demos/subdev_basic_demo.c no C Link SDK para chamar as APIs do Link SDK e conectar um subdispositivo ao IoT Platform por meio de um gateway.

Informações básicas

  • Para obter mais informações sobre gateways e subdispositivos, consulte Visão geral.

  • O gateway do subdispositivo deve manter uma conexão persistente com o IoT Platform. O método de conexão é idêntico ao de um dispositivo conectado diretamente. Para mais detalhes, consulte Visão geral da conexão MQTT.

    Neste exemplo, as informações de autenticação de identidade do dispositivo gateway são:

    ProductKey

    DeviceName

    DeviceSecret

    a18wP

    LightSwitchGW

    uwMTmVAMnGGHaAkqmeDY6cHxxB

Etapa 1: Inicialização

  1. Adicione o arquivo de cabeçalho.

    ……
    ……
    
    #include "aiot_subdev_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 aiot_subdev_init para crie uma instância de cliente subdev e inicializar os parâmetros padrão.

        subdev_handle = aiot_subdev_init();
        if (subdev_handle == NULL) {
            printf("aiot_subdev_init failed\n");
            demo_mqtt_stop(&mqtt_handle);
            return -1;
        }

Etapa 2: Configure recursos

Chame aiot_subdev_setopt para configure os seguintes recursos.

  1. Associar o handle da conexão MQTT.

  2. Configure callbacks de mensagem para recursos de gateway e subdispositivo.

  1. Associe o handle da conexão MQTT.

    Importante

    Antes de configure os parâmetros dos recursos de gateway e subdispositivo, certifique-se de ter configurado as informações de autenticação de identidade do gateway. Para mais informações, consulte Configure parâmetros de conexão para MQTT.

    • Código de exemplo:

          aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_MQTT_HANDLE, mqtt_handle);
    • Parâmetros:

      Item de configuração

      Exemplo

      Descrição

      AIOT_SUBDEVOPT_MQTT_HANDLE

      mqtt_handle

      Os recursos de gateway e subdispositivo dependem da conexão MQTT. Use este item de configuração para associar o handle da conexão MQTT.

  2. Configure os callbacks de mensagem para os recursos de gateway e subdispositivo.

    1. Configure a função de callback de mensagem.

      • Código de exemplo:

            aiot_subdev_setopt(subdev_handle, AIOT_SUBDEVOPT_RECV_HANDLER, demo_subdev_recv_handler);
      • Parâmetros:

        Item de configuração

        Valor de exemplo

        Descrição

        AIOT_SUBDEVOPT_RECV_HANDLER

        demo_subdev_recv_handler

        Quando o dispositivo recebe mensagens de gateway ou subdispositivo do IoT Platform, essa função de callback é acionada para processá-las adequadamente.

    2. Defina a função de callback de mensagem.

      Para informações sobre o formato de dados Alink das mensagens, consulte Gerencie relacionamentos de topologia e Status online e offline do subdispositivo.

      void demo_subdev_recv_handler(void *handle, const aiot_subdev_recv_t *packet, void *user_data)
      {
          switch (packet->type) {
              case AIOT_SUBDEVRECV_TOPO_ADD_REPLY:
              case AIOT_SUBDEVRECV_TOPO_DELETE_REPLY:
              case AIOT_SUBDEVRECV_TOPO_GET_REPLY:
              case AIOT_SUBDEVRECV_BATCH_LOGIN_REPLY:
              case AIOT_SUBDEVRECV_BATCH_LOGOUT_REPLY:
              case AIOT_SUBDEVRECV_SUB_REGISTER_REPLY:
              case AIOT_SUBDEVRECV_PRODUCT_REGISTER_REPLY: {
                  printf("msgid        : %d\n", packet->data.generic_reply.msg_id);
                  printf("code         : %d\n", packet->data.generic_reply.code);
                  printf("product key  : %s\n", packet->data.generic_reply.product_key);
                  printf("device name  : %s\n", packet->data.generic_reply.device_name);
                  printf("message      : %s\n", (packet->data.generic_reply.message == NULL)?("NULL"):(packet->data.generic_reply.message));
                  printf("data         : %s\n", packet->data.generic_reply.data);
              }
              break;
              case AIOT_SUBDEVRECV_TOPO_CHANGE_NOTIFY: {
                  printf("msgid        : %d\n", packet->data.generic_notify.msg_id);
                  printf("product key  : %s\n", packet->data.generic_notify.product_key);
                  printf("device name  : %s\n", packet->data.generic_notify.device_name);
                  printf("params       : %s\n", packet->data.generic_notify.params);
              }
              break;
              default: {
      
              }
          }
      }
    3. Etapa 3: Adicionar um relacionamento de topologia

      1. Obtenha as informações de autenticação do subdispositivo.

        Crie um produto e um dispositivo para o subdispositivo. Ao crie o produto, defina o tipo de nó como Gateway Sub-device. Por exemplo, crie um produto de subdispositivo e adicione quatro subdispositivos.

        Product Name

        ProductKey

        DeviceName

        DeviceSecret

        ProductSecret

        LightSwitchSD

        a13FN

        LightSwitch_SubDev_01

        768XBgQwgOakz3K4uhOiLeeh9x

        y7GSILD480

        LightSwitch_SubDev_02

        iwTZrbjbgNVChfuJkihjE5asek

        LightSwitch_SubDev_03

        fdutq35iKMYdcWWBuIINY26hsN

        LightSwitch_SubDev_04

        HCKv50YqgwdKhy5cE0Vz4aydmK

        Para mais informações, consulte Criar um produto e Criar um dispositivo.

      2. Defina a variável g_subdev para as informações de autenticação do subdispositivo.

        O código de exemplo pré-configura informações de autenticação para quatro subdispositivos. Em um ambiente de produção, escreva seu próprio código para recuperar as informações de autenticação do subdispositivo. Exemplos:

        • Defina um protocolo entre o gateway e o subdispositivo que permita ao gateway descobrir o subdispositivo e obter seu certificado de dispositivo. Os fabricantes do gateway e do subdispositivo definem esse protocolo.

        • Alternativamente, o fabricante do gateway pode fornecer um método para pré-configurar as informações do certificado do subdispositivo no gateway.

        aiot_subdev_dev_t g_subdev[] = {
            {
                "a13FN******",
                "LightSwitch_SubDev_01",
                "768XBgQwgOakz3K4uhOiLeeh9x******",
                "y7GSILD480******"
            },
            {
                "a13FN******",
                "LightSwitch_SubDev_02",
                "iwTZrbjbgNVChfuJkihjE5asek******",
                "y7GSILD480******"
            },
            {
                "a13FN******",
                "LightSwitch_SubDev_03",
                "fdutq35iKMYdcWWBuIINY26hsN******",
                "y7GSILD480******"
            },
            {
                "a13FN******",
                "LightSwitch_SubDev_04",
                "HCKv50YqgwdKhy5cE0Vz4aydmK******",
                "y7GSILD480******"
            }
        };
      3. Chame aiot_subdev_send_topo_add para enviar uma solicitação ao IoT Platform e adicionar um relacionamento de topologia entre o subdispositivo e o dispositivo gateway.

            res = aiot_subdev_send_topo_add(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
            if (res < STATE_SUCCESS) {
                printf("aiot_subdev_send_topo_add failed, res: -0x%04X\n", -res);
                aiot_subdev_deinit(&subdev_handle);
                demo_mqtt_stop(&mqtt_handle);
                return -1;
            }
      4. Opcional: Caso o dispositivo gateway não atue mais como agente para o subdispositivo receber mensagens do IoT Platform, chame aiot_subdev_send_topo_delete para exclua o relacionamento de topologia entre o subdispositivo e o dispositivo gateway.

             aiot_subdev_send_topo_delete(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
             if (res < STATE_SUCCESS) {
                 printf("aiot_subdev_send_topo_delete failed, res: -0x%04X\n", -res);
                 aiot_subdev_deinit(&subdev_handle);
                 demo_mqtt_stop(&mqtt_handle);
                 return -1;
             }

      Etapa 4: Fazer logon no subdispositivo

      1. Chame aiot_subdev_send_batch_login para enviar uma solicitação ao IoT Platform e fazer logon nos subdispositivos em lote. Após o logon dos subdispositivos usando o relacionamento de topologia estabelecido, o status deles muda para Online.

            aiot_subdev_send_batch_login(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
            if (res < STATE_SUCCESS) {
                printf("aiot_subdev_send_batch_login failed, res: -0x%04X\n", -res);
                aiot_subdev_deinit(&subdev_handle);
                demo_mqtt_stop(&mqtt_handle);
                return -1;
            }
      2. Opcional: Para colocar um subdispositivo offline, chame aiot_subdev_send_batch_logout para enviar uma solicitação ao IoT Platform. Depois que o IoT Platform recebe a solicitação, o subdispositivo fica offline e seu status muda para Offline.

        Importante

        Quando esta API é chamada, o IoT Platform atualize o status do subdispositivo para offline, o que impede o gateway de receber mensagens destinadas ao subdispositivo.

             aiot_subdev_send_batch_logout(subdev_handle, g_subdev, sizeof(g_subdev)/sizeof(aiot_subdev_dev_t));
             if (res < STATE_SUCCESS) {
                 printf("aiot_subdev_send_batch_logout failed, res: -0x%04X\n", -res);
                 aiot_subdev_deinit(&subdev_handle);
                 demo_mqtt_stop(&mqtt_handle);
                 return -1;
             }

      Após o logon ou logoff de um subdispositivo, o IoT Platform trata as mensagens com base no status do subdispositivo:

      • Se o subdispositivo estiver offline, as mensagens QoS=0 do IoT Platform para o subdispositivo são descartadas imediatamente.

      • Caso o subdispositivo esteja online, o IoT Platform envia as mensagens destinadas a ele para o gateway correspondente, que então as encaminha ao subdispositivo.

      Etapa 5: Inscrever-se em um tópico para o subdispositivo

      Depois que um subdispositivo se conecta ao IoT Platform por meio de um gateway, chame aiot_mqtt_sub para se inscrever no tópico do subdispositivo e receber mensagens dele.

      Importante

      Ao se inscrever em um tópico, diferencie o ProductKey e o DeviceName do subdispositivo e do gateway. Certifique-se de se inscrever no tópico correto do dispositivo.

      • Código de exemplo:

            {
                char *sub_topic = "/a13FN******/LightSwitch_SubDev_01/user/get";
        
                res = aiot_mqtt_sub(mqtt_handle, sub_topic, NULL, 1, NULL);
                if (res < 0) {
                    printf("aiot_mqtt_sub failed, res: -0x%04X\n", -res);
                    return -1;
                }
            }
      • Parâmetros:

        Parameter

        Example

        Description

        sub_topic

        /a13FN/LightSwitch_SubDev_01/user/get

        Um tópico no qual você tem permissões de inscrição. Neste tópico:

        • a13FN é o ProductKey do subdispositivo.

        • LightSwitch_SubDev_01 é o DeviceName do subdispositivo.

        Este exemplo usa um tópico personalizado padrão para o subdispositivo receber mensagens do IoT Platform.

        Para mais informações sobre tópicos, consulte O que é um tópico?.

      Etapa 6: Publicar uma mensagem do subdispositivo

      Chame aiot_mqtt_pub para publicar uma mensagem em um tópico específico do subdispositivo.

      • Código de exemplo:

             {
                char *pub_topic = "/a13FN******/LightSwitch_SubDev_01/user/update";
                char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}";
        
                res = aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
                if (res < 0) {
                    printf("aiot_mqtt_sub failed, res: -0x%04X\n", -res);
                    return -1;
                }
            }
      • Parâmetros:

        Parameter

        Example

        Description

        pub_topic

        /a13FN/LightSwitch_SubDev_01/user/update

        Um tópico no qual você tem permissões de publicação. Neste tópico:

        • a13FN é o ProductKey do subdispositivo.

        • LightSwitch_SubDev_01 é o DeviceName do subdispositivo.

        Este exemplo usa um tópico personalizado padrão para o subdispositivo. O dispositivo usa este tópico para publicar mensagens no IoT Platform.

        Para mais informações sobre tópicos, consulte O que é um tópico?.

        pub_payload

        {\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0}}

        O conteúdo da mensagem reportada ao IoT Platform.

        Como a categoria do tópico da mensagem de exemplo é personalizada, o formato dos dados também pode ser personalizado.

        Para mais informações sobre formatos de dados, consulte Formatos de dados.

      Etapa 7: Desconectar o gateway

      Nota

      O MQTT é normalmente usado para dispositivos que exigem uma conexão persistente. Portanto, o programa geralmente não chega a este ponto.

      No programa de exemplo, a thread principal é responsável por configure parâmetros e estabelecer a conexão. Após o estabelecimento da conexão, a thread principal pode entrar em hibernação.

      Chame aiot_mqtt_disconnect para enviar uma mensagem de desconexão ao IoT Platform e desconectar-se da rede.

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

      Etapa 8: Sair do programa

      Chame aiot_subdev_deinit para destruir a instância de cliente subdev e liberar os recursos associados.

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

      Próximos passos

      • Após configure o arquivo de exemplo, compile-o para gerar o arquivo executável ./output/subdev-basic-demo.

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