Utilisez le fichier de démonstration ./demos/compress_basic_demo.c du SDK Link C pour appeler les API du SDK Link et activer la compression des données pour un appareil.
Informations générales
Pour plus d'informations sur la compression des données, consultez la rubrique Présentation.
La compression des données utilise des connexions MQTT. Pour plus d'informations sur le code lié à MQTT, consultez l'Exemple d'utilisation.
Étape 1 : Initialisation
-
Ajoutez le fichier d'en-tête.
…… …… #include "aiot_compress_api.h" …… -
Configurez la dépendance sous-jacente et la sortie des journaux.
aiot_sysdep_set_portfile(&g_aiot_sysdep_portfile); aiot_state_set_logcb(demo_state_logcb); -
Appelez aiot_compress_init pour créer une instance de compression de données et initialiser les paramètres par défaut.
/* Create a compress client instance and initialize the default parameters. */ compress_handle = aiot_compress_init(); if (compress_handle == NULL) { demo_mqtt_stop(&mqtt_handle); printf("aiot_compress_init failed\n"); return -1; }
Étape 2 : Configuration des fonctionnalités
Appelez aiot_compress_setopt pour configurer les paramètres suivants.
-
Associez le handle de connexion MQTT.
/* Associate the MQTT handle. */ aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_MQTT_HANDLE, mqtt_handle); -
Définissez le niveau de compression.
/* Set the compression level. The level ranges from 1 to 9. A higher level provides better compression but consumes more memory and time. */ uint8_t compress_level = 1; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_LEVEL, &compress_level); -
Ajoutez les rubriques des messages MO (Mobile Originated) qui nécessitent une compression.
Spécifiez le chemin complet de la rubrique. Les caractères génériques ne sont pas pris en charge.
-
Définissez la liste.
/* TODO: Replace this with the list of topics for mobile originated messages that you want to compress. */ char *compr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post", }; -
Configurez la liste des rubriques.
/* Add the topics for mobile originated messages that require compression. */ for(int i = 0; i < sizeof(compr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_COMPR_TOPIC, compr_list[i]); }
-
-
Ajoutez les rubriques des messages MT (Mobile Terminated) qui nécessitent une décompression.
-
Définissez la liste.
/* TODO: Replace this with the list of topics for mobile terminated messages that you want to compress. */ char *decompr_list[] = { "/${YourProductKey}/${YourDeviceName}/user/update_reply", "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post_reply", }; -
Configurez la liste des rubriques.
/* Add the topics for mobile terminated messages that require decompression. */ for(int i = 0; i < sizeof(decompr_list) / sizeof(char *); i++) { aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_APPEND_DECOMPR_TOPIC, decompr_list[i]); }
-
-
Définissez la fonction de rappel pour le rapport de la liste des rubriques.
/* Report the list of topics for compression or decompression to IoT Platform. You only need to report the list once. The configuration remains valid after a restart. */ uint32_t code = 0; aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_RECV_HANDLER, demo_update_reply); aiot_compress_setopt(compress_handle, AIOT_COMPRESSOPT_USERDATA, &code);Implémentez la fonction de rappel pour récupérer le résultat.
static void demo_update_reply(void *handle, const aiot_compress_recv_t *packet, void *userdata) { uint32_t *code = (uint32_t *)userdata; *code = packet->data.update_reply.code; printf("compress update reply code %d, message %.*s\r\n", packet->data.update_reply.code, packet->data.update_reply.message_len, packet->data.update_reply.message); }
(Facultatif) Étape 3 : Signaler la liste des rubriques de compression
Signalez depuis l'appareil la liste des rubriques pour la compression ou la décompression, puis attendez le résultat.
Une fois que l'appareil a signalé la liste, la configuration persiste après les redémarrages.
Pour mettre à jour la liste des rubriques, signalez-la à nouveau. IoT Platform utilise toujours la dernière liste signalée.
-
Signalez la liste des rubriques de compression.
aiot_compress_topiclist_update(compress_handle); -
Un code de retour 200 indique que l'opération a réussi.
if(code != 200) { demo_mqtt_stop(&mqtt_handle); aiot_compress_deinit(&compress_handle); printf("aiot_compress_topiclist_update failed\n"); return -1; }
Étape 4 : Publier des messages figurant dans la liste de compression
Lorsque vous publiez un message sur une rubrique incluse dans la liste de compression, le SDK Link compresse automatiquement le message.
Appelez aiot_mqtt_pub pour publier le message de la même manière qu'un message standard.
char *pub_topic = "/sys/${YourProductKey}/${YourDeviceName}/thing/event/property/post";
char *pub_payload = "{\"id\":\"1\",\"version\":\"1.0\",\"params\":{\"LightSwitch\":0, \"message\":\"this is a test message, this is a test message, this is a test message\"}}";
aiot_mqtt_pub(mqtt_handle, pub_topic, (uint8_t *)pub_payload, (uint32_t)strlen(pub_payload), 0);
Étape 5 : Distribuer des messages figurant dans la liste compressée
Pour les messages MT (Mobile Terminated) nécessitant une compression, IoT Platform les compresse avant leur distribution. Le SDK Link décompresse automatiquement ces messages et la fonction de rappel reçoit les données décompressées.
Appelez aiot_mqtt_recv pour traiter les messages reçus. Lorsqu'un message compressé arrive, le SDK Link le décompresse et exécute le rappel de message.
/* The default MQTT message processing callback. This is called when the SDK receives an MQTT message from the server and no corresponding user callback is available to process it. */
void demo_mqtt_default_recv_handler(void *handle, const aiot_mqtt_recv_t *packet, void *userdata)
{
switch (packet->type) {
....
case AIOT_MQTTRECV_PUB: {
printf("pub, qos: %d, topic: %.*s\n", packet->data.pub.qos, packet->data.pub.topic_len, packet->data.pub.topic);
printf("pub, payload: %.*s\n", packet->data.pub.payload_len, packet->data.pub.payload);
}
break;
....
}
}
Étape 6 : Quitter le programme
Appelez aiot_compress_deinit pour détruire l'instance de compression et libérer les ressources.
/* Destroy the COMPRESS instance. This part of the code is not typically run. */
res = aiot_compress_deinit(&compress_handle);
if (res < STATE_SUCCESS) {
demo_mqtt_stop(&mqtt_handle);
printf("aiot_compress_deinit failed: -0x%04X\n", -res);
return -1;
}
Étapes suivantes
Après avoir configuré le fichier exemple, compilez-le pour générer le fichier exécutable
./output/compress-basic-demo. Pour plus d'informations, consultez la section Compilation et exécution.Pour plus d'informations sur les résultats des opérations, consultez la section Journaux d'exploitation.