本文介紹在移植C Link SDK過程中,需要實現的系統依賴接口及說明。
前提條件
已獲取SDK,具體操作,請參見獲取SDK。
整體框架
C Link SDK支持在不同操作系統或硬件平臺上運行,是因為C Link SDK與操作系統或目標硬件的所有操作,均被抽象為系統依賴接口。因此,在開發產品時,您不僅需要調用SDK的API實現產品業務邏輯,還需要編寫代碼,實現SDK的系統依賴接口。
C Link SDK自版本v4.1.0開始,已在SDK內部實現連接安全傳輸(TLS),移植網絡接口僅需實現TCP傳輸。
如果用戶從老版本SDK升級至新版本,需關閉
aiot_port/*_port.c
中的TLS開關(CORE_SYSDEP_MBEDTLS_ENABLED)
。
系統依賴接口說明
系統依賴接口將C Link SDK與具體的操作系統解耦,不同的系統僅需實現對應的系統依賴接口。
系統依賴接口的原型定義:aiot_sysdep_portfile_t,用戶需定義全局變量g_aiot_sysdep_portfile,該變量為目標系統接口實現,完成移植。
通用接口與互斥鎖接口比較簡單,其使用方法未在本文中說明。但在移植過程中,所有接口均需實現,不能為NULL,否則會報錯。
系統依賴接口列表
類型 | 名稱 | 說明 |
通用接口 | core_sysdep_malloc | 申請內存。 |
core_sysdep_free | 釋放內存。 | |
core_sysdep_time | 獲取當前的時間戳,Link SDK用于差值計算。 | |
core_sysdep_sleep | 睡眠指定的毫秒數。 | |
core_sysdep_rand | 隨機數生成方法。 | |
網絡接口 | core_sysdep_network_init | 創建1個網絡會話。 |
core_sysdep_network_setopt | 配置1個網絡會話的連接參數。 | |
core_sysdep_network_establish | 建立1個網絡會話,作為MQTT、HTTP等協議的底層承載。 | |
core_sysdep_network_recv | 從指定的網絡會話上讀取。 | |
core_sysdep_network_send | 在指定的網絡會話上發送。 | |
core_sysdep_network_deinit | 銷毀1個網絡會話。 | |
互斥鎖接口 | core_sysdep_mutex_init | 創建互斥鎖。 |
core_sysdep_mutex_lock | 申請互斥鎖。 | |
core_sysdep_mutex_unlock | 釋放互斥鎖。 | |
core_sysdep_mutex_deinit | 銷毀互斥鎖。 |
配置網絡接口
移植C Link SDK時,您需配置core_sysdep_network_setopt
的以下參數類型。
配置以下參數類型,選擇要連接的網絡類型:兼容TCP和UDP的網絡連接(Socket類型)。
類型
說明
CORE_SYSDEP_SOCKET_TCP_CLIENT
TCP客戶端,MQTT、HTTP、HTTP2、WebSocket等功能均使用該類型的連接。如果您需要使用以上功能,需要實現網絡接口的該參數類型。
CORE_SYSDEP_SOCKET_UDP_CLIENT
UDP客戶端,如果您需使用CoAP連接,需實現網絡接口的該參數類型。
保存以下參數類型的設置,用于后續建立連接使用。
類型
說明
CORE_SYSDEP_NETWORK_SOCKET_TYPE
需要建立的Socket類型。
數據類型:
(core_sysdep_socket_type_t *)
。CORE_SYSDEP_NETWORK_HOST
用于建立網絡連接的域名地址或IP地址,內存與上層模塊共用。
數據類型:
(char *)
。CORE_SYSDEP_NETWORK_BACKUP_IP
當建聯DNS解析失敗時,使用此備用IP重試,可忽略。
CORE_SYSDEP_NETWORK_PORT
用于建立網絡連接的端口號。
數據類型:
(uint16_t *)
。CORE_SYSDEP_NETWORK_CONNECT_TIMEOUT_MS
建立網絡連接的超時時間。
數據類型:
(uint32_t *)
。CORE_SYSDEP_NETWORK_MAX
SDK未使用此接口類型,無需實現該接口類型,可忽略。
移植樣例
移植樣例以POSIX接口為例,定制下載SDK時,設備OS選擇(POSIX Compliant)。在下載的C Link SDK文件中,找到樣例文件portfile/aiot_port/posix_port.c
,查看基于POSIX接口實現的移植樣例。
移植驗證
在您參考上文移植LinkSDK完成以后,可通過以下步驟快速驗證移植的接口功能是否正常。
打開
./LinkSDK/demos/sysdep_api_test_demo.c
文件,實現如下功能。實現任務創建函數。
驗證將會使用的并發能力,需要在目標系統(移植后的環境)中創建任務。
設置堆的最大空間。
允許SDK使用的最大堆的大小,驗證堆的使用是否正常。
POSIX接口示例代碼:
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TODO START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/ /* * TODO: task_start功能實現,創建任務,并執行任務,待任務結束后自行退出 * @param[in] entry 任務函數入口 * @param[in] argv 任務函數參數 */ #include<pthread.h> void task_start(TASK_FUNC entry,void* argv) { pthread_t id; pthread_create(&id, NULL, (void*(*)(void *))entry, argv); } /*TODO: 堆的最大空間,單位字節 */ #define HEAP_MAX ( 20 * 1024 ) /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TODO END <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
編譯并運行移植測試demo:
sysdep_api_test_demo.c
。查看運行結果。
運行成功
出現以下日志內容,表示移植的Link SDK接口功能正常。
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
運行失敗
如果無法運行到最后,或運行到最后出現錯誤信息,請根據下表進行定位處理。
錯誤碼
說明
相關接口
TEST_ERR_RANDOM
隨機數生成函數測試異常
core_sysdep_rand
TEST_ERR_MALLOC
內存申請測試異常
core_sysdep_malloc
TEST_ERR_HEAP
內存申請及釋放功能測試異常
core_sysdep_malloc
core_sysdep_free
TEST_ERR_SLEEP
睡眠或者系統時間測試異常
core_sysdep_time
core_sysdep_sleep
TEST_ERR_MUTEX
互斥鎖功能測試異常
core_sysdep_mutex_init
core_sysdep_mutex_lock
core_sysdep_mutex_unlock
core_sysdep_mutex_deinit
TEST_ERR_NETWORK
網絡功能測試異常
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
未知錯誤
無