このトピックでは、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ユーザーはToolchain for Mac OSの標準設定を表示できます。 Homebrewパッケージ管理ツールの使用を推奨します。 必要なパッケージには、pip、Ninja、CMakeが含まれます。
- 必要なソフトウェアをインストールするには、WindowsユーザーはWindows用ツールチェーンの標準設定を表示できます。
- 必要なソフトウェアをインストールするには、LinuxユーザーはToolchain for Linuxの標準設定を表示できます。
- 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 - ツールチェーンとコンパイルツールをインストールします。
cd esp-idf . /install.sh - 環境変数を設定します。
- 次のスクリプトを実行します。
. $HOME/esp/esp-idf/export.sh - または、次のスクリプトを実行して、すべての環境変数の設定を
$HOME/.bash_profileファイルに追加します。set_esp32 () { export IDF_PATH=$HOME/esp/esp-idf . $HOME/esp/esp-idf/export.sh }
- 次のスクリプトを実行します。
- wifiステーションのデモを別のディレクトリにコピーします。
cd ~/esp cp -r $IDF_PATH/examples/wifi/getting_started/station. - 開発ボードに接続します。
- USBドライバをインストールします。 詳細については、「ESP32でシリアル接続を確立する」をご参照ください。
- デバイスのポート名を確認します。 デモのUSBポート名は
/dev/cu.SLAB_USBtoUARTです。
- プロジェクトを設定します。
idf.py menuconfigを実行してプロジェクトを設定します。 このデモでは、既定の設定は保持されます。 - プロジェクトをコンパイルしてフラッシュし、シリアルポートを監視します。
- ステーションプロジェクトパスに移動し、
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コードをアプリコードから切り離すことができます。
手順
- 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コンポーネントを設定する必要はありません。
- デモプログラムを移植します。
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デモが含まれています。
- プロジェクトをコンパイルしてフラッシュします。
- プロジェクトディレクトリで
idf.py menuconfigコマンドを実行します。[構成例]メニューを表示できます。 WiFi SSID、WiFiパスワード、および最大再試行(再接続の最大数を指定) パラメーターを変更し、変更を保存して終了します。idf.py buildコマンドを実行して、プロジェクトをコンパイルします。- コンパイルが成功したら、
idf.py -p /dev/cu.SLAB_USBtoUART flash monitorコマンドを実行して、プロジェクトをフラッシュし、シリアルポートを監視します。
- プロジェクトディレクトリで
- ログを表示します。
...... 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"} ハートビート応答 ハートビート応答 ハートビート応答 ......