本文介紹在移植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
未知錯誤
無