Ce chapitre explique comment envoyer et recevoir des messages via des topics MQTT, et comment implémenter un appareil en utilisant la méthode de programmation par modélisation d'appareil (Device Modelling) sur Ubuntu.
Installation de l'environnement de développement local
Installez Ubuntu 16.04
L'environnement de compilation pour cette prise en main rapide est Ubuntu16.04 sur une machine hôte 64-bit. Cet environnement n'a pas été vérifié sur d'autres versions de Linux. Nous vous recommandons d'installer la version release cohérente avec celle d'Alibaba afin d'éviter les problèmes de compatibilité.
Si vous utilisez le système d'exploitation Windows, nous vous recommandons d'installer VMWare ou Virtualbox.
Ensuite, installez la version Desktop 64 bits de Ubuntu 16.04.x LTS. Lien de téléchargement : http://releases.ubuntu.com/16.04
Installation des logiciels prérequis
L'environnement de développement et de compilation de ce SDK utilise les logiciels suivants : make-4.1, git-2.7.4, gcc-5.4.0, gcov-5.4.0, lcov-1.12, bash-4.3.48, tar-1.28, mingw-5.3.1
Exécutez la commande suivante pour installer les logiciels nécessaires :
$ sudo apt-get install -y build-essential make git gcc
Développement via l'IDE Web Hacklab
Si vous ne souhaitez pas installer Ubuntu sur votre PC ou ordinateur portable, vous pouvez également développer directement pour les appareils via l'environnement IDE Web Hacklab fourni par Alibaba Cloud IoT Platform. Hacklab Web IDE est un environnement de développement Linux dans le cloud, qui dispose déjà de tous les logiciels nécessaires installés. Si vous possédez un compte Alibaba Cloud, connectez-vous à Hacklab Web IDE et commencez le développement via un navigateur.
Accès à l'appareil à l'aide de topics MQTT
Création de produits et d'appareils
Connectez-vous à la Plateforme IoT Alibaba Cloud avec votre compte Alibaba Cloud afin de créer des produits. Comme vous implémentez les fonctions du produit directement via des topics MQTT, veillez à sélectionner « Basic version » lors de la création du produit.
Après avoir créé un produit, créez un appareil spécifique. Alibaba Cloud IoT Platform générera les informations d'identité pour l'appareil.
Si vous n'êtes pas familier avec la création de produits sur le cloud, consultez la documentation pour apprendre comment créer des produits et des appareils sur Alibaba Cloud IoT Platform.
Implémentation des fonctions du produit
Compréhension de la structure du répertoire racine du SDK
Une fois le Link Kit SDK téléchargé, la structure du répertoire de niveau supérieur est la suivante :
$ ls
build-rules Config.in examples LICENSE make.settings project.mk sdk-c.mk win_board_conf.mk CMakeLists.txt Config.linkkit include makefile prebuilt README.txt src win.makefile
Modification de l'identification de l'appareil
Récupérez le ProductKey et le Product Secret d'un produit en cliquant sur les boutons « copy » indiqués sur l'image ci-dessous :
Récupérez le DeviceName et le DeviceSecret d'un appareil en cliquant sur les boutons « copy » indiqués sur l'image ci-dessous :
Ouvrez le fichier ./examples/mqtt/mqtt-example.c et modifiez l'extrait de code suivant pour remplacer les valeurs de PRODUCT_KEY/PRODUCT_SECRET/DEVICE_NAME/DEVICE_SECRET :
#include "iot_import.h"
#include "iot_export.h"
#include "app_entry.h"
#define PRODUCT_KEY "a1MZxOdcBnO"
#define PRODUCT_SECRET "h4I4dneEFp7EImTv"
#define DEVICE_NAME "test_01"
#define DEVICE_SECRET "t9GmMf2jb3LgWfXBaZD2r3aJrfVWBv56"
Initialisation de l'appareil et établissement de la connexion
L'extrait de code suivant décrit brièvement le processus d'initialisation et d'établissement de la connexion de l'appareil :
int mqtt_client(void)
{
...
...
/* Enter the device identity information before attempting to establish an MQTT connection to the server*/
if (0 ! = IOT_SetupConnInfo(__product_key, __device_name, __device_secret, (void **)&pconn_info)) {
EXAMPLE_TRACE("AUTH request failed!") ;
rc = -1;
goto do_exit;
}
/* Initialize MQTT parameter */
...
...
Tentative d'établissement d'une connexion MQTT au serveur
pclient = IOT_MQTT_Construct(&mqtt_params);
if (NULL == pclient) {
EXAMPLE_TRACE("MQTT construct failed");
rc = -1;
goto do_exit;
}
Envoi de données vers le cloud
Les topics suivants sont définis dans le fichier d'exemple :
#define TOPIC_UPDATE "/"PRODUCT_KEY"/"DEVICE_NAME"/update"
#define TOPIC_ERROR "/"PRODUCT_KEY"/"DEVICE_NAME"/update/error"
#define TOPIC_GET "/"PRODUCT_KEY"/"DEVICE_NAME"/get"
#define TOPIC_DATA "/"PRODUCT_KEY"/"DEVICE_NAME"/data"
/* topic format definitions*/
#define TOPIC_UPDATE_FMT "/%s/%s/update"
#define TOPIC_ERROR_FMT "/%s/%s/update/error"
#define TOPIC_GET_FMT "/%s/%s/get"
#define TOPIC_DATA_FMT "/%s/%s/data"
Alibaba Cloud IoT Platform générera par défaut les 3 topics suivants pour un produit « Basic Edition » :
Les extraits de code suivants montrent comment envoyer des données au topic « UPDATE » :
/* Initialize topic information */
memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));
strcpy(msg_pub, "update: hello! start!") ;
topic_msg.qos = IOTX_MQTT_QOS1;
topic_msg.retain = 0;
topic_msg.dup = 0;
topic_msg.payload = (void *)msg_pub;
topic_msg.payload_len = strlen(msg_pub);
rc = IOT_MQTT_Publish(pclient, TOPIC_UPDATE, &topic_msg);
if (rc < 0) {
IOT_MQTT_Destroy(&pclient);
EXAMPLE_TRACE("error occur when publish");
rc = -1;
goto do_exit;
}
EXAMPLE_TRACE("\n publish message: \n topic: %s\n payload: \%s\n rc = %d", TOPIC_UPDATE, topic_msg.payload, rc);
Abonnement et traitement des données provenant du cloud
Le programme d'exemple s'abonne au topic TOPIC_DATA et spécifie le gestionnaire lors de la réception des données du topic :
rc = IOT_MQTT_Subscribe(pclient, TOPIC_DATA, IOTX_MQTT_QOS1, _demo_message_arrive, NULL);
if (rc < 0) {
IOT_MQTT_Destroy(&pclient);
EXAMPLE_TRACE("IOT_MQTT_Subscribe() failed, rc = %d", rc);
rc = -1;
goto do_exit;
}
IOT_MQTT_Yield(pclient, 200);
HAL_SleepMs(2000);
...
...
La fonction _demo_message_arrive() affiche simplement les données :
static void _demo_message_arrive(void *pcontext, void *pclient, iotx_mqtt_event_msg_pt msg)
{
iotx_mqtt_topic_info_pt ptopic_info = (iotx_mqtt_topic_info_pt) msg->msg;
/* print topic name and topic message */
EXAMPLE_TRACE("----");
EXAMPLE_TRACE("packetId: %d", ptopic_info->packet_id);
EXAMPLE_TRACE("Topic: '%.*s' (Length: %d)",
ptopic_info->topic_len,
ptopic_info->ptopic,
ptopic_info->topic_len);
EXAMPLE_TRACE("Payload: '%.*s' (Length: %d)",
ptopic_info->payload_len,
ptopic_info->payload,
ptopic_info->payload_len);
EXAMPLE_TRACE("----");
}
L'extrait de code suivant tente d'envoyer des données à ce topic :
do {
cnt++;
msg_len = snprintf(msg_pub, sizeof(msg_pub), "{\"attr_name\":\"temperature\", \"attr_value\":\"%d\"}", cnt);
...
...
rc = IOT_MQTT_Publish(pclient, TOPIC_DATA, &topic_msg);
if (rc < 0) {
EXAMPLE_TRACE("error occur when publish");
rc = -1;
break;
}
EXAMPLE_TRACE("packet-id=%u, publish topic msg=%s", (uint32_t)rc, msg_pub);
Étant donné que l'exemple s'abonne au topic TOPIC_DATA, il recevra les données en retour après les avoir envoyées à la plateforme IoT.
Compilation du programme d'exemple
Exécutez la commande suivante dans le répertoire de niveau supérieur du SDK :
make distclean
make
Une fois la compilation terminée avec succès, le programme d'exemple est généré dans le répertoire output/release/bin du chemin actuel :
$ tree output/release
output/release/
+-- bin
...
...
| +-- mqtt-example
...
...
Observation des données
Exécutez la commande suivante :
$ ./output/release/bin/mqtt-example
Retrouvez le produit spécifié dans la console d'Alibaba Cloud IoT Platform et affichez les messages signalés par l'appareil dans Log Service. Cliquez ici pour savoir comment afficher les données signalées par l'appareil sur le cloud.
Vous pouvez également voir les données du cloud affichées par le programme d'exemple dans la console Linux :
_demo_message_arrive|166 :: ----
_demo_message_arrive|167 :: packetId: 35641
_demo_message_arrive|171 :: Topic: '/a1ExpAkj9Hi/Example1/data' (Length: 26)
_demo_message_arrive|175 :: Payload: '{"attr_name":"temperature", "attr_value":"1"}' (Length: 45)
_demo_message_arrive|176 :: ----
Développement de produits par modélisation d'appareil
Création de produits et d'appareils
Vous pouvez créer des produits sur Alibaba Cloud IoT Platform ainsi que plusieurs services qu'elle propose. Les liens d'aide pour la création de produits sur Alibaba Cloud IoT Platform sont les suivants :
Dans cet exemple, vous devez créer un produit qui prend en charge les fonctions suivantes :
-
propriété LightSwitch
Identifiant : LightSwitch
Type de données : enum
Valeurs : 0 et 1
Type lecture/écriture : lecture et écriture
-
Service Custom
Identifiant : Custom
Méthode d'appel : Asynchrone
Paramètre d'entrée : {Identifiant : transparency, Type de données : int32, Plage de valeurs : 0 ~ 100}
Paramètre de sortie : {Identifiant : Contrastratio, Type de données : int32, Plage de valeurs : 0 ~ 100}
-
Événement
Identifiant : Error
Type d'événement : Information
Paramètre de sortie : {Identifiant : Errorcode, Type de données : enum, Plage de valeurs : 0, 1}
Après la définition du produit, la plateforme IoT génère un fichier de description TSL au format JSON pour ce produit.
Implémentation des fonctions du produit
Saisie du triplet de l'appareil dans la routine
Remplacez le certificat (ProductKey/ProductSecret/DeviceName/DeviceSecret) dans ./examples/linkkit/linkkit_example_solo.c par ceux de l'appareil généré sur la plateforme IoT.
#define PRODUCT_KEY "a1csED27mp7"
#define PRODUCT_SECRET "VuULINCrtTAzCSzp"
#define DEVICE_NAME "AdvExample1"
#define DEVICE_SECRET "3xGoxtWRscxPAoMxnJnjocZbNfmCTRi0"
Compilation et exécution d'un programme
Exécutez la commande suivante dans le répertoire de niveau supérieur du SDK :
$ make distclean
$ make
Une fois la compilation terminée avec succès, le programme d'exemple pour le produit Pro-Edition est généré dans le répertoire output/release/bin du chemin actuel, et son nom est linkkit-example-solo.
Exécutez la commande suivante dans le répertoire de niveau supérieur du SDK :
$ ./output/release/bin/linkkit-example-solo
Observation des données
Le programme d'exemple signale périodiquement les valeurs de la propriété LightSwitch au cloud ; vous pouvez vérifier la propriété sur la plateforme IoT.
Signalement des propriétés
Ce programme d'exemple invoque la fonction user_post_property pour signaler les propriétés. L'exemple parcourt en boucle le signalement des charges utiles de diverses situations. Veuillez noter que cette fonction tente d'envoyer plusieurs propriétés invalides à la plateforme IoT ; l'objectif est de permettre aux développeurs de se familiariser avec les codes d'erreur renvoyés par la plateforme IoT. Vous pouvez les supprimer lors de l'implémentation de votre propre logique :
void user_post_property(void)
{
static int example_index = 0;
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
char *property_payload = "NULL";
if (example_index == 0) {
Signalement typique des attributs
/* Typical Example */
property_payload = "{\"LightSwitch\":1}";
example_index++;
}else if(...) {
...
...
}
res = IOT_Linkkit_Report(user_example_ctx->master_devid, ITM_MSG_POST_PROPERTY,
(unsigned char *)property_payload, strlen(property_payload));
EXAMPLE_TRACE("Post Property Message ID: %d", res);
}
Les journaux imprimés lors du signalement typique des attributs sont les suivants :
[inf] dm_msg_request(218): DM Send Message, URI: /sys/a1csED27mp7/AdvExample1/thing/event/property/post, Payload: {"id":"1","version":"1.0","params":{"LightSwitch":1},"method":"thing.event.property.post"}
[dbg] MQTTPublish(319): ALLOC: (160) / [224] @ 0x1da41a0
[inf] MQTTPublish(378): Upstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/event/property/post'
[inf] MQTTPublish(379): Upstream Payload:
Le message suivant est envoyé au cloud :
> {
> "id": "1",
> "version": "1.0",
> "params": {
> "LightSwitch": 1
> },
> "method": "thing.event.property.post"
> }
[inf] dm_client_publish(106): Publish Result: 0
[dbg] alcs_observe_notify(105): payload:{"id":"1","version":"1.0","params":{"LightSwitch":1},"method":"thing.event.property.post"}
[dbg] CoAPResourceByPath_get(176): Found the resource: /sys/a1csED27mp7/AdvExample1/thing/event/property/post
[inf] dm_server_send(76): Send Observe Notify Result 0
[dbg] dm_msg_cache_insert(79): dmc list size: 0
user_post_property. 431: Post Property Message ID: 1
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Downstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/event/property/post_reply'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Downstream Payload:
La réponse suivante est reçue du cloud :
< {
< "code": 200,
< "data": {
< },
< "id": "1",
< "message": "success",
< "method": "thing.event.property.post",
< "version": "1.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Packet Ident : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Topic Length : 60
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Topic Name : /sys/a1csED27mp7/AdvExample1/thing/event/property/post_reply
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Payload Len/Room : 104 / 4935
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Receive Buflen : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): delivering msg ...
[dbg] iotx_mc_deliver_message(1291): topic be matched
[inf] dm_msg_proc_thing_event_post_reply(258): Event Id: property
[dbg] dm_msg_response_parse(167): Current Request Message ID: 1
[dbg] dm_msg_response_parse(168): Current Request Message Code: 200
[dbg] dm_msg_response_parse(169): Current Request Message Data: {}
[dbg] dm_msg_response_parse(174): Current Request Message Desc: success
[dbg] dm_ipc_msg_insert(87): dm msg list size: 0, max size: 50
[dbg] dm_msg_cache_remove(142): Remove Message ID: 1
[inf] _iotx_linkkit_event_callback(219): Receive Message Type: 30
[inf] _iotx_linkkit_event_callback(221): Receive Message: {"id":1,"code":200,"devid":0,"payload":{}}
[dbg] _iotx_linkkit_event_callback(476): Current Id: 1
[dbg] _iotx_linkkit_event_callback(477): Current Code: 200
[dbg] _iotx_linkkit_event_callback(478): Current Devid: 0
Le journal de la fonction de rappel :
user_report_reply_event_handler. 300: Message Post Reply Received, Devid: 0, Message ID: 1, Code: 200, Reply: {}
Traitement d'une demande de définition de propriété
Lorsqu'une demande de définition de propriété est reçue dans le code d'exemple, la fonction de rappel suivante est appelée :
static int user_property_set_event_handler(const int devid, const char *request, const int request_len)
{
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
EXAMPLE_TRACE("Property Set Received, Devid: %d, Request: %s", devid, request);
Cette fonction renvoie simplement la valeur de la propriété à la plateforme IoT, qui mettra à jour l'enregistrement des propriétés de l'appareil :
res = IOT_Linkkit_Report(user_example_ctx->master_devid, ITM_MSG_POST_PROPERTY,
(unsigned char *)request, request_len);
EXAMPLE_TRACE("Post Property Message ID: %d", res);
return 0;
}
Vous pouvez voir la valeur définie depuis la plateforme IoT dans les journaux de l'appareil :
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Downstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/service/property/set'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Downstream Payload:
La demande de définition de propriété reçue du cloud est la suivante :
< {
< "method": "thing.service.property.set",
< "id": "161430786",
< "params": {
< "LightSwitch": 1
< },
< "version": "1.0.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Packet Ident : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Topic Length : 55
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Topic Name : /sys/a1csED27mp7/AdvExample1/thing/service/property/set
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Payload Len/Room : 113 / 4940
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Receive Buflen : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): delivering msg ...
[dbg] iotx_mc_deliver_message(1291): topic be matched
[inf] dm_msg_proc_thing_service_property_set(93): thing/service/property/set
[dbg] dm_msg_request_parse(142): Current Request Message ID: 161430786
[dbg] dm_msg_request_parse(143): Current Request Message Version: 1.0.0
[dbg] dm_msg_request_parse(144): Current Request Message Method: thing.service.property.set
[dbg] dm_msg_request_parse(145): Current Request Message Params: {"LightSwitch":1}
[dbg] dm_ipc_msg_insert(87): dm msg list size: 0, max size: 50
[inf] dm_msg_response(274): Send URI: /sys/a1csED27mp7/AdvExample1/thing/service/property/set_reply, Payload: {"id":"161430786","code":200,"data":{}}
[dbg] MQTTPublish(319): ALLOC: (100) / [164] @ 0x154f1f0
[inf] MQTTPublish(378): Upstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/service/property/set_reply'
[inf] MQTTPublish(379): Upstream Payload:
The following log is printed when the user_property_set_event_handler reçoit la demande de définition d'attribut :
user_property_set_event_handler. 160: Property Set Received, Devid: 0, Request: {"LightSwitch":1}
Remarque : Lorsqu'un produit réel reçoit des paramètres de propriété, les développeurs doivent analyser la propriété et la traiter en conséquence, au lieu de simplement renvoyer la valeur à la plateforme IoT.
Signalement d'un événement
La fonction user_post_event() dans le programme d'exemple sert à envoyer des événements à la plateforme IoT. Là encore, elle génère plusieurs événements invalides et les envoie à la plateforme IoT. Supprimez-les et envoyez des événements à la plateforme IoT uniquement lorsqu'un événement est déclenché :
void user_post_event(void)
{
static int example_index = 0;
int res = 0;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
char *event_id = "Error";
char *event_payload = "NULL";
if (example_index == 0) {
...
//Report the event to the cloud
res = IOT_Linkkit_TriggerEvent(user_example_ctx->master_devid, event_id, strlen(event_id),
event_payload, strlen(event_payload));
EXAMPLE_TRACE("Post Event Message ID: %d", res);
}
L'événement signalé au cloud est le suivant :
> {
> "id": "1",
> "version": "1.0",
> "params": {
> "ErrorCode": 0
> },
> "method": "thing.event.Error.post"
> }
[inf] dm_client_publish(106): Publish Result: 0
[dbg] alcs_observe_notify(105): payload:{"id":"1","version":"1.0","params":{"ErrorCode":0},"method":"thing.event.Error.post"}
[inf] dm_server_send(76): Send Observe Notify Result 0
[dbg] dm_msg_cache_insert(79): dmc list size: 0
user_post_event. 470: Post Event Message ID: 1
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Downstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/event/Error/post_reply'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Downstream Payload:
La réponse reçue du cloud est la suivante :
< {
< "code": 200,
< "data": {
< },
< "id": "1",
< "message": "success",
< "method": "thing.event.Error.post",
< "version": "1.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Packet Ident : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Topic Length : 57
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Topic Name : /sys/a1csED27mp7/AdvExample1/thing/event/Error/post_reply
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Payload Len/Room : 101 / 4938
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Receive Buflen : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): delivering msg ...
[dbg] iotx_mc_deliver_message(1291): topic be matched
[inf] dm_msg_proc_thing_event_post_reply(258): Event Id: Error
[dbg] dm_msg_response_parse(167): Current Request Message ID: 1
[dbg] dm_msg_response_parse(168): Current Request Message Code: 200
[dbg] dm_msg_response_parse(169): Current Request Message Data: {}
[dbg] dm_msg_response_parse(174): Current Request Message Desc: success
[dbg] dm_ipc_msg_insert(87): dm msg list size: 0, max size: 50
[dbg] dm_msg_cache_remove(142): Remove Message ID: 1
[inf] _iotx_linkkit_event_callback(219): Receive Message Type: 31
[inf] _iotx_linkkit_event_callback(221): Receive Message: {"id":1,"code":200,"devid":0,"eventid":"Error","payload":"success"}
[dbg] _iotx_linkkit_event_callback(513): Current Id: 1
[dbg] _iotx_linkkit_event_callback(514): Current Code: 200
[dbg] _iotx_linkkit_event_callback(515): Current Devid: 0
[dbg] _iotx_linkkit_event_callback(516): Current EventID: Error
[dbg] _iotx_linkkit_event_callback(517): Current Message: success
Le journal suivant est imprimé pour la fonction de rappel de l'utilisateur user_trigger_event_reply_event_handler :
user_trigger_event_reply_event_handler. 310: Trigger Event Reply Received, Devid: 0, Message ID: 1, Code: 200, EventID: Error, Message: success
Appel de service
Dans le programme d'exemple, lorsqu'une demande d'appel de service est reçue, la fonction de rappel suivante est invoquée :
static int user_service_request_event_handler(const int devid, const char *serviceid, const int serviceid_len,
const char *request, const int request_len,
char **response, int *response_len)
{
int contrastratio = 0, to_cloud = 0;
cJSON *root = NULL, *item_transparency = NULL, *item_from_cloud = NULL;
EXAMPLE_TRACE("Service Request Received, Devid: %d, Service ID: %.*s, Payload: %s", devid, serviceid_len,
serviceid,
request);
/* Parse Root */
root = cJSON_Parse(request);
if (root == NULL || ! cJSON_IsObject(root)) {
EXAMPLE_TRACE("JSON Parse Error");
return -1;
}
Traitez le service reçu avec l'ID de service Custom, attribuez la valeur du paramètre d'entrée du service +1 au paramètre de sortie et renvoyez-la au cloud.
if (strlen("Custom") == serviceid_len && memcmp("Custom", serviceid, serviceid_len) == 0) {
...
contrastratio = item_transparency->valueint + 1;
...
HAL_Snprintf(*response, *response_len, response_fmt, contrastratio);
*response_len = strlen(*response);
} else if (strlen("SyncService") == serviceid_len && memcmp("SyncService", serviceid, serviceid_len) == 0) {
...
...
}
cJSON_Delete(root);
return 0;
}
À ce stade, vous pouvez voir le journal suivant côté appareil :
[dbg] iotx_mc_cycle(1774): PUBLISH
[inf] iotx_mc_handle_recv_PUBLISH(1549): Downstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/service/Custom'
[inf] iotx_mc_handle_recv_PUBLISH(1550): Downstream Payload:
La demande d'appel de service suivante est reçue du cloud, avec le paramètre d'entrée transparency :
< {
< "method": "thing.service.Custom",
< "id": "161445548",
< "params": {
< "transparency": 5
< },
< "version": "1.0.0"
< }
[dbg] iotx_mc_handle_recv_PUBLISH(1555): Packet Ident : 00000000
[dbg] iotx_mc_handle_recv_PUBLISH(1556): Topic Length : 49
[dbg] iotx_mc_handle_recv_PUBLISH(1560): Topic Name : /sys/a1csED27mp7/AdvExample1/thing/service/Custom
[dbg] iotx_mc_handle_recv_PUBLISH(1563): Payload Len/Room : 96 / 4946
[dbg] iotx_mc_handle_recv_PUBLISH(1564): Receive Buflen : 5000
[dbg] iotx_mc_handle_recv_PUBLISH(1575): delivering msg ...
[dbg] iotx_mc_deliver_message(1291): topic be matched
[inf] dm_msg_proc_thing_service_request(224): Service Identifier: Custom
[dbg] dm_msg_request_parse(142): Current Request Message ID: 161445548
[dbg] dm_msg_request_parse(143): Current Request Message Version: 1.0.0
[dbg] dm_msg_request_parse(144): Current Request Message Method: thing.service.Custom
[dbg] dm_msg_request_parse(145): Current Request Message Params: {"transparency":5}
[dbg] dm_ipc_msg_insert(87): dm msg list size: 0, max size: 50
[inf] _iotx_linkkit_event_callback(219): Receive Message Type: 18
[inf] _iotx_linkkit_event_callback(221): Receive Message: {"id":"161445548","devid":0,"serviceid":"Custom","payload":{"transparency":5}}
[dbg] _iotx_linkkit_event_callback(300): Current Id: 161445548
[dbg] _iotx_linkkit_event_callback(301): Current Devid: 0
[dbg] _iotx_linkkit_event_callback(302): Current ServiceID: Custom
[dbg] _iotx_linkkit_event_callback(303): Current Payload: {"transparency":5}
La fonction d'appel de l'utilisateur user_service_request_event_handler est appelée :
user_service_request_event_handler. 99: Service Request Received, Devid: 0, Service ID: Custom, Payload: {"transparency":5}
user_service_request_event_handler. 116: transparency: 5
[dbg] iotx_dm_send_service_response(280): Current Service Response Payload, Length: 19, Payload: {"Contrastratio":6}
[dbg] dm_mgr_upstream_thing_service_response(1275): Current Service Name: thing/service/Custom_reply
[inf] dm_msg_response(274): Send URI: /sys/a1csED27mp7/AdvExample1/thing/service/Custom_reply, Payload: {"id":"161445548","code":200,"data":{"Contrastratio":6}}
[dbg] MQTTPublish(319): ALLOC: (111) / [175] @ 0x85a1a0
[inf] MQTTPublish(378): Upstream Topic: '/sys/a1csED27mp7/AdvExample1/thing/service/Custom_reply'
[inf] MQTTPublish(379): Upstream Payload:
Dans la fonction de rappel, ajoutez 1 à la valeur de transparency, attribuez la valeur à Contrastratio, puis signalez-la au cloud :
> {
> "id": "161445548",
> "code": 200,
> "data": {
> "Contrastratio": 6
> }
> }
[inf] dm_client_publish(106): Publish Result: 0
[dbg] alcs_observe_notify(105): payload:{"id":"161445548","code":200,"data":{"Contrastratio":6}}
[inf] dm_server_send(76): Send Observe Notify Result 0
Ceci conclut les descriptions des services, attributs et événements dans la version avancée de la routine mono-élément.