全部產品
Search
文件中心

:移植樣本說明

更新時間:Jun 30, 2024

本文介紹在移植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完成以後,可通過以下步驟快速驗證移植的介面功能是否正常。

  1. 開啟./LinkSDK/demos/sysdep_api_test_demo.c檔案,實現如下功能

    1. 實現任務建立函數。

      驗證將會使用的並發能力,需要在目標系統(移植後的環境)中建立任務。

    2. 設定堆的最大空間。

      允許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 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
  2. 編譯並運行移植測試demo:sysdep_api_test_demo.c

  3. 查看運行結果。

    • 運行成功

      出現以下日誌內容,表示移植的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

      未知錯誤