Llame a las operaciones de API de Link SDK for C para distribuir dispositivos mediante el archivo de código de ejemplo ./demos/bootstrap_posix_demo.c.
Contexto
Para obtener más información sobre la función de distribución de dispositivos, consulte Overview.
Una vez que obtenga la información de conexión del dispositivo mediante la distribución de dispositivos, conecte el dispositivo a IoT Platform. Para obtener más información sobre las conexiones MQTT, consulte MQTT connection.
Paso 1: Inicialización
-
Agregue el archivo de encabezado.
…… …… #include "aiot_bootstrap_api.h" -
Configure las dependencias subyacentes y la salida de registros.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb); -
Llame a aiot_bootstrap_init para crear una instancia de cliente
Bootstrap.bootstrap_handle = aiot_bootstrap_init(); if (bootstrap_handle == NULL) { printf("aiot_bootstrap_init failed\n"); return -1; }
Paso 2: Configurar funciones
Llame a aiot_bootstrap_setopt para configurar las siguientes funciones.
-
Importante
El tipo de conexión segura para la capa Transport Layer Security (TLS) debe basarse en certificados (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
Ejemplo
Descripción
product_key
a18wP
Información de autenticación del dispositivo. Para obtener más información, consulte Obtain device verification information.
En este ejemplo se utiliza el método de autenticación de certificado único por dispositivo.
El parámetro device_secret se usa cuando el dispositivo establece una conexión MQTT después de obtener el nombre de dominio de conexión y el número de puerto.
device_name
LightSwitch
device_secret
uwMTmVAMnGGHaAkqmeDY6cHxxB
-
-
Configure las devoluciones de llamada de mensajes.
-
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); -
Elemento de configuración
Valor de ejemplo
Descripción
AIOT_BOOTSTRAPOPT_RECV_HANDLER
demo_bootstrap_recv_handler
Esta función se llama cuando se recibe un mensaje de distribución de dispositivos.
AIOT_BOOTSTRAPOPT_USERDATA
demo_info
Establece el contexto de usuario. Cuando se activa
demo_bootstrap_recv_handler, se devuelveuserdata. Convierta los datos devueltos al tipo adecuado antes de usarlos.
-
-
Configure el monitoreo de estado.
-
Defina la devolución de llamada para monitorear el estado.
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 las devoluciones de llamada para monitorear el estado.
-
Código de ejemplo:
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_EVENT_HANDLER, (void *)demo_bootstrap_event_handler); -
Parámetros:
Elemento de configuración
Valor de ejemplo
Descripción
AIOT_BOOTSTRAPOPT_EVENT_HANDLER
demo_bootstrap_event_handler
Cuando cambia el estado de conexión del dispositivo, se ejecuta la lógica de procesamiento correspondiente definida en esta función de devolución de llamada.
-
-
Paso 3: Enviar una solicitud
Antes de enviar una solicitud de distribución de dispositivos, asegúrese de que la operación de distribución de dispositivos esté configurada en la consola de IoT Platform. De lo contrario, el nombre de dominio y el puerto devueltos corresponderán a la conexión actual del dispositivo.
Llame a aiot_bootstrap_send_request para enviar una solicitud HTTPS de distribución de dispositivos al servidor según los parámetros configurados en previous step.
Para obtener más información sobre la solicitud HTTPS, consulte Request data format for device distribution.
res = aiot_bootstrap_send_request(bootstrap_handle);
if (res < STATE_SUCCESS) {
printf("aiot_bootstrap_send_request failed, res: -0x%04X\n", -res);
return -1;
}
Paso 4: Recibir una confirmación
-
Después de enviar el mensaje, IoT Platform devuelve una respuesta. El dispositivo llama a aiot_bootstrap_recv para recibir los datos de respuesta y procesarlos mediante la devolución de llamada de mensajes.
res = aiot_bootstrap_recv(bootstrap_handle); if (res < STATE_SUCCESS) { printf("aiot_bootstrap_recv failed, res: -0x%04X\n", -res); return -1; } -
Escriba la lógica de la función de devolución de llamada.
Escriba la lógica de la función de devolución de llamada con base en la siguiente información:
Tipo de mensaje
Descripción
AIOT_BOOTSTRAPRECV_STATUS_CODE
Código de estado HTTP devuelto por el servidor. Para obtener más información, consulte Códigos de estado HTTP.
El código de ejemplo no procesa el código de estado recibido. Agregue su propia lógica de procesamiento según sea necesario.
AIOT_BOOTSTRAPRECV_CONNECTION_INFO
Mensaje de confirmación que devuelve IoT Platform después de iniciar la distribución de dispositivos.
El mensaje recibido es del tipo aiot_bootstrap_recv_t. Guarde los valores de host y port, que corresponden al nombre de dominio y al número de puerto para la conexión del dispositivo, en su dispositivo local.
El código de ejemplo solo imprime el mensaje de distribución de dispositivos recibido.
AIOT_BOOTSTRAPRECV_NOTIFY
Mensaje de notificación de distribución de dispositivos enviado por IoT Platform.
Después de realizar la operación de distribución de dispositivos en IoT Platform, se envía un mensaje de distribución al dispositivo. Para obtener más información, consulte Device distribution in IoT Platform.
El código de ejemplo solo imprime el mensaje. Agregue lógica para desconectar el dispositivo, enviar una nueva solicitud de distribución de dispositivos y luego restablecer la conexión.
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) Paso 5: Establecer una conexión MQTT
Una vez que obtenga el nombre de dominio y el puerto necesarios para el dispositivo, establezca una conexión MQTT entre el dispositivo e IoT Platform. Para obtener más información sobre las conexiones MQTT, consulte MQTT connection.
Después de establecer la conexión MQTT, realice los siguientes pasos para iniciar nuevamente la distribución de dispositivos.
-
Llame a aiot_bootstrap_setopt para asociar el identificador de conexión MQTT.
-
aiot_bootstrap_setopt(bootstrap_handle, AIOT_BOOTSTRAPOPT_MQTT_HANDLE, (void *)mqtt_handle); -
Elemento de configuración
Ejemplo
Descripción
AIOT_BOOTSTRAPOPT_MQTT_HANDLE
mqtt_handle
Esta función de devolución de llamada se activa cuando el dispositivo recibe un mensaje de distribución de dispositivos enviado por IoT Platform.
-
-
Inicie sesión en la consola de IoT Platform y realice la operación de distribución de dispositivos.
Para obtener más información, consulte Device distribution in IoT Platform.
Cuando el dispositivo recibe el mensaje de distribución de dispositivos enviado, se desconecta. A continuación, repita del Paso 1 al Paso 4 para obtener el nuevo nombre de dominio de conexión del dispositivo y volver a conectarlo a IoT Platform.
Paso 6: Salir del programa
Llame a aiot_bootstrap_deinit para destruir la instancia de cliente bootstrap y liberar recursos.
res = aiot_bootstrap_deinit(&bootstrap_handle);
if (res < 0) {
printf("demo_start_stop failed\n");
return -1;
}
Siguientes pasos
-
Después de configurar el archivo de código de ejemplo, compílelo para generar un archivo ejecutable. En este ejemplo, se genera el archivo ejecutable ./demos/bootstrap-posix-demo.
Para obtener más información, consulte Compile and run.
Para obtener más información sobre los resultados de ejecución, consulte Runtime logs.