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
-
Adicione o arquivo de cabeçalho.
…… …… #include "aiot_subdev_api.h" -
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); -
Chame aiot_subdev_init para crie uma instância de cliente
subdeve 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.
-
Associe o handle da conexão MQTT.
ImportanteAntes 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.
-
-
Configure os callbacks de mensagem para os recursos de gateway e subdispositivo.
-
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.
-
-
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: { } } } -
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.
-
Defina a variável
g_subdevpara 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******" } }; -
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; } -
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; } -
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; } -
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.
ImportanteQuando 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; } Se o subdispositivo estiver offline, as mensagens
QoS=0do 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.
-
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?.
-
-
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.
-
-
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.
Para obter mais detalhes sobre os resultados, consulte Logs operacionais.
Etapa 3: Adicionar um relacionamento de topologia
Etapa 4: Fazer logon no subdispositivo
Após o logon ou logoff de um subdispositivo, o IoT Platform trata as mensagens com base no status do 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.
ImportanteAo 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.
Etapa 6: Publicar uma mensagem do subdispositivo
Chame aiot_mqtt_pub para publicar uma mensagem em um tópico específico do subdispositivo.
Etapa 7: Desconectar o gateway
NotaO 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
subdeve 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
-