Use as operações da API do Link SDK for C para distribuir dispositivos com o arquivo de código de exemplo ./demos/bootstrap_posix_demo.c.
Informações básicas
Para obter mais informações sobre o recurso de distribuição de dispositivos, consulte Visão geral.
Após obter as informações de conexão por meio da distribuição de dispositivos, conecte o dispositivo ao IoT Platform. Para mais detalhes sobre conexões MQTT, consulte Conexão MQTT.
Etapa 1: Inicialização
-
Adicione o arquivo de cabeçalho.
…… …… #include "aiot_bootstrap_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_bootstrap_init para crie uma instância
Bootstrap.bootstrap_handle = aiot_bootstrap_init(); if (bootstrap_handle == NULL) { printf("aiot_bootstrap_init failed\n"); return -1; }
Etapa 2: Configure recursos
Chame aiot_bootstrap_setopt para configure os seguintes recursos:
-
Importante
O tipo de conexão segura para a camada Transport Layer Security (TLS) deve ser baseado em certificado (AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA).
-
int32_t res = STATE_SUCCESS; void *bootstrap_handle = NULL, *mqtt_handle = NULL; aiot_sysdep_network_cred_t cred; demo_info_t demo_info; /* TODO: Replace with your device's productKey and deviceName. */ char *product_key = "a18wP******"; char *device_name = "LightSwitch"; char *device_secret = "uwMTmVAMnGGHaAkqmeDY6cHxxB******"; …… …… memset(&cred, 0, sizeof(aiot_sysdep_network_cred_t)); cred.option = AIOT_SYSDEP_NETWORK_CRED_SVRCERT_CA; /* Use an RSA certificate to authenticate the MQTT server. */ cred.max_tls_fragment = 16384; /* The maximum shard length is 16 KB. Other valid values are 4 KB, 2 KB, 1 KB, and 0.5 KB. */ cred.sni_enabled = 1; /* Support Server Name Indicator (SNI) during TLS connection establishment. */ cred.x509_server_cert = ali_ca_cert; /* The RSA root certificate used to authenticate the MQTT server. */ cred.x509_server_cert_len = strlen(ali_ca_cert); /* The length of the RSA root certificate used to authenticate the MQTT server. */ …… …… aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_HOST, (void *)host); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_PORT, (void *)&port); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_PRODUCT_KEY, (void *)product_key); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_DEVICE_NAME, (void *)device_name); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_NETWORK_CRED, (void *)&cred); …… …… -
Parâmetro
Exemplo
Descrição
product_key
a18wP
Informações de autenticação do dispositivo. Para mais informações, consulte Obter informações de verificação do dispositivo.
Este exemplo usa o método de autenticação de certificado único por dispositivo.
O parâmetro device_secret é usado quando o dispositivo estabelece uma conexão MQTT após obter o nome de domínio e o número da porta de conexão.
device_name
LightSwitch
device_secret
uwMTmVAMnGGHaAkqmeDY6cHxxB
-
-
Configure os callbacks de mensagem.
-
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_RECV_HANDLER, (void *)demo_bootstrap_recv_handler); aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_USERDATA, (void *)&demo_info); -
Item de configuração
Valor de exemplo
Descrição
AIOT_BOOTSTRAPOPT_RECV_HANDLER
demo_bootstrap_recv_handler
Função chamada ao receber uma mensagem de distribuição de dispositivo.
AIOT_BOOTSTRAPOPT_USERDATA
demo_info
Define o contexto do usuário. Quando
demo_bootstrap_recv_handleré acionado,userdataé retornado. Faça o cast dos dados retornados para o tipo apropriado antes do uso.
-
-
Configure o monitoramento de status.
-
Defina o callback para monitorar o status.
void demo_bootstrap_event_handler(void *handle, const aiot_bootstrap_event_t *event, void *userdata) { switch (event->type) { case AIOT_BOOTSTRAPEVT_INVALID_RESPONSE: { printf("AIOT_BOOTSTRAPEVT_INVALID_RESPONSE\n"); } break; case AIOT_BOOTSTRAPEVT_INVALID_CMD: { printf("AIOT_BOOTSTRAPEVT_INVALID_CMD\n"); } break; default: { } break; } } -
Especifique os callbacks para monitorar o status.
-
Código de exemplo:
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_EVENT_HANDLER, (void *)demo_bootstrap_event_handler); -
Parâmetros:
Item de configuração
Valor de exemplo
Descrição
AIOT_BOOTSTRAPOPT_EVENT_HANDLER
demo_bootstrap_event_handler
Executa a lógica de processamento definida nesta função de callback quando o status da conexão do dispositivo muda.
-
-
Etapa 3: Enviar uma solicitação
Antes de enviar uma solicitação de distribuição de dispositivo, certifique-se de que a operação de distribuição esteja configurada no console do IoT Platform. Caso contrário, o nome de domínio e a porta retornados serão referentes à conexão atual do dispositivo.
Chame aiot_bootstrap_send_request para enviar uma solicitação HTTPS de distribuição de dispositivo ao servidor, com base nos parâmetros configurados na etapa anterior.
Para mais informações sobre a solicitação HTTPS, consulte Formato de dados da solicitação para distribuição de dispositivos.
res = aiot_bootstrap_send_request(bootstrap_handle);
if (res < STATE_SUCCESS) {
printf("aiot_bootstrap_send_request failed, res: -0x%04X\n", -res);
return -1;
}
Etapa 4: Receber um reconhecimento
-
Após o envio da mensagem, o IoT Platform retorna uma resposta. O dispositivo chama aiot_bootstrap_recv para receber os dados de resposta e processá-los por meio do callback de mensagem.
res = aiot_bootstrap_recv(bootstrap_handle); if (res < STATE_SUCCESS) { printf("aiot_bootstrap_recv failed, res: -0x%04X\n", -res); return -1; } -
Escreva a lógica da função de callback.
Escreva a lógica da função de callback com base nas seguintes informações:
Tipo de mensagem
Descrição
AIOT_BOOTSTRAPRECV_STATUS_CODE
Código de status HTTP retornado pelo servidor. Para mais informações, consulte Códigos de status HTTP.
O código de exemplo não processa o código de status recebido. Adicione sua própria lógica de processamento conforme necessário.
AIOT_BOOTSTRAPRECV_CONNECTION_INFO
Mensagem de reconhecimento que o IoT Platform retorna após o início da distribuição do dispositivo.
A mensagem recebida é do tipo aiot_bootstrap_recv_t. Salve os valores host e port, correspondentes ao nome de domínio e ao número da porta para conexão do dispositivo, no seu dispositivo local.
O código de exemplo apenas imprime a mensagem de distribuição de dispositivo recebida.
AIOT_BOOTSTRAPRECV_NOTIFY
Mensagem de notificação de distribuição enviada pelo IoT Platform.
Ao realizar a operação de distribuição no IoT Platform, uma mensagem é enviada ao dispositivo. Para mais informações, consulte Distribuição de dispositivos no IoT Platform.
O código de exemplo apenas imprime a mensagem. Adicione lógica para desconectar o dispositivo, enviar uma nova solicitação de distribuição e restabelecer a conexão.
void demo_bootstrap_recv_handler(void *handle, const aiot_bootstrap_recv_t *packet, void *userdata) { demo_info_t *demo_info = (demo_info_t *)userdata; switch (packet->type) { case AIOT_BOOTSTRAPRECV_STATUS_CODE: { demo_info->code = packet->data.status_code.code; } break; case AIOT_BOOTSTRAPRECV_CONNECTION_INFO: { demo_info->host = malloc(strlen(packet->data.connection_info.host) + 1); if (demo_info->host != NULL) { memset(demo_info->host, 0, strlen(packet->data.connection_info.host) + 1); /* TODO: In the callback, store the device distribution message content in a specified location. This space will then be released by the SDK. */ memcpy(demo_info->host, packet->data.connection_info.host, strlen(packet->data.connection_info.host)); demo_info->port = packet->data.connection_info.port; } } break; case AIOT_BOOTSTRAPRECV_NOTIFY: { printf("AIOT_BOOTSTRAPRECV_NOTIFY, cmd: %d\n", packet->data.notify.cmd); } default: { } break; } }
(Opcional) Etapa 5: Estabelecer uma conexão MQTT
Após obter o nome de domínio e a porta necessários para o dispositivo, estabeleça uma conexão MQTT entre o dispositivo e o IoT Platform. Para mais detalhes sobre conexões MQTT, consulte Conexão MQTT.
Depois de estabelecer a conexão MQTT, execute as etapas a seguir para iniciar a distribuição do dispositivo novamente.
-
Chame aiot_bootstrap_setopt para associar o handle de conexão MQTT.
-
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_MQTT_HANDLE, (void *)mqtt_handle); -
Item de configuração
Exemplo
Descrição
AIOT_BOOTSTRAPOPT_MQTT_HANDLE
mqtt_handle
Função de callback acionada quando o dispositivo recebe uma mensagem de distribuição enviada pelo IoT Platform.
-
-
Faça login no console do IoT Platform e realize a operação de distribuição do dispositivo.
Para mais informações, consulte Distribuição de dispositivos no IoT Platform.
Quando o dispositivo receber a mensagem de distribuição enviada, ele ficará offline. Em seguida, repita da Etapa 1 à Etapa 4 para obter o novo nome de domínio de conexão do dispositivo e reconectá-lo ao IoT Platform.
Etapa 6: Sair do programa
Chame aiot_bootstrap_deinit para destruir a instância do cliente bootstrap e liberar recursos.
res = aiot_bootstrap_deinit(&bootstrap_handle);
if (res < 0) {
printf("demo_start_stop failed\n");
return -1;
}
Próximos passos
-
Após configure o arquivo de código de exemplo, compile-o para gerar um arquivo executável. Neste exemplo, o arquivo executável ./demos/bootstrap-posix-demo é gerado.
Para mais informações, consulte Compilar e execute.
Para obter mais informações sobre os resultados da execução, consulte Logs de tempo de execução.