Tous les produits
Search
Centre de documentation

IoT Platform:Exemple d'enregistrement dynamique d'un appareil via MQTT

Dernière mise à jour :Aug 10, 2026

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

  1. Ajoutez les fichiers d'en-tête.

    #include "aiot_state_api.h"
    #include "aiot_sysdep_api.h"
    #include "aiot_dynregmq_api.h"
  2. 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);
  3. Appelez l'opération aiot_dynregmq_init pour créer une instance de client nommée dynregmq et 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 :

  1. Configurer les paramètres de connexion.

  2. Configurer un rappel de message.

  3. Pour plus d'informations, consultez la section Enregistrement dynamique basé sur MQTT.

  4. 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

      Important

      Pour 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.

  5. Configurez un rappel de message.

    1. 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_handler est appelée, la valeur obtenue à partir de l'opération est renvoyée.

    2. 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-demo est 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_CLIENTID dans le fichier mqtt_basic_demo.c et appeler l'opération aiot_mqtt_connect pour 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);