Implemente las operaciones de API dependientes del sistema necesarias para portar Link SDK for C a su sistema operativo o plataforma de hardware.
Requisitos previos
Ya obtuvo el SDK. Obtain Link SDK for C.
Arquitectura

Link SDK for C abstrae todas las interacciones con el sistema operativo y el hardware en operaciones de API dependientes del sistema. Para usar el SDK, invoque sus operaciones de API para la lógica de negocio e implemente las operaciones dependientes del sistema correspondientes a su plataforma destino.
En Link SDK for C V4.1.10 y versiones posteriores, TLS está integrado en el SDK. Solo necesita implementar la transmisión TCP al portar las operaciones relacionadas con la red.
Si actualiza desde una versión anterior, deshabilite TLS mediante la configuración del parámetro CORE_SYSDEP_MBEDTLS_ENABLED en el archivo
aiot_port/*_port.c.
Acerca de las operaciones de API dependientes del sistema
Las operaciones de API dependientes del sistema desacoplan Link SDK for C de los sistemas operativos, lo que permite la portabilidad entre plataformas.
El prototipo se define en aiot_sysdep_portfile_t. Debe definir una variable global llamada g_aiot_sysdep_portfile, implementada con las operaciones del sistema operativo destino.
Defina todas las operaciones de API dependientes del sistema durante el proceso de portabilidad. No establezca ninguna operación como NULL; de lo contrario, se producirán errores en tiempo de ejecución.
Operaciones de API dependientes del sistema
|
Tipo |
Operación |
Descripción |
|
Operaciones comunes |
core_sysdep_malloc |
Asigna memoria. |
|
core_sysdep_free |
Libera memoria. |
|
|
core_sysdep_time |
Devuelve la marca de tiempo actual. El SDK la usa para calcular la desviación horaria. |
|
|
core_sysdep_sleep |
Suspende la ejecución durante un periodo especificado en milisegundos. |
|
|
core_sysdep_rand |
Genera un número aleatorio. |
|
|
Operaciones relacionadas con la red |
core_sysdep_network_init |
Crea una sesión de red. |
|
core_sysdep_network_setopt |
Configura los parámetros de la sesión. |
|
|
core_sysdep_network_establish |
Establece una sesión de red para conexiones MQTT o HTTP. |
|
|
core_sysdep_network_recv |
Lee datos de una sesión. |
|
|
core_sysdep_network_send |
Envía datos a través de una sesión. |
|
|
core_sysdep_network_deinit |
Destruye una sesión. |
|
|
Operaciones relacionadas con mutex |
core_sysdep_mutex_init |
Crea un mutex. |
|
core_sysdep_mutex_lock |
Adquiere un bloqueo de mutex. |
|
|
core_sysdep_mutex_unlock |
Libera un mutex. |
|
|
core_sysdep_mutex_deinit |
Elimina un mutex. |
Parámetros de operaciones de red
Configure los siguientes parámetros para la operación core_sysdep_network_setopt al portar Link SDK for C.
-
Parámetros de tipo de red basados en socket para conexiones TCP y UDP:
Parámetro
Descripción
CORE_SYSDEP_SOCKET_TCP_CLIENT
Cliente TCP compatible con MQTT, HTTP, HTTP2 y WebSocket. Obligatorio para estos protocolos.
CORE_SYSDEP_SOCKET_UDP_CLIENT
Cliente UDP. Obligatorio para conexiones CoAP.
-
Parámetros de conexión:
Parámetro
Descripción
CORE_SYSDEP_NETWORK_SOCKET_TYPE
Tipo de socket por crear.
Tipo de dato:
(core_sysdep_socket_type_t *).CORE_SYSDEP_NETWORK_HOST
Nombre de dominio o dirección IP para la conexión. Los módulos de capa superior comparten la memoria.
Tipo de dato:
(char *)CORE_SYSDEP_NETWORK_BACKUP_IP
Dirección IP de respaldo que se usa si falla la resolución DNS. Opcional.
CORE_SYSDEP_NETWORK_PORT
Número de puerto para la conexión.
Tipo de dato:
(uint16_t *)CORE_SYSDEP_NETWORK_CONNECT_TIMEOUT_MS
Periodo de tiempo de espera de conexión.
Tipo de dato:
(uint32_t *)CORE_SYSDEP_NETWORK_MAX
Link SDK for C no lo usa. No requiere configuración.
Código de ejemplo
El código de ejemplo usa el estándar POSIX. Al descargar Link SDK for C, establezca Device OS en POSIX Compliant en la página de personalización del SDK. El SDK proporciona código de ejemplo en portfile/aiot_port/posix_port.c.
Verificar el resultado de la portabilidad
Después de portar Link SDK for C, compruebe que las operaciones de API dependientes del sistema funcionen correctamente:
-
Abra
./LinkSDK/demos/sysdep_api_test_demo.cy complete las siguientes configuraciones:-
Defina una función para crear tareas.
Esto valida la concurrencia. Cree una función de tarea para el sistema operativo destino.
-
Especifique el tamaño máximo del montículo (heap).
Esto verifica que la asignación de memoria dinámica funcione correctamente para el SDK.
Código de ejemplo
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/ -
Compile y ejecute
sysdep_api_test_demo.c.-
Consulte el resultado.
-
Exitoso
Si aparecen los siguientes registros, todas las operaciones de API portadas funcionan correctamente.
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 -
Con errores
Si la demostración no se completa o reporta un error, solucione el problema mediante la siguiente tabla.
Código de error
Descripción
Operaciones de API relacionadas
TEST_ERR_RANDOM
Error en la generación de números aleatorios.
core_sysdep_rand
TEST_ERR_MALLOC
Error en la asignación de memoria.
core_sysdep_malloc
TEST_ERR_HEAP
Error en la asignación y liberación de memoria.
core_sysdep_malloc
core_sysdep_free
TEST_ERR_SLEEP
Error en la operación de hibernación o de hora del sistema.
core_sysdep_time
core_sysdep_sleep
TEST_ERR_MUTEX
Error en la operación de mutex.
core_sysdep_mutex_init
core_sysdep_mutex_lock
core_sysdep_mutex_unlock
core_sysdep_mutex_deinit
TEST_ERR_NETWORK
Error en la operación de red.
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
Error desconocido.
Ninguna
-