Tous les produits
Search
Centre de documentation

IoT Platform:Exemple de code

Dernière mise à jour :Aug 10, 2026

Le fichier ./demos/mota_basic_demo.c montre comment un appareil utilise MQTT pour télécharger un package de mise à jour OTA contenant un seul fichier de mise à jour et effectuer la mise à jour.

Informations générales

  • Pour en savoir plus sur la fonctionnalité de mise à jour OTA, consultez Présentation des mises à jour OTA.

  • La fonctionnalité de mise à jour OTA repose sur une connexion MQTT.Pour plus d'informations sur le code relatif à la connexion MQTT, consultez Connexion MQTT.

sans titre

Étape 1 : Initialiser la fonctionnalité OTA

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

    ……
    ……
    #include "aiot_ota_api.h"
    #include "aiot_mqtt_download_api.h"
    ……
  2. /* A collection of system adaptation functions in the portfiles/aiot_port directory */
    extern aiot_sysdep_portfile_t g_aiot_sysdep_portfile;
    
    /* TODO: To disable logs, implement this function as an empty function. To reduce logs, you can choose not to print logs based on the code.
     * For example: [1578463098.611][LK-0309] pub: /ota/device/upgrade/a13FN******/ota_demo
     * The code for the preceding log is 0309 (hexadecimal). For more information about code values, see core/aiot_state_api.h.
     */
    
    /* This is a log callback function. The SDK logs are output from here. */
    int32_t demo_state_logcb(int32_t code, char *message)
    {
        printf("%s", message);
        return 0;
    }
  3. Appelez aiot_ota_init pour créer un handle OTA.

        ota_handle = aiot_ota_init();
        if (NULL == ota_handle) {
            goto exit;
        }

sans titre

Étape 2 : Configurer la fonctionnalité OTA

Appelez aiot_ota_setopt pour configurer les options suivantes.

  1. Associez le handle de la connexion MQTT.

    Important

    Avant de configurer les paramètres OTA,

    vous devez configurer des paramètres tels que les identifiants de l'appareil. Pour plus d'informations, consultez

    Configurer les paramètres de connexion pour MQTT

    .

    •     aiot_ota_setopt(ota_handle, AIOT_OTAOPT_MQTT_HANDLE, mqtt_handle);
    • Élément de configuration Exemple Description
      AIOT_OTAOPT_MQTT_HANDLE mqtt_handle Les requêtes de la fonctionnalité OTA sont basées sur des connexions MQTT. Cet élément de configuration associe le handle de connexion MQTT.
  2. Configurez le callback pour les messages d'instruction de mise à jour OTA.

    •     aiot_ota_setopt(ota_handle, AIOT_OTAOPT_RECV_HANDLER, user_ota_recv_handler);
    • Élément de configuration Exemple Description
      AIOT_OTAOPT_MQTT_HANDLER user_ota_recv_handler Lorsque l'appareil reçoit une instruction de mise à jour OTA depuis IoT Platform, cette fonction de callback est appelée.

Étape 3 : Signaler la version actuelle de l'appareil

Une fois que l'appareil a établi une connexion MQTT, appelez aiot_ota_report_version pour signaler le numéro de version actuel de l'appareil. IoT Platform détermine si une mise à jour est nécessaire en fonction du numéro de version.

Dans l'exemple de code suivant, le numéro de version signalé par l'appareil avant la mise à jour OTA est 1.0.0. Dans votre application, vous devez obtenir le numéro de version réel à partir de la zone de configuration de l'appareil et modifier le code en conséquence.

Important

L'appareil doit signaler son numéro de version au moins une fois avant une mise à jour OTA.

    cur_version = "1.0.0";
    res = aiot_ota_report_version(ota_handle, cur_version);
    if (res < STATE_SUCCESS) {
        printf("aiot_ota_report_version failed: -0x%04X\r\n", -res);
    }

sans titre

Étape 4 : Recevoir l'instruction de mise à jour

  1. Après avoir ajouté un package de mise à jour et démarré une tâche de mise à jour dans la console IoT Platform, IoT Platform envoie une instruction de mise à jour à l'appareil.

    Pour plus d'informations, consultez

    Ajouter un package de mise à jour

    .

  2. L'appareil appelle aiot_mqtt_recv pour recevoir les messages. Lorsqu'un message est identifié comme une instruction de mise à jour OTA, le callback user_ota_recv_handler est invoqué pour traiter l'instruction.

  3. Rédigez la logique de traitement pour la fonction de callback.

    Rédigez la logique de traitement pour la fonction de callback en vous basant sur les informations suivantes :

    • IoT Platform envoie les instructions de package de mise à jour OTA à l'appareil via le topic /ota/device/upgrade/${ProductKey}/${DeviceName}.

      Pour plus d'informations sur ${ProductKey} et ${DeviceName}, consultez Obtenir les identifiants de l'appareil.

    • Le type de l'instruction de mise à jour OTA est AIOT_OTARECV_FOTA.

      void user_ota_recv_handler(void *ota_handle, aiot_ota_recv_t *ota_msg, void *userdata)
      {
          uint32_t request_size = 10 * 1024;
          switch (ota_msg->type) {
          case AIOT_OTARECV_FOTA: {
              if (NULL == ota_msg->task_desc || ota_msg->task_desc->protocol_type != AIOT_OTA_PROTOCOL_MQTT) {
                  break;
              }
           ……
           ……
      
      }
    • Pour obtenir des informations sur le format de données Alink des messages d'instruction de mise à jour OTA, consultez IoT Platform transmet les informations du package de mise à jour OTA.

    • Le type de structure de données pour les messages d'instruction de mise à jour OTA est aiot_ota_recv_t. Link SDK analyse automatiquement les messages d'instruction de mise à jour reçus.

    • Pour rédiger la logique de traitement de la fonction de callback, consultez l'étape 5.

sans titre

Étape 5 : Télécharger le package de mise à jour et effectuer la mise à jour OTA

Important

L'appareil ne télécharge pas automatiquement le package de mise à jour après avoir reçu le message de package de mise à jour depuis IoT Platform. Vous devez appeler une API Link SDK pour démarrer le téléchargement.

Une fois que user_ota_recv_handler est déclenché, le programme de téléchargement envoie une requête de téléchargement basée sur MQTT pour recevoir le package de mise à jour depuis IoT Platform et effectuer la mise à jour OTA.

  1. Initialisez le programme de téléchargement.

    Appelez

    aiot_mqtt_download_init

    pour créer un

    téléchargement

    void user_ota_recv_handler(void *ota_handle, aiot_ota_recv_t *ota_msg, void *userdata)
    {
         ……
         ……
    
            printf("OTA target firmware version: %s, size: %u Bytes\r\n", ota_msg->task_desc->version,
                   ota_msg->task_desc->size_total);
            void *md_handler = aiot_mqtt_download_init();
    
         ……
         ……
    
    }
  2. Configurez les paramètres de téléchargement.

    Appelez

    aiot_mqtt_download_setopt

    pour configurer les paramètres de la tâche de téléchargement.

    •         aiot_mqtt_download_setopt(md_handler, AIOT_MDOPT_TASK_DESC, ota_msg->task_desc);
              /* Set the size of a download package. You can adjust this value for resource-constrained devices. */
              aiot_mqtt_download_setopt(md_handler, AIOT_DLOPT_DATA_REQUEST_SIZE, &request_size);
      
              /* The start and end byte numbers for each segment when you download an update package in segments or download only a fragment of the package.
               * If you set a range for the download, the data in a single message has a cyclic redundancy check (CRC), but the SDK does not perform a full file MD5 validation.
               * By default, the entire file is downloaded. The data in a single message has a CRC, and the SDK performs a full file MD5 validation. 
               * If you uncomment the following code, the download starts from the 10th byte of the file and ends at the 10th byte of the 50th kilobyte. */
              // uint32_t range_start = 10, range_end = 50 * 1024 + 10;
              // aiot_mqtt_download_setopt(md_handler, AIOT_MDOPT_RANGE_START, &range_start);
              // aiot_mqtt_download_setopt(md_handler, AIOT_MDOPT_RANGE_END, &range_end);
      
              aiot_mqtt_download_setopt(md_handler, AIOT_MDOPT_RECV_HANDLE, user_download_recv_handler);
              g_dl_handle = md_handler;
    • Élément de configuration Exemple Description
      AIOT_MDOPT_TASK_DESC ota_msg->task_desc Spécifie la tâche de téléchargement.
      AIOT_DLOPT_DATA_REQUEST_SIZE request_size La taille de chaque package de données demandé depuis IoT Platform.
      AIOT_MDOPT_RANGE_START range_start Les numéros d'octet de début et de fin pour chaque segment lorsque vous téléchargez un package de mise à jour par segments ou que vous téléchargez uniquement un fragment du package.

      Si cela n'est pas défini, l'intégralité du fichier est téléchargée en une seule fois.

      Par exemple, pour télécharger un package de mise à jour de 1024 octets en deux parties, vous pouvez définir les paramètres comme suit :
      • Première partie : AIOT_DLOPT_RANGE_START=0, AIOT_DLOPT_RANGE_END=511
      • Deuxième partie : AIOT_DLOPT_RANGE_START=512, AIOT_DLOPT_RANGE_END=1023
      AIOT_MDOPT_RANGE_END range_end
      AIOT_MDOPT_RECV_HANDLE user_download_recv_handler Spécifie le callback pour la réception des données du package de mise à jour OTA.

      Ce callback est déclenché lorsque IoT Platform renvoie un message contenant le contenu du package de mise à jour après que l'appareil a initié une requête de téléchargement.

  3. Appelez aiot_mqtt_download_process pour envoyer une requête de téléchargement à IoT Platform.

        while (1) {
            aiot_mqtt_process(mqtt_handle);
            aiot_mqtt_recv(mqtt_handle);
            if(g_dl_handle != NULL) {
                int32_t res = aiot_mqtt_download_process(g_dl_handle);
         ……
         ……
    
            }
        }
                            
  4. Une fois qu'IoT Platform a reçu la requête de téléchargement, elle renvoie le package de mise à jour à l'appareil. Lorsque l'appareil reçoit les données du package, le callback user_download_recv_handler est déclenché.

    Rédigez la logique de traitement pour la fonction de callback afin d'enregistrer les données du package de mise à jour téléchargé dans un fichier local.

    void user_download_recv_handler(void *handle, const aiot_mqtt_download_recv_t *packet, void *userdata)
    {
        uint32_t data_buffer_len = 0;
    
        /* Currently, only the case where packet->type is AIOT_MDRECV_DATA_RESP is supported. */
        if (!packet || AIOT_MDRECV_DATA_RESP != packet->type) {
            return;
        }
    
        /* The operation to persist the file locally should be implemented here. */
        FILE *file = fopen("mota_demo.bin", "ab");
        fwrite(packet->data.data_resp.data, packet->data.data_resp.data_size, sizeof(int8_t), file);
        fclose(file);
    
        data_buffer_len = packet->data.data_resp.data_size;
    
        printf("download %03d%% done, +%d bytes\r\n", packet->data.data_resp.percent, data_buffer_len);
    }
  5. Une fois le package de mise à jour téléchargé, appelez aiot_mqtt_download_deinit pour libérer les ressources du programme de téléchargement.

        while (1) {
            aiot_mqtt_process(mqtt_handle);
            aiot_mqtt_recv(mqtt_handle);
            if(g_dl_handle != NULL) {
                int32_t res = aiot_mqtt_download_process(g_dl_handle);
    
                if(STATE_MQTT_DOWNLOAD_SUCCESS == res) {
                    /* The update is successful. You can restart the device and report the new version number here. */
                    printf("mqtt download ota success \r\n");
                    aiot_mqtt_download_deinit(&g_dl_handle);
                    break;
                } else if(STATE_MQTT_DOWNLOAD_FAILED_RECVERROR == res
                          || STATE_MQTT_DOWNLOAD_FAILED_TIMEOUT == res
                          || STATE_MQTT_DOWNLOAD_FAILED_MISMATCH == res) {
                    printf("mqtt download ota failed \r\n");
                    aiot_mqtt_download_deinit(&g_dl_handle);
                    break;
                }
            }
        }

sans titre

Étape 6 : Signaler le numéro de version après la mise à jour

Pour un exemple de code montrant comment signaler le numéro de version, consultez l'étape 3 : Signaler le numéro de version actuel de l'appareil.

Remarque
  • Une fois que l'appareil a terminé la mise à jour OTA, il doit signaler le dernier numéro de version. Sinon, IoT Platform considère que la tâche de mise à jour OTA a échoué.

  • Si l'appareil doit être redémarré après la mise à jour, il doit signaler le dernier numéro de version après le redémarrage.

  • L'exemple de code n'inclut pas la logique de signalement du numéro de version une fois la mise à jour terminée. Vous devez ajouter cette logique à votre code.

Étape 7 : Se déconnecter

Vous pouvez appeler aiot_mqtt_disconnect pour envoyer un message de déconnexion à IoT Platform et vous déconnecter du réseau.

    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;
    }

Étape 8 : Quitter le programme OTA

Appelez aiot_ota_deinit pour détruire l'instance OTA.

    aiot_ota_deinit(&ota_handle);

Étapes suivantes