Cette rubrique explique comment porter le C-SDK 4.0 sur une carte de développement ESP32 et utiliser la démonstration MQTT pour se connecter à Alibaba Cloud IoT Platform.
Ce tutoriel couvre les étapes suivantes :
Configurez l'environnement de développement ESP-IDF sous macOS ou Linux.
Ajoutez le C-SDK 4.0 en tant que composant ESP-IDF personnalisé.
Remplacez le fichier d'entrée de la démonstration et résolvez le conflit mbedTLS.
-
Compilez, flashez et vérifiez la connexion MQTT à IoT Platform.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une carte de développement ESP32 (ce tutoriel utilise une ESP32 Core Board V2/ESP32 DevKitC avec un module ESP-WROOM-32 intégré, un module USB-série CP2102 et un module d'alimentation).
Un câble USB.
Un ordinateur fonctionnant sous Linux ou macOS.
Créez également un produit et un dispositif dans IoT Platform avant de démarrer :
Connectez-vous à la console IoT Platform et créez un produit.
-
Créez un dispositif sous le produit et notez les valeurs ProductKey, DeviceName et DeviceSecret. Vous aurez besoin de ces identifiants lors de la compilation du micrologiciel.
RemarqueCe tutoriel utilise macOS comme environnement de développement. Si vous utilisez un autre système d'exploitation, consultez le tutoriel de démarrage officiel ESP32 pour configurer votre environnement de développement.
Configuration de l'environnement de développement
RemarqueCette section est fournie à titre de référence uniquement. En cas de problème, contactez le fournisseur de votre carte de développement pour obtenir de l'aide. Pour accélérer le processus de configuration, consultez le tutoriel de démarrage officiel d'Espressif.
-
Installez les packages requis.
Sous macOS, utilisez Homebrew pour installer
pip,ninjaetcmake. Consultez la page Standard Setup of Toolchain for Mac OS pour plus de détails.Sous Linux, consultez la page Standard Setup of Toolchain for Linux.
-
Clonez le dépôt
esp-idf.Ce tutoriel utilise la branche release/v4.2. D'autres versions peuvent entraîner des problèmes de compatibilité.
cd ~ mkdir esp && cd esp git clone --recursive -b release/v4.2 https://github.com/espressif/esp-idf.git -
Installez la chaîne d'outils et les outils de compilation.
cd esp-idf ./install.sh -
Configurez les variables d'environnement.
-
Exécutez le script d'exportation :
. $HOME/esp/esp-idf/export.sh -
Pour éviter d'exécuter ce script à chaque fois, ajoutez la fonction suivante au fichier
$HOME/.bash_profile:set_esp32 () { export IDF_PATH=$HOME/esp/esp-idf . $HOME/esp/esp-idf/export.sh }
-
-
Copiez l'exemple de station Wi-Fi dans un répertoire de travail.
cd ~/esp cp -r $IDF_PATH/examples/wifi/getting_started/station . -
Connectez la carte de développement.
Installez le pilote USB. Consultez la page Establish Serial Connection with ESP32 pour plus de détails.
Identifiez le nom du port USB. Dans ce tutoriel, le port est
/dev/cu.SLAB_USBtoUART.
-
Configurez le projet.
Exécutez
idf.py menuconfiget utilisez la configuration par défaut. -
Compilez, flashez et surveillez l'exécution.
Dans le répertoire du projet station, exécutez
idf.py buildpour compiler.Une fois la compilation terminée, exécutez
idf.py -p PORT flashpour flasher le micrologiciel. Remplacez PORT par le nom réel de votre port USB.Après le flashage du micrologiciel, exécutez
idf.py -p PORT monitorpour ouvrir le moniteur de port série.Vous pouvez également exécuter
idf.py -p PORT flash monitorpour flasher et lancer la surveillance en une seule commande.
L'environnement de développement ESP32 est désormais configuré et vous avez vérifié que l'exemple
wifi stationse compile et s'exécute correctement. Les sections suivantes expliquent comment porter le C-SDK 4.0 et se connecter à IoT Platform.
Portage du C-SDK 4.0
Le portage du C-SDK 4.0 implique trois tâches : ajouter le SDK en tant que composant idf, remplacer le fichier de port adapté à l'ESP32 et résoudre le conflit de bibliothèque mbedTLS.
Le répertoire
portfilesdu C-SDK contient déjà le fichier de port pour l'ESP32 ; le portage consiste donc principalement à importer le code source du SDK et à configurer le système de build.Concepts clés
Consultez l'introduction au système de build ESP-IDF pour acquérir les bases nécessaires. Deux concepts sont essentiels pour ce tutoriel :
project : dossier contenant les fichiers source et de configuration pour la construction de l'
app.components : unités de code réutilisables et autonomes, compilées en bibliothèques statiques
.aet liées à l'app. Les composants personnalisés sont placés dans le répertoirecomponentsde l'idf.
Le système de build ESP-IDF utilise CMake et ninja. Pour intégrer le C-SDK, déplacez son code source dans le répertoire des composants et ajoutez un fichier
CMakeLists.txt.Méthodes de portage
Méthode 1 : Importez le C-SDK dans le répertoire
project. Compilez le code source du SDK conjointement avec les autres sources de votreapp.Méthode 2 : Importez le C-SDK en tant que composant idf personnalisé dans le répertoire
componentsde l'idf.
Ce tutoriel utilise la méthode 2. L'utilisation du C-SDK en tant que composant indépendant facilite sa réutilisation dans plusieurs projets et maintient un découplage avec le code de votre application.
Le tableau suivant présente les répertoires pertinents du C-SDK :
Répertoire
Contenu
core/Fichiers source et en-têtes principaux du SDK
core/sysdep/Abstractions des dépendances système (inclut
core_adapter.c)core/utils/Fonctions utilitaires
portfiles/aiot_port/Fichiers de port spécifiques à la plateforme, y compris le fichier
posix_port.cadapté à l'ESP32external/Bibliothèques tierces incluses avec le SDK
Procédure de portage
-
Ajoutez le C-SDK en tant que composant personnalisé.
Téléchargez le C-SDK 4.0 et copiez-le dans
$IDF_PATH/components. Dans le répertoire racine du C-SDK, créez un fichierCMakeLists.txtavec le contenu suivant :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)RemarqueLe C-SDK dépend de la bibliothèque mbedTLS. La directive
REQUIRES mbedtlsdéclare cette dépendance de composant.Le C-SDK ne possède aucun élément de configuration Kconfig. Aucune configuration Kconfig de composant n'est nécessaire.
Pour utiliser des fonctionnalités avancées du SDK telles que le modèle TSL (Thing Specification Language) ou les mises à jour OTA (Over-the-Air), ajoutez les chemins des fichiers source et d'en-tête correspondants à ce fichier
CMakeLists.txt.
-
Remplacez le fichier de port et désactivez le conflit mbedTLS.
Téléchargez le fichier posix_port.c, qui a été adapté pour l'ESP32. Remplacez le fichier
$IDF_PATH/components/C-SDK/portfiles/aiot_port/posix_port.cpar ce fichier.LinkSDK et ESP-IDF incluent tous deux la bibliothèque mbedTLS. Pour éviter les conflits de symboles lors de l'édition des liens, ouvrez le fichier
$IDF_PATH/components/C-SDK/core/sysdep/core_adapter.cet désactivez la macroCORE_ADAPTER_MBEDTLS_ENABLED. -
Remplacez le fichier d'entrée de la démonstration.
Téléchargez le fichier station_example_main.c et remplacez le fichier
station/main/station_example_main.cdans votre exemple de station.RemarqueLa fonction
wifi_init_sta()tente de se reconnecter au Wi-Fi jusqu'à atteindre la limite définie par la macroEXAMPLE_ESP_MAXIMUM_RETRY.Une fois la connexion Wi-Fi établie, la démonstration appelle l'API du C-SDK pour ouvrir une connexion MQTT. Une fois connecté, le dispositif peut échanger des données avec IoT Platform.
La fonction
linkkit_main()contient la logique originale de la démonstration MQTT du C-SDK.
-
Compilez et flashez.
Dans le répertoire du projet, exécutez
idf.py menuconfiget ouvrez le menuExample Configuration.Définissez les valeurs
WiFi SSID,WiFi PasswordetMaximum retry, puis enregistrez et quittez.Exécutez
idf.py buildpour compiler.Une fois la compilation réussie, exécutez
idf.py -p /dev/cu.SLAB_USBtoUART flash monitorpour flasher le micrologiciel et ouvrir le moniteur de port série.
RemarqueSi le dispositif utilise l'échange de clés Pre-Shared Key (PSK), activez la prise en charge PSK dans mbedTLS et définissez la longueur maximale PSK sur 64 :
Dans
idf.py menuconfig, accédez à Component config > mbedTLS >TLS Key Exchange Methods.Activez l'option
Enable pre-shared-key ciphersuites.Dans le fichier
CMakeLists.txtdu composant mbedTLS, ajoutez la ligneset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMBEDTLS_PSK_MAX_LEN=64").
-
Vérifiez la connexion.
Une connexion réussie génère une sortie similaire à la suivante :
...... 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 ......Recherchez les messages
MQTT connect successetAIOT_MQTTEVT_CONNECTdans la sortie. La présence récurrente de lignesheartbeat responseconfirme que la connexion MQTT est maintenue.ImportantSi vous rencontrez l'erreur
aiot_mqtt_connect failed: -0x0F0F, il s'agit d'un problème de connectivité réseau. Vérifiez l'état de votre réseau Wi-Fi et assurez-vous que la carte se trouve à portée du point d'accès. Si nécessaire, reflashez le micrologiciel et réessayez.Le code d'erreur
-0x0F0Fcorrespond àSTATE_PORT_NETWORK_CONNECT_TIMEOUT, indiquant que la tentative de connexion a expiré.
Dépannage
Échec de la connexion MQTT avec l'erreur aiot_mqtt_connect failed: -0x0F0F
Le code d'erreur -0x0F0F correspond à STATE_PORT_NETWORK_CONNECT_TIMEOUT, ce qui signifie que la carte n'a pas pu atteindre le serveur IoT Platform dans le délai imparti. Vérifiez les points suivants :
Confirmez que la carte se trouve dans la zone de couverture du signal Wi-Fi et qu'elle est connectée au bon SSID.
Vérifiez les valeurs WiFi SSID et WiFi Password saisies dans
idf.py menuconfig.Si le problème persiste, reflashez le micrologiciel et réessayez.
Échec de la compilation avec des symboles mbedTLS en double
LinkSDK et ESP-IDF incluent tous deux mbedTLS. Si vous observez des erreurs de l'éditeur de liens concernant des symboles dupliqués, assurez-vous d'avoir désactivé CORE_ADAPTER_MBEDTLS_ENABLED dans le fichier core_adapter.c comme décrit à l'étape 2 de la procédure de portage.
Redémarrages continus du dispositif après le flashage
Essayez d'effacer la mémoire flash avant de reflasher :
idf.py -p PORT erase_flash
idf.py -p PORT flash monitor
Port série non reconnu sous macOS
Assurez-vous que le pilote USB CP2102 est installé. Consultez la page Establish Serial Connection with ESP32 pour obtenir les instructions d'installation du pilote.