Cette rubrique explique comment appeler les API du Link SDK pour C afin de envoyer des requêtes Message Queuing Telemetry Transport (MQTT) à IoT Platform, enregistrer dynamiquement un appareil et obtenir les informations de vérification nécessaires à son activation. Cet exemple utilise le fichier de code d'exemple nommé ./demos/dynregmq_basic_demo.c.
Informations générales
Lorsque vous personnalisez un SDK, définissez Device authentication scheme sur Dynamic registration dans la page SDK customization. Avant d'utiliser le fichier de code d'exemple présenté dans cette rubrique, assurez-vous de bien connaître le contenu de la rubrique Présentation.
Étape 1 : Initialiser le SDK
-
Ajoutez les fichiers d'en-tête.
#include "aiot_state_api.h" #include "aiot_sysdep_api.h" #include "aiot_dynregmq_api.h" -
Ajoutez la dépendance sous-jacente et configurez la fonctionnalité de sortie des journaux.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb); -
Appelez l'opération aiot_dynregmq_init pour créer une instance de client nommée
dynregmqet initialiser les paramètres par défaut.dynregmq_handle = aiot_dynregmq_init(); if (dynregmq_handle == NULL) { printf("aiot_dynregmq_init failed\n"); return -1; }
Étape 2 : Configurer les fonctionnalités requises
Appelez l'opération aiot_dynregmq_setopt pour configurer les éléments suivants :
Pour plus d'informations, consultez la section Enregistrement dynamique basé sur MQTT.
-
Configurez les paramètres de connexion.
-
Exemple de code :
char *product_key = "a18wP******"; char *product_secret = "CpIlPVCXI7******"; char *device_name = "LightSwitch"; char *mqtt_host = "iot-06******.mqtt.iothub.aliyuncs.com"; uint8_t skip_pre_regist =1; ... /* Specify the endpoint of the server. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_HOST, (void *)host); /* Specify the port of the server. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PORT, (void *)&port); /* Specify the ProductKey of the device. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_KEY, (void *)product_key); /* Specify the ProductSecret of the device. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_PRODUCT_SECRET, (void *)product_secret); /* Specify the DeviceName of the device. aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_DEVICE_NAME, (void *)device_name); /* Specify the security credential of the connection. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NETWORK_CRED, (void *)&cred); /* Specify whether to use the preregistration-free verification method. */ aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_NO_WHITELIST, (void *)&skip_pre_regist); ... ... -
Paramètres :
Parameter
Examples
Overview
mqtt_host
iot-06.mqtt.iothub.aliyuncs.com
L'endpoint auquel vous souhaitez connecter l'appareil.
Format :
${YourProductKey}.iot-as-mqtt.${YourRegionId}.aliyuncs.com.skip_pre_regist
1
Indique s'il faut utiliser la méthode de vérification sans pré-enregistrement.
0 : non
1 : oui
ImportantPour plus d'informations sur les méthodes de vérification avec pré-enregistrement et sans pré-enregistrement par certificat unique par produit, consultez la section Vérification par certificat unique par produit.
product_key
a18wP
Le ProductKey et le ProductSecret que vous avez enregistrés lors de la création du produit dans la console IoT Platform. Pour plus d'informations, consultez la section Créer un produit.
product_secret
CpIlPVCXI7
device_name
LightSwitch
Le DeviceName de l'appareil.
IoT Platform vérifie le DeviceName lorsqu'un appareil initie une demande d'activation. Nous vous recommandons d'utiliser un identifiant pouvant être obtenu à partir de l'appareil comme DeviceName. Cet identifiant peut être l'adresse MAC, le numéro IMEI (International Mobile Equipment Identity) ou le numéro de série (SN) de l'appareil.
-
-
Configurez un rappel de message.
-
Spécifiez une fonction de rappel de message.
-
Exemple de code :
int main(int argc, char *argv[]) { ... Etc. aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_RECV_HANDLER, (void *)demo_dynregmq_recv_handler); aiot_dynregmq_setopt(dynregmq_handle, AIOT_DYNREGMQOPT_USERDATA, (void *)&demo_info); ... Etc. } -
Paramètres :
Parameter
Example
Description
AIOT_DYNREGMQOPT_RECV_HANDLER
demo_dynregmq_recv_handler
Configure un rappel de message. Lorsqu'un message est reçu, le rappel est appelé pour effectuer les opérations requises.
AIOT_DYNREGMQOPT_USERDATA
&demo_info
Le contexte. Lorsque l'opération
demo_dynregmq_recv_handlerest appelée, la valeur obtenue à partir de l'opération est renvoyée.
-
-
Définissez la fonction de rappel de message.
void demo_dynregmq_recv_handler(void *handle, const aiot_dynregmq_recv_t *packet, void *userdata) { switch (packet->type) { /* TODO: You must save the space to which the packet parameter in the callback points. After the callback returns a result, the space is released. */ case AIOT_DYNREGMQRECV_DEVICEINFO_WL: { if (strlen(packet->data.deviceinfo_wl.device_secret) >= sizeof(demo_devinfo_wl.device_secret)) { break; } /* If you use the pre-registration verification method, make sure that the device_secret parameter is persisted. */ memset(&demo_devinfo_wl, 0, sizeof(demo_devinfo_wl_t)); memcpy(demo_devinfo_wl.device_secret, packet->data.deviceinfo_wl.device_secret, strlen(packet->data.deviceinfo_wl.device_secret)); } break; /* TODO: You must save the space to which the packet parameter in the callback points. After the callback returns a result, the space is released. */ case AIOT_DYNREGMQRECV_DEVICEINFO_NWL: { if (strlen(packet->data.deviceinfo_nwl.clientid) >= sizeof(demo_devinfo_nwl.conn_clientid) || strlen(packet->data.deviceinfo_nwl.username) >= sizeof(demo_devinfo_nwl.conn_username) || strlen(packet->data.deviceinfo_nwl.password) >= sizeof(demo_devinfo_nwl.conn_password)) { break; } /* If you use the preregistration-free verification method, make sure that the clientid, username, and password parameters are persisted. */ memset(&demo_devinfo_nwl, 0, sizeof(demo_devinfo_nwl_t)); memcpy(demo_devinfo_nwl.conn_clientid, packet->data.deviceinfo_nwl.clientid, strlen(packet->data.deviceinfo_nwl.clientid)); memcpy(demo_devinfo_nwl.conn_username, packet->data.deviceinfo_nwl.username, strlen(packet->data.deviceinfo_nwl.username)); memcpy(demo_devinfo_nwl.conn_password, packet->data.deviceinfo_nwl.password, strlen(packet->data.deviceinfo_nwl.password)); } break; default: { } break; } }
-
Étape 3 : Envoyer une requête
Appelez l'opération aiot_dynregmq_send_request pour envoyer une demande d'enregistrement dynamique au serveur. Pour savoir comment configurer les paramètres, consultez la section Configurer les paramètres de connexion.
res = aiot_dynregmq_send_request(dynregmq_handle);
if (res < STATE_SUCCESS) {
printf("aiot_dynregmq_send_request failed: -0x%04X\n", -res);
return -1;
}
Étape 4 : Recevoir une réponse
Une fois la demande d'enregistrement envoyée, IoT Platform renvoie une réponse. L'appareil appelle l'opération aiot_dynregmq_recv pour recevoir les données de réponse et les traiter à l'aide du rappel de message.
res = aiot_dynregmq_recv(dynregmq_handle);
if (res < STATE_SUCCESS) {
printf("aiot_dynregmq_recv failed: -0x%04X\n", -res);
return -1;
}
Dans cet exemple, les données de réponse sont affichées. Vous devez spécifier la logique permettant d'enregistrer localement les informations de vérification de l'appareil renvoyées. Ces informations de vérification sont utilisées lorsque l'appareil se connecte à IoT Platform.
if (skip_pre_regist == 0) {
printf("device secret: %s\n", demo_devinfo_wl.device_secret);
} else {
printf("clientid: %s\n", demo_devinfo_nwl.conn_clientid);
printf("username: %s\n", demo_devinfo_nwl.conn_username);
printf("password: %s\n", demo_devinfo_nwl.conn_password);
}
Étape 5 : Quitter le programme
Appelez l'opération aiot_dynregmq_deinit pour supprimer l'instance de client dynregmq et libérer les ressources associées.
res = aiot_dynregmq_deinit(&dynregmq_handle);
Étapes suivantes
-
Après avoir configuré le fichier de code d'exemple, compilez-le pour générer un fichier exécutable. Dans cet exemple, le fichier exécutable
./output/dynregmq-basic-demoest généré.Pour plus d'informations, consultez la section Préparer un environnement de développement.
Pour plus d'informations sur les résultats d'exécution, consultez la rubrique Afficher les journaux.
-
Si vous utilisez la méthode de vérification sans pré-enregistrement par certificat unique par produit pour vérifier l'appareil, IoT Platform émet les paramètres ClientId, UserName et Password au lieu de DeviceSecret à l'appareil après sa vérification.
Vous pouvez spécifier ClientId, UserName et Password pour les paramètres
AIOT_MQTTOPT_USERNAME, AIOT_MQTTOPT_PASSWORD, and AIOT_MQTTOPT_CLIENTIDdans le fichiermqtt_basic_demo.cet appeler l'opérationaiot_mqtt_connectpour connecter l'appareil à IoT Platform. L'exemple de code suivant illustre la marche à suivre :char *user_name = "demo_user_name"; char *password = "demo_passwd"; char *client_id = "demo_client_id"; aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_USERNAME, user_name); aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_PASSWORD, password); aiot_mqtt_setopt(mqtt_handle, AIOT_MQTTOPT_CLIENTID, client_id); res = aiot_mqtt_connect(mqtt_handle);