すべてのプロダクト
Search
ドキュメントセンター

IoT Platform:Link SDK for Cをポートする方法の例

最終更新日:Apr 09, 2025

このトピックでは、Link SDK for Cを移植するときに定義する必要があるシステム関連のAPI操作について説明します。

前提条件

SDKが取得されます。 詳細については、「C用リンクSDKの取得」をご参照ください。

アーキテクチャ

整体框架

Link SDK for Cは、さまざまなオペレーティングシステムまたはハードウェアプラットフォームをサポートします。 Link SDK for Cは、システム関連のAPI操作をカプセル化して、オペレーティングシステムまたはハードウェアプラットフォームと対話します。 製品を開発するときは、SDKでAPI操作を呼び出してビジネスロジックを実装する必要があります。 また、システム関連のAPI操作を定義するコードを記述する必要があります。

説明
  • Link SDK for C V4.1.10以降では、トランスポート層セキュリティ (TLS) がSDKに実装されています。 ネットワーク関連のAPI操作を移植する場合、TCP送信を実装するだけで済みます。

  • SDKを以前のバージョンから最新バージョンにアップグレードする場合は、aiot_port/*_port.cファイルでCORE_SYSDEP_MBEDTLS_ENABLEDパラメーターを設定してTSLをオフにする必要があります。

システム関連のAPI操作の説明

  • システム関連のAPI操作は、Link SDK for Cをオペレーティングシステムから切り離します。 操作を呼び出して、さまざまなオペレーティングシステムと対話できます。

  • システム関連のAPI操作のプロトタイプ定義はaiot_sysdep_portfile_tです。 グローバル変数g_aiot_sysdep_portfileを定義する必要があります。 グローバル変数は、SDKを移植するために、宛先オペレーティングシステムのAPIオペレーションによって実装される。

  • 一般的な操作とmutex関連の操作は使いやすいです。 このトピックでは、操作を呼び出す方法については説明しません。 SDKを移植するときは、すべてのシステム関連のAPI操作を定義する必要があります。 操作を定義するときにNULLを指定することはできません。 それ以外の場合、エラーが発生します。

システム関連のAPI操作のリスト

データ型

操作

説明

一般的な操作

core_sysdep_malloc

メモリに適用されます。

core_sysdep_free

メモリを解放します。

core_sysdep_time

現在のタイムスタンプを取得します。 Link SDKを使用して偏差を計算します。

core_sysdep_sleep

スリープ時間をミリ秒単位で指定します。

core_sysdep_rand

乱数を生成します。

ネットワーク関連の操作

core_sysdep_network_init

セッションを作成します。

core_sysdep_network_setopt

セッションのパラメーターを設定します。

core_sysdep_network_establish

Message Queuing Telemetry Transport (MQTT) またはHTTP接続を確立できるセッションを確立します。

core_sysdep_network_recv

指定されたセッションからデータを読み取ります。

core_sysdep_network_send

指定したセッションを使用してデータを送信します。

core_sysdep_network_deinit

セッションを削除します。

Mutex関連の操作

core_sysdep_mutex_init

ミューテックスを作成します。

core_sysdep_mutex_lock

ミューテックスに適用されます。

core_sysdep_mutex_unlock

ミューテックスをリリースします。

core_sysdep_mutex_deinit

ミューテックスを削除します。

ネットワーク操作のパラメーターの設定

Link SDK for Cを移植するときは、core_sysdep_network_setopt操作のパラメーターを設定する必要があります。

  • 次の表に、ソケットベースのネットワークタイプを指定するパラメーターを示します。 TCPおよびUDP接続を確立するためのパラメーターを設定できます。

    項目

    説明

    CORE_SYSDEP_SOCKET_TCP_CLIENT

    MQTT、HTTP、HTTP2、およびWebSocketプロトコルをサポートするTCPクライアント。 上記の機能を使用する場合は、パラメーターを設定する必要があります。

    CORE_SYSDEP_SOCKET_UDP_CLIENT

    UDPクライアント。 CoAP接続を確立する場合は、パラメーターを設定する必要があります。

  • 次の表に、接続を確立するために必要なパラメーターを示します。

    項目

    説明

    CORE_SYSDEP_NETWORK_SOCKET_TYPE

    作成するソケットのタイプ。

    データ型: (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

    このパラメーターはLink SDK for Cでは使用されません。パラメーターを設定する必要はありません。

サンプルコード

サンプルコードはPOSIX標準に基づいています。 Link SDK for Cをダウンロードするときは、SDKカスタマイズページでデバイスOSをPOSIX準拠に設定します。 Link SDK for Cは、portfile/aiot_port/posix_port.cファイルでサンプルコードを提供します。 サンプルコードは、POSIX標準に基づいてSDKを移植する方法を示しています。

結果の検証

Link SDK for Cを移植した後、次の手順を実行して、Link SDK for CのAPI操作が期待どおりに機能するかどうかを確認します。

  1. を開きます。/LinkSDK/demos/sysdep_api_test_demo.cファイルを作成し、次の操作を実行します。

    1. タスクを作成する関数を定義します。

      同時実行機能を検証します。 SDKが移植される移行先システムでタスクを作成する必要があります。

    2. ヒープの最大サイズを指定します。

      この項目は、ヒープがSDKで期待どおりに使用できるかどうかを確認するために使用されます。

    サンプルコード

    /* >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> TODO START >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> * /
    /*
     * TODO: タスクを作成して実行する関数を呼び出します。 タスクが終了すると、関数は自動的に存在します。
     * @ param[in] エントリ関数の先頭。
     * @ param[in] argv関数のパラメータ。
     * /
    # include<pthread.h>
    void task_start(TASK_FUNCエントリ, void * argv)
    {
        pthread_t id;
        pthread_create(&id, NULL, (void *(*)(void *)) エントリ, argv);
    }
    /* TODO: ヒープの最大サイズ。 単位:バイト * /
    # define HEAP_MAX ( 20*1024)
    /* <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TODO END <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< */ 
  2. sysdep_api_test_demo.cという名前のデモファイルをコンパイルして実行します。

  3. 結果を表示します。

    • 成功

      次のログが表示された場合、ポートされたLink SDK for CのAPI操作は期待どおりに機能します。

      ライン [804]: TOTAL TEST START
      行 [806]: TEST [1/5] [RANDOM_TEST] 。....................................[START]
      行 [812]: TEST [1/5] [RANDOM_TEST] 。.................................... [成功]
      行 [806]: TEST [2/5] [HEAP_TEST] 。....................................[START]
      行 [812]: TEST [2/5] [HEAP_TEST] 。.................................... [成功]
      行 [806]: TEST [3/5] [TIME_TEST] 。....................................[START]
      行 [519]: 睡眠30000 msテスト
      行 [499]: sleep_test_task_1 wanna sleepに入る: 10000ms
      行 [499]: sleep_test_task_2 wanna sleepに入る: 10000ms
      Line[595]: sleep 10000ms start:[1642324352748] stop:[1642324362748] 予定
      行 [812]: TEST [3/5] [TIME_TEST] 。.................................... [成功]
      行 [806]: TEST [4/5] [NETWORK_TEST] 。....................................[START]
      行 [372]: [NETWORK_TEST.RECV] テストの成功
      行 [812]: TEST [4/5] [NETWORK_TEST] 。.................................... [成功]
      行 [806]: TEST [5/5] [MUTEX_TEST] 。....................................[START]
      行 [692]: mutex lock task1, unlock task2 3000 ms
      行 [703]: task1値 [30-> 30] 、task2値 [30-> 60]
      行 [715]: task1のロック解除、task2のロック3000 ms
      行 [725]: task1値 [30-> 60] 、task2値 [60-> 60]
      行 [736]: task1のロック解除、task2のロック3000 ms
      行 [742]: task1値 [60 --> 90] 、task2値 [60 --> 90]
      行 [812]: TEST [5/5] [MUTEX_TEST] 。.................................... [成功]
      ライン [816]: 総テスト成功 
    • 失敗した

      ファイルを最後の行まで実行できない場合、または最後の行の実行後にエラーメッセージが表示される場合は、次の表に基づいて問題をトラブルシューティングします。

      エラーコード

      説明

      関連する API 操作

      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

      システムが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

      不明なエラーが発生しました。

      なし