Implémentez les appels d'API système requis pour porter le Link SDK for C sur votre système d'exploitation ou votre plateforme matérielle.
Prérequis
Téléchargez le SDK. Obtenir le Link SDK for C.
Architecture

Le Link SDK for C isole les interactions avec le système d'exploitation et le matériel via des appels d'API système. Pour utiliser le SDK, appelez ses fonctions pour la logique métier et implémentez les opérations système spécifiques à votre plateforme cible.
À partir de la version 1.10 du Link SDK for C, TLS est intégré au SDK. Implémentez uniquement la transmission TCP lors du portage des opérations réseau.
En cas de mise à niveau depuis une version antérieure, désactivez TLS en configurant le paramètre CORE_SYSDEP_MBEDTLS_ENABLED dans le fichier
aiot_port/*_port.c.
À propos des appels d'API système
Les appels d'API système découplent le Link SDK for C des systèmes d'exploitation, assurant ainsi sa portabilité multiplateforme.
Le prototype est défini dans aiot_sysdep_portfile_t. Définissez une variable globale nommée g_aiot_sysdep_portfile qui implémente les opérations du système d'exploitation cible.
Définissez tous les appels d'API système lors du portage. Ne laissez aucun pointeur de fonction à NULL, sous peine de provoquer des erreurs d'exécution.
Appels d'API système
|
Type |
Operation |
Description |
|
Opérations courantes |
core_sysdep_malloc |
Alloue de la mémoire. |
|
core_sysdep_free |
Libère de la mémoire. |
|
|
core_sysdep_time |
Renvoie l'horodatage actuel. Le SDK l'utilise pour calculer le décalage temporel. |
|
|
core_sysdep_sleep |
Suspend l'exécution pendant une durée spécifiée en millisecondes. |
|
|
core_sysdep_rand |
Génère un nombre aléatoire. |
|
|
Opérations liées au réseau |
core_sysdep_network_init |
Crée une session réseau. |
|
core_sysdep_network_setopt |
Configure les paramètres de session. |
|
|
core_sysdep_network_establish |
Établit une session réseau pour les connexions MQTT ou HTTP. |
|
|
core_sysdep_network_recv |
Lit les données d'une session. |
|
|
core_sysdep_network_send |
Envoie des données via une session. |
|
|
core_sysdep_network_deinit |
Détruit une session. |
|
|
Opérations liées aux mutex |
core_sysdep_mutex_init |
Crée un mutex. |
|
core_sysdep_mutex_lock |
Verrouille un mutex. |
|
|
core_sysdep_mutex_unlock |
Déverrouille un mutex. |
|
|
core_sysdep_mutex_deinit |
Supprime un mutex. |
Paramètres des opérations réseau
Configurez les paramètres suivants pour l'appel core_sysdep_network_setopt lors du portage du Link SDK for C.
-
Paramètres de type de socket pour les connexions TCP et UDP :
Parameter
Description
CORE_SYSDEP_SOCKET_TCP_CLIENT
Client TCP prenant en charge MQTT, HTTP, HTTP2 et WebSocket. Requis pour ces protocoles.
CORE_SYSDEP_SOCKET_UDP_CLIENT
Client UDP. Requis pour les connexions CoAP.
-
Paramètres de connexion :
Parameter
Description
CORE_SYSDEP_NETWORK_SOCKET_TYPE
Type de socket à créer.
Type de données :
(core_sysdep_socket_type_t *).CORE_SYSDEP_NETWORK_HOST
Nom de domaine ou adresse IP pour la connexion. La mémoire est partagée par les modules de couche supérieure.
Type de données :
(char *)CORE_SYSDEP_NETWORK_BACKUP_IP
Adresse IP de secours utilisée en cas d'échec de la résolution DNS. Facultatif.
CORE_SYSDEP_NETWORK_PORT
Numéro de port pour la connexion.
Type de données :
(uint16_t *)CORE_SYSDEP_NETWORK_CONNECT_TIMEOUT_MS
Délai d'expiration de la connexion.
Type de données :
(uint32_t *)CORE_SYSDEP_NETWORK_MAX
Non utilisé par le Link SDK for C. Aucune configuration n'est nécessaire.
Exemple de code
L'exemple de code utilise la norme POSIX. Lors du téléchargement du Link SDK for C, sélectionnez POSIX Compliant comme système d'exploitation (Device OS) sur la page de personnalisation du SDK. Le SDK fournit un exemple de code dans portfile/aiot_port/posix_port.c.
Vérifier le résultat du portage
Après avoir porté le Link SDK for C, vérifiez que les appels d'API système fonctionnent correctement :
-
Ouvrez
./LinkSDK/demos/sysdep_api_test_demo.cet effectuez les configurations suivantes :-
Définissez une fonction de création de tâches.
Cela permet de valider la gestion de la concurrence. Créez une fonction de tâche adaptée au système d'exploitation cible.
-
Spécifiez la taille maximale du tas (heap).
Cela permet de vérifier que l'allocation mémoire fonctionne correctement pour le SDK.
Exemple de code
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TODO START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ /* * TODO: Call the function to create and execute a task. The function automatically exists after the task ends. * @param[in] entry The beginning of the function. * @param[in] argv The parameters of the function. */ #include<pthread.h> void task_start(TASK_FUNC entry,void* argv) { pthread_t id; pthread_create(&id, NULL, (void*(*)(void *))entry, argv); } /*TODO: The maximum size of a heap. Unit: bytes. */ #define HEAP_MAX ( 20 * 1024 ) /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TODO END <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ -
Compilez et exécutez
sysdep_api_test_demo.c.-
Consultez le résultat.
-
Réussite
Si les journaux suivants apparaissent, toutes les opérations d'API portées fonctionnent correctement.
Line[804]: TOTAL TEST START Line[806]: TEST [1/5] [RANDOM_TEST ] .....................................[START] Line[812]: TEST [1/5] [RANDOM_TEST ] .....................................[SUCCESS] Line[806]: TEST [2/5] [HEAP_TEST ] .....................................[START] Line[812]: TEST [2/5] [HEAP_TEST ] .....................................[SUCCESS] Line[806]: TEST [3/5] [TIME_TEST ] .....................................[START] Line[519]: sleep 30000 ms test Line[499]: sleep_test_task_1 enter wanna sleep: 10000ms Line[499]: sleep_test_task_2 enter wanna sleep: 10000ms Line[595]: sleep 10000ms start:[1642324352748] stop:[1642324362748] expected Line[812]: TEST [3/5] [TIME_TEST ] .....................................[SUCCESS] Line[806]: TEST [4/5] [NETWORK_TEST] .....................................[START] Line[372]: [NETWORK_TEST.RECV] test success Line[812]: TEST [4/5] [NETWORK_TEST] .....................................[SUCCESS] Line[806]: TEST [5/5] [MUTEX_TEST ] .....................................[START] Line[692]: mutex lock task1, unlock task2 3000 ms Line[703]: task1 value [30 --> 30], task2 value [30 --> 60] Line[715]: unlock task1, lock task2 3000 ms Line[725]: task1 value [30 --> 60], task2 value [60 --> 60] Line[736]: unlock task1, lock task2 3000 ms Line[742]: task1 value [60 --> 90], task2 value [60 --> 90] Line[812]: TEST [5/5] [MUTEX_TEST ] .....................................[SUCCESS] Line[816]: TOTAL TEST SUCCESS -
Échec
Si la démonstration échoue ou signale une erreur, identifiez le problème à l'aide du tableau suivant.
Code d'erreur
Description
Appels d'API associés
TEST_ERR_RANDOM
Échec de la génération de nombres aléatoires.
core_sysdep_rand
TEST_ERR_MALLOC
Échec de l'allocation de mémoire.
core_sysdep_malloc
TEST_ERR_HEAP
Échec de l'allocation ou de la libération de mémoire.
core_sysdep_malloc
core_sysdep_free
TEST_ERR_SLEEP
Échec de la mise en veille ou de l'opération temporelle.
core_sysdep_time
core_sysdep_sleep
TEST_ERR_MUTEX
Échec de l'opération de mutex.
core_sysdep_mutex_init
core_sysdep_mutex_lock
core_sysdep_mutex_unlock
core_sysdep_mutex_deinit
TEST_ERR_NETWORK
Échec de l'opération réseau.
core_sysdep_network_init
core_sysdep_network_setopt
core_sysdep_network_establish
core_sysdep_network_recv
core_sysdep_network_send
core_sysdep_network_deinit
TEST_ERR_GENERIC
Erreur inconnue.
Aucune
-