Topik ini menjelaskan cara mem-porting SDK untuk C 4.0 ke papan pengembangan ESP32 dan menggunakan demo Message Queuing Telemetry Transport (MQTT) untuk terhubung ke Alibaba Cloud IoT Platform.
Lingkungan Pengembangan
Untuk mem-porting SDK, Anda perlu menyiapkan item berikut:
Papan pengembangan ESP32.
Kabel USB.
Komputer yang menjalankan Windows, Linux, atau macOS.
Papan pengembangan yang digunakan dalam demo ini adalah ESP32 Core Board V2/ESP32 DevKitC, yang dilengkapi dengan modul resmi ESP-WROOM-322, modul onboard USB-to-serial CP2102, dan modul catu daya.
Dalam demo ini, kami menggunakan macOS untuk menyiapkan lingkungan pengembangan. Untuk informasi lebih lanjut tentang cara menyiapkan lingkungan pengembangan di sistem operasi lainnya, lihat Memulai.
Menyiapkan Lingkungan Pengembangan
Kami sarankan Anda membaca Memulai terlebih dahulu untuk mempercepat penyiapan lingkungan pengembangan.
Ikuti langkah-langkah berikut untuk menyiapkan lingkungan macOS:
Instal perangkat lunak yang diperlukan.
Untuk menginstal perangkat lunak yang diperlukan, pengguna macOS dapat melihat Pengaturan Standar Toolchain untuk Mac OS. Kami sarankan Anda menggunakan alat manajemen paket Homebrew. Paket yang diperlukan termasuk pip, Ninja, dan CMake.
Untuk menginstal perangkat lunak yang diperlukan, pengguna Windows dapat melihat Pengaturan Standar Toolchain untuk Windows.
Untuk menginstal perangkat lunak yang diperlukan, pengguna Linux dapat melihat Pengaturan Standar Toolchain untuk Linux.
Klon repositori resmi ESP-IDF.
Demo ini menggunakan cabang
release/v4.2dari repositori Espressif IoT Development Framework (ESP-IDF).cd ~ mkdir esp && cd esp git clone --recursive -b release/v4.2 https://github.com/espressif/esp-idf.gitInstal toolchain dan alat kompilasi.
cd esp-idf ./install.shKonfigurasikan variabel lingkungan.
Jalankan skrip berikut:
. $HOME/esp/esp-idf/export.shAtau, jalankan skrip berikut untuk menambahkan konfigurasi semua variabel lingkungan ke file
$HOME/.bash_profile:set_esp32 () { export IDF_PATH=$HOME/esp/esp-idf . $HOME/esp/esp-idf/export.sh }
Salin demo stasiun wifi ke direktori terpisah.
cd ~/esp cp -r $IDF_PATH/examples/wifi/getting_started/station .Sambungkan ke papan pengembangan.
Instal driver USB. Untuk informasi lebih lanjut, lihat Membuat Koneksi Serial dengan ESP32.
Periksa nama port perangkat. Nama port USB dalam demo ini adalah
/dev/cu.SLAB_USBtoUART.
Konfigurasikan proyek.
Jalankan
idf.py menuconfiguntuk mengkonfigurasi proyek. Dalam demo ini, konfigurasi default dipertahankan.Kompilasi dan flash proyek, serta pantau port serial.
Pergi ke jalur proyek station dan jalankan
idf.py builduntuk mengkompilasi proyek.Setelah kompilasi selesai, jalankan perintah
idf.py -p PORT flashuntuk mem-flash firmware. Ganti PORT dengan nama port USB aktual.Setelah flashing selesai, jalankan perintah
idf.py -p PORT monitoruntuk memantau port serial.Anda juga dapat menjalankan perintah
idf.py -p PORT flash monitoruntuk mem-flash firmware dan memantau informasi yang dicetak pada port serial.
Sekarang, Anda telah menyiapkan lingkungan pengembangan ESP32 dan mengkompilasi serta mem-flash demo stasiun wifi. Bagian berikutnya menjelaskan cara mem-porting SDK untuk C 4.0 dan menghubungkannya ke Alibaba Cloud IoT Platform.
Porting SDK untuk C 4.0
Proses mem-porting SDK untuk C 4.0 mencakup impor kode SDK dan konfigurasi file port SDK serta sistem kompilasi.
Direktori portfiles dari SDK berisi file portfile untuk ESP32. Oleh karena itu, Anda hanya perlu mengimpor kode sumber SDK dan mengkonfigurasi sistem kompilasi untuk menyelesaikan porting.
Istilah
Kami sarankan Anda membaca Sistem Pembangunan dari IoT Development Framework (IDF) untuk mempelajari proses porting. Anda harus memahami istilah berikut tentang IDF:
project: Ini adalah direktori yang hanya berisi semua file sumber dan file konfigurasi yang digunakan untuk membangun aplikasi.
components: Mereka adalah bagian modular dari kode mandiri, yang dikompilasi menjadi pustaka statis .a dan ditautkan ke aplikasi. Komponen modular ini disimpan di direktori komponen IDF. Anda dapat menambahkan komponen kustom.
Secara default, sistem kompilasi IDF menggunakan Ninja dan CMake bersama-sama. Anda hanya perlu mengimpor kode SDK dan menulis file CMakeList.txt yang sesuai untuk mengkompilasi SDK.
Metode Porting
Metode 1: Impor SDK untuk C ke direktori proyek dan kompilasi kode sumber SDK dengan kode sumber aplikasi Anda.
Metode 2: Perkenalkan SDK untuk C ke direktori komponen IDF sebagai komponen IDF kustom.
Kami sarankan Anda menggunakan metode kedua. Menggunakan SDK untuk C sebagai komponen terpisah membantu Anda menggunakan kembali SDK di berbagai proyek dan memisahkan kode SDK dari kode aplikasi Anda.
Prosedur
Tambahkan SDK untuk C sebagai komponen kustom.
Unduh SDK untuk C 4.0, salin SDK ke direktori
$IDF_PATH/components, dan tambahkan file CMakeLists.txt berikut ke direktori SDK untuk C:set(include_dirs core core/sysdep core/utils) file(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}" REQUIRES mbedtls)nullFile esp32_port.c adalah file porting SDK untuk ESP32.
SDK untuk C bergantung pada pustaka mbedtls. Oleh karena itu,
REQUIRES mbedtlsharus digunakan untuk memperkenalkan dependensi komponen.SDK untuk C tidak memiliki item konfigurasi. Oleh karena itu, Anda tidak perlu mengkonfigurasi komponen Kconfig.
Porting program demo.
IDF kompatibel dengan standar Portable Operating System Interface (POSIX). Oleh karena itu, Anda hanya perlu menyalin isi file
LinkSDK/core/demos/mqtt_basic_demo.cke filestation/main/station_example_main.cdan memodifikasinya sedikit.Anda dapat mengunduh file demo.c yang telah dimodifikasi untuk menggantikan file station_example_main.c asli.
nullFungsi
wifi_init_sta()menunggu koneksi Wi-Fi hingga jumlah rekoneksi mencapai nilai yang ditentukan olehEXAMPLE_ESP_MAXIMUM_RETRY.Setelah koneksi Wi-Fi berhasil, Anda dapat memanggil operasi API dari SDK untuk C untuk membuat koneksi MQTT. Setelah koneksi MQTT berhasil, data dapat ditransmisikan antara perangkat dan IoT Platform.
Fungsi
linkkit_main()berisi demo MQTT dari SDK untuk C asli.
Kompilasi dan flash proyek.
Jalankan perintah
idf.py menuconfigdi direktori proyek. Anda dapat melihat menuExample Configuration.Modifikasi parameter
WiFi SSID,WiFi Password, danMaximum retry(menentukan jumlah maksimum rekoneksi), simpan modifikasi, dan keluar.Jalankan perintah
idf.py builduntuk mengkompilasi proyek.Setelah kompilasi berhasil, jalankan perintah
idf.py -p /dev/cu.SLAB_USBtoUART flash monitoruntuk mem-flash proyek dan memantau port serial.
Lihat log.
...... I (829) phy: phy_version: 4180, cb3948e, Sep 12 2019, 16:39:13, 0, 0 I (829) wifi: mode : sta (30:ae:a4:04:81:84) I (829) wifi station: wifi_init_sta finished. I (949) wifi: new:<11,0>, old:<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: connected with C_SDK_Test, aid = 1, channel 11, BW20, bssid = ec:26:ca:4b:68:cc I (1129) wifi: security type: 3, phy: bgn, rssi: -37 I (1139) wifi: pm start, type: 1 I (1219) wifi: AP's beacon interval = 102400 us, DTIM period = 1 I (2129) esp_netif_handlers: sta ip: 192.168.0.100, mask: 255.255.255.0, gw: 192.168.0.1 I (2129) wifi station: got ip:192.168.0.100 I (2129) wifi station: connected to ap SSID:C_SDK_Test password:1234abcd I (2139) wifi station: Start linkkit mqtt [1.583][LK-0313] MQTT user calls 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,| establish mbedtls connection with server(host='a13FN5TplKq.iot-as-mqtt.cn-shanghai.aliyuncs.com', port=[443]) success to establish mbedtls connection, fd = 54(cost 29739 bytes in total, max used 44007 bytes) [3.493][LK-0313] MQTT connect success in 1910 ms AIOT_MQTTEVT_CONNECT [3.494][LK-0309] sub: /sys/a13FN5TplKq/mqtt_basic_demo/thing/event/+/post_reply [3.499][LK-0309] pub: /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"} heartbeat response heartbeat response heartbeat response ......