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

IoT Platform:SDKをESP32開発ボードに移植する

最終更新日:Apr 17, 2025

このトピックでは、SDK for C 4.0をESP32開発ボードに移植し、MQTT (Message Queuing Telemetry Transport) デモを使用してAlibaba Cloud IoT Platformに接続する方法について説明します。

開発環境

SDKを移植するには、次の項目を準備する必要があります。

  • ESP32開発ボード。
  • USBケーブル。
  • Windows、Linux、またはmacOSを実行するコンピュータ。

デモで使用される開発ボードは、公式のESP-WROOM-322モジュール、オンボードUSB-シリアルモジュールCP2102、および電源モジュールを備えたESP32コアボードV2/ESP32 DevKitCです。

説明 このデモでは、macOSを使用して開発環境を設定します。 他のオペレーティングシステムで開発環境をセットアップする方法の詳細については、「スタートアップ」をご参照ください。

開発環境をセットアップする

説明 開発環境のセットアップを高速化するには、まず [開始] を読むことをお勧めします。

macOS環境をセットアップするには、次の手順を実行します。

  1. 必要なソフトウェアをインストールします。
  2. ESP-IDFの公式リポジトリをクローンします。

    このデモでは、Espressif IoT Development Framework (ESP-IDF) リポジトリのrelease/v4.2ブランチを使用します。

    cd ~
    mkdir esp && cd esp
    git clone -- recursive -b release/v4.2 https://github.com/espressif/esp-idf.git 
  3. ツールチェーンとコンパイルツールをインストールします。
    cd esp-idf
    . /install.sh 
  4. 環境変数を設定します。
    • 次のスクリプトを実行します。
      . $HOME/esp/esp-idf/export.sh 
    • または、次のスクリプトを実行して、すべての環境変数の設定を $HOME/.bash_profileファイルに追加します。
      set_esp32 ()
      {
          export IDF_PATH=$HOME/esp/esp-idf
          . $HOME/esp/esp-idf/export.sh
      } 
  5. wifiステーションのデモを別のディレクトリにコピーします。
    cd ~/esp
    cp -r $IDF_PATH/examples/wifi/getting_started/station. 
  6. 開発ボードに接続します。
    • USBドライバをインストールします。 詳細については、「ESP32でシリアル接続を確立する」をご参照ください。
    • デバイスのポート名を確認します。 デモのUSBポート名は /dev/cu.SLAB_USBtoUARTです。
  7. プロジェクトを設定します。

    idf.py menuconfigを実行してプロジェクトを設定します。 このデモでは、既定の設定は保持されます。

  8. プロジェクトをコンパイルしてフラッシュし、シリアルポートを監視します。
    • ステーションプロジェクトパスに移動し、idf.py buildを実行してプロジェクトをコンパイルします。
    • コンパイルが完了したら、idf.py -p PORT flashコマンドを実行してファームウェアをフラッシュします。 PORTを実際のUSBポート名に置き換えます。
    • フラッシュが完了したら、idf.py -p PORT monitorコマンドを実行してシリアルポートを監視します。
    • idf.py -p PORT flash monitorコマンドを実行してファームウェアをフラッシュし、シリアルポートの印刷情報を監視することもできます。

    これで、ESP32開発環境をセットアップし、wifiステーションのデモをコンパイルしてフラッシュしました。 次のセクションでは、SDK for C 4.0を移植してAlibaba Cloud IoT Platformに接続する方法について説明します。

C 4.0用ポートSDK

SDK for C 4.0を移植するプロセスには、SDKコードのインポートと、SDKポートファイルおよびコンパイルシステムの構成が含まれます。

SDKのportfilesディレクトリには、ESP32のportfileが含まれています。 したがって、SDKソースコードをインポートし、コンパイルシステムを設定して移植を完了するだけです。

条件

移植プロセスについては、「IoT Development Framework (IDF) のビルドシステム」を読むことをお勧めします。 IDFに関する次の用語を理解する必要があります。

  • project: アプリのビルドに使用されるすべてのソースファイルと構成ファイルのみを含むディレクトリです。
  • コンポーネント: これらは、コンパイルされたスタンドアロンコードのモジュラー部分です。静的ライブラリとアプリにリンクされています。 これらのモジュールコンポーネントは、IDFのコンポーネントディレクトリに格納されます。 カスタムコンポーネントを追加できます。

デフォルトでは、IDFのコンパイルシステムはNinjaとCMakeを一緒に使用します。 SDKコードをインポートし、対応するCMakeList.txtファイルを記述してSDKをコンパイルするだけです。

移植方法

  • 方法1: SDK for Cをプロジェクトディレクトリにインポートし、アプリのソースコードを使用してSDKソースコードをコンパイルします。
  • 方法2: SDK for CをカスタムIDFコンポーネントとしてIDFのcomponentsディレクトリに導入します。

2番目の方法を使用することを推奨します。 SDK for Cを別のコンポーネントとして使用すると、さまざまなプロジェクトで再利用したり、SDKコードをアプリコードから切り離すことができます。

手順

  1. SDK for Cをカスタムコンポーネントとして追加します。

    SDK for C 4.0をダウンロードし、SDKを $IDF_PATH/componentsディレクトリにコピーし、次のCMakeLists.txtファイルをSDK for Cディレクトリに追加します。

    セット (include_dirsコアコア /sysdepコア /utils)
    ファイル (GLOB c_sdk_srcs)
        "core/*.c"
        "core/utils/*.c"
        "core/sysdep/*.c"
        "portfiles/aiot_port/*.c"
        "external/*.c")
    idf_component_register(SRCS ${c_sdk_srcs}
                           INCLUDE_DIRS "${include_dirs}"
                           mbedtlsが必要です。
    説明
    • esp32_port.cファイルは、ESP32用のSDKポーティングファイルです。
    • SDK for Cはmbedtlsライブラリに依存します。 したがって、コンポーネントの依存関係を導入するには、REQUIRES mbedtlsを使用する必要があります。
    • SDK for Cには設定項目がありません。 したがって、Kconfigコンポーネントを設定する必要はありません。
  2. デモプログラムを移植します。

    IDFは、POSIX (Portable Operating System Interface) 規格と互換性がある。 したがって、LinkSDK/core/demos/mqtt_basic_demo.cファイルの内容をstation/main/station_example_main.cファイルにコピーして少し変更するだけです。

    変更したdemo.cファイルをダウンロードして、元のstation_example_main.cファイルを置き換えることができます。

    説明
    • wifi_init_sta() 関数は、再接続の数がEXAMPLE_ESP_MAXIMUM_RETRYで指定された値に達するまでWi-Fi接続を待ちます。
    • Wi-Fi接続が成功したら、SDK for CのAPI操作を呼び出してMQTT接続を確立できます。 MQTT接続が成功すると、デバイスとIoT Platformの間でデータを送信できます。
    • linkkit_main() 関数には、C用の元のSDKのMQTTデモが含まれています。
  3. プロジェクトをコンパイルしてフラッシュします。
    • プロジェクトディレクトリでidf.py menuconfigコマンドを実行します。 [構成例] メニューを表示できます。
    • WiFi SSIDWiFiパスワード、および最大再試行 (再接続の最大数を指定) パラメーターを変更し、変更を保存して終了します。
    • idf.py buildコマンドを実行して、プロジェクトをコンパイルします。
    • コンパイルが成功したら、idf.py -p /dev/cu.SLAB_USBtoUART flash monitorコマンドを実行して、プロジェクトをフラッシュし、シリアルポートを監視します。
  4. ログを表示します。
    ......
    I (829) phy: phy_version: 4180、cb3948e、9月12日2019、16:39:13、0、0
    I (829) wifi: mode : sta (30:ae:a4:04:81:84)
    I (829) wifiステーション: wifi_init_sta終了。
    I (949) wifi: 新しい:<11,0> 、古い:<1,0> 、ap:<255,255> 、sta:<11,0> 、prof:1
    I (949) wifi: state: init -> auth (b0)
    I (969) wifi: state: auth -> assoc (0)
    I (969) wifi: state: assoc -> run (10)
    I (1129) wifi: C_SDK_Testに接続、aid = 1、チャネル11、BW20、bssid = ec:26:ca:4b:68:cc
    I (1129) wifi: セキュリティタイプ: 3、phy: bgn、rssi: -37
    I (1139) wifi: pm start、タイプ: 1
    I (1219) wifi: APのビーコン間隔=102400、DTIM期間=1
    (2129) esp_netif_handlers: sta ip: 192.168.0.100、mask: 255.255.255.0、gw: 192.168.0.1
    I (2129) wifiステーション: 得られたip:192.168.0.100
    I (2129) wifiステーション: ap SSIDに接続: C_SDK_Testパスワード: 1234abcd
    I (2139) wifiステーション: スタートlinkkit mqtt
    [1.583][LK-0313] MQTTユーザーがaiot_mqtt_connect apiを呼び出し、connect
    [1.587][LK-0317] mqtt_basic_demo&a13FNXXXXXX
    [1.590][LK-0318] 4780A5F17990D8DC4CCAD392683ED80160C4C2A1FFA649425CD0E2666A8593EB
    [1.598][LK-0319] a13FN5TplKq.mqtt_basic_demo | timestamp=2524608000000、_ss=1、_v=sdk-c-4.0.0、securemode=2、signmethod=hmacsha256、ext=1、|
    サーバーとのmbedtls接続を確立します (host='a13FN5TplKq .iot-as-mqtt.cn-shanghai.aliyuncs.com ', port=[443])
    mbedtls接続を確立するための成功、fd = 54 (合計で29739バイト、最大使用44007バイト)
    [3.493][LK-0313] MQTT接続成功で1910 ms
    AIOT_MQTTEVT_CONNECT
    [3.494][LK-0309] サブ: /sys/a13FN5TplKq/mqtt_basic_demo/thing/event/+/post_reply
    [3.499][LK-0309] パブ: /sys/a13FN5TplKq/mqtt_basic_demo/thing/event/property/post
    [LK-030A] > 7B 22 69 64 22 3A 22 31 22 2C 22 76 65 72 73 69 | {"id":"1","versi
    [LK-030A] > 6F 6E 22 3A 22 31 2E 30 22 2C 22 70 61 72 61 6D | on ":" 1.0 "、" param
    [LK-030A] > 73 22 3A 7B 22 4C 69 67 68 74 53 77 69 74 63 68 | s ":{" LightSwitch
    [LK-030A] > 22 3A 30 7D 7D | ":0}}
    suback, res: -0x0000, packet id: 1, max qos: 1
    [3.573][LK-0309] pub: /sys/a13FN5TplKq/mqtt_basic_demo/thing/event/property/post_reply
    [LK-030A] < 7B 22 63 6F 64 65 22 3A 32 30 30 2C 22 64 61 74 | {"code":200,"dat
    [LK-030A] < 61 22 3A 7B 7D 2C 22 69 64 22 3A 22 31 22 2C 22 | a ":{}," id ":" 1 ","
    [LK-030A] < 6D 65 73 73 61 67 65 22 3A 22 73 75 63 63 65 73 | message ":" succes
    [LK-030A] < 73 22 2C 22 6D 65 74 68 6F 64 22 3A 22 74 68 69 | s "、" method ":" thi
    [LK-030A] < 6E 67 2E 65 76 65 6E 74 2E 70 72 6F 70 65 72 74 | ng.event.propert
    [LK-030A] < 79 2E 70 6F 73 74 22 2C 22 76 65 72 73 69 6F 6E | y.post "," version
    [LK-030A] < 22 3A 22 31 2E 30 22 7D | ":" 1.0 "}
    pub, qos: 0, topic: /sys/a13FNXXXXXX/mqtt_basic_demo/thing/event/property/post_reply
    pub, payload: {"code":200,"data" :{}, "id":"1","message":"success","method":"thing.event.property.post","version":"1.0"}
    ハートビート応答
    ハートビート応答
    ハートビート応答
    ......