Este tema describe cómo portar C-SDK 4.0 a una placa de desarrollo ESP32 y utilizar la demostración MQTT para conectarse a Alibaba Cloud IoT Platform.
Este tutorial abarca los siguientes pasos:
Configure el entorno de desarrollo ESP-IDF en macOS o Linux.
Agregue C-SDK 4.0 como un componente personalizado de ESP-IDF.
Reemplace el archivo de entrada de la demostración y resuelva el conflicto de mbedTLS.
-
Compile, programe y verifique la conexión MQTT con IoT Platform.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una placa de desarrollo ESP32 (este tutorial utiliza una ESP32 Core Board V2/ESP32 DevKitC con un módulo ESP-WROOM-32 integrado, un módulo USB a serial CP2102 y un módulo de alimentación).
Un cable USB.
Una computadora con Linux o macOS.
Además, cree un producto y un dispositivo en IoT Platform antes de comenzar:
Inicie sesión en la consola de IoT Platform y cree un producto.
-
Cree un dispositivo bajo el producto y anote ProductKey, DeviceName y DeviceSecret. Estas credenciales son necesarias al compilar el firmware.
NotaEste tutorial utiliza macOS como entorno de desarrollo. Si usa un sistema operativo diferente, consulte la getting started tutorial oficial de ESP32 para configurar su entorno de desarrollo.
Configuración del entorno de desarrollo
NotaEsta sección es solo de referencia. Si encuentra problemas, contacte al proveedor de su placa de desarrollo para obtener ayuda. Para acelerar el proceso de configuración, consulte la official getting started tutorial de Espressif.
-
Instale los paquetes obligatorios.
En macOS, use Homebrew para instalar
pip,ninjaycmake. Consulte Standard Setup of Toolchain for Mac OS para más detalles.En Linux, consulte Standard Setup of Toolchain for Linux.
-
Clone el repositorio
esp-idf.Este tutorial utiliza la rama release/v4.2. Otras versiones pueden causar problemas de compatibilidad.
cd ~ mkdir esp && cd esp git clone --recursive -b release/v4.2 https://github.com/espressif/esp-idf.git -
Instale la cadena de herramientas y las utilidades de compilación.
cd esp-idf ./install.sh -
Configure las variables de entorno.
-
Ejecute el script de exportación:
. $HOME/esp/esp-idf/export.sh -
Para evitar ejecutar este script cada vez, agregue la siguiente función a
$HOME/.bash_profile:set_esp32 () { export IDF_PATH=$HOME/esp/esp-idf . $HOME/esp/esp-idf/export.sh }
-
-
Copie el ejemplo de estación Wi-Fi a un directorio de trabajo.
cd ~/esp cp -r $IDF_PATH/examples/wifi/getting_started/station . -
Conecte la placa de desarrollo.
Instale el controlador USB. Consulte Establish Serial Connection with ESP32 para más detalles.
Identifique el nombre del puerto USB. En este tutorial, el puerto es
/dev/cu.SLAB_USBtoUART.
-
Configure el proyecto.
Ejecute
idf.py menuconfigy utilice la configuración predeterminada. -
Compile, programe y monitoree.
En el directorio del proyecto station, ejecute
idf.py buildpara compilar.Una vez finalizada la compilación, ejecute
idf.py -p PORT flashpara programar el firmware. Reemplace PORT con el nombre real de su puerto USB.Después de programar el firmware, ejecute
idf.py -p PORT monitorpara abrir el monitor de puerto serial.También puede ejecutar
idf.py -p PORT flash monitorpara programar y monitorear con un solo comando.
El entorno de desarrollo ESP32 ya está configurado y se ha verificado que el ejemplo
wifi stationcompila y se ejecuta correctamente. Las siguientes secciones explican cómo portar C-SDK 4.0 y conectarse a IoT Platform.
Portar C-SDK 4.0
Portar C-SDK 4.0 implica tres tareas: agregar el SDK como componente idf, reemplazar el archivo de adaptación para ESP32 y resolver el conflicto de la biblioteca mbedTLS.
El directorio
portfilesen C-SDK ya contiene el archivo de adaptación para ESP32, por lo que la portabilidad consiste principalmente en importar el código fuente del SDK y configurar el sistema de compilación.Conceptos clave
Consulte la build system introduction de ESP-IDF para obtener contexto. Dos conceptos son fundamentales en este tutorial:
project: La carpeta que contiene los archivos fuente y de configuración para compilar la
app.components: Unidades de código reutilizables y autónomas que se compilan en bibliotecas estáticas
.ay se vinculan a laapp. Los componentes personalizados se colocan en el directoriocomponentsdeidf.
El sistema de compilación de ESP-IDF utiliza CMake y ninja. Para integrar C-SDK, mueva su código fuente al directorio de componentes y agregue un archivo
CMakeLists.txt.Métodos de portabilidad
Método 1: Importe C-SDK al directorio
project. Compile el código fuente del SDK junto con el resto del código fuente de suapp.Método 2: Importe C-SDK como un componente idf personalizado en el directorio
componentsdeidf.
Este tutorial utiliza el Método 2. Usar C-SDK como componente independiente facilita su reutilización en varios proyectos y lo mantiene desacoplado del código de su aplicación.
La siguiente tabla muestra los directorios relevantes de C-SDK:
Directorio
Contenido
core/Archivos fuente y encabezados principales del SDK
core/sysdep/Abstracciones de dependencias del sistema (incluye
core_adapter.c)core/utils/Funciones de utilidad
portfiles/aiot_port/Archivos de adaptación específicos de plataforma, incluido
posix_port.cadaptado para ESP32external/Bibliotecas de terceros incluidas con el SDK
Procedimiento de portabilidad
-
Agregue C-SDK como componente personalizado.
Download C-SDK 4.0 y cópielo a
$IDF_PATH/components. En el directorio raíz de C-SDK, cree un archivoCMakeLists.txtcon el siguiente contenido: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)NotaC-SDK depende de la biblioteca mbedTLS.
REQUIRES mbedtlsdeclara esta dependencia del componente.C-SDK no tiene elementos de configuración Kconfig. No se requiere configuración Kconfig para el componente.
Para usar funciones avanzadas del SDK, como el modelo Thing Specification Language (TSL) o actualizaciones Over-the-Air (OTA), agregue las rutas correspondientes de archivos fuente y de encabezado a este
CMakeLists.txt.
-
Reemplace el archivo de adaptación y deshabilite el conflicto de mbedTLS.
Descargue posix_port.c, que ha sido adaptado para ESP32. Reemplace
$IDF_PATH/components/C-SDK/portfiles/aiot_port/posix_port.ccon este archivo.Tanto LinkSDK como ESP-IDF incluyen la biblioteca mbedTLS. Para evitar conflictos de símbolos durante la vinculación, abra
$IDF_PATH/components/C-SDK/core/sysdep/core_adapter.cy deshabilite la macroCORE_ADAPTER_MBEDTLS_ENABLED. -
Reemplace el archivo de entrada de la demostración.
Descargue station_example_main.c y reemplace
station/main/station_example_main.cen su ejemplo de estación.Notawifi_init_sta()reintenta la conexión Wi-Fi hasta alcanzar el límite definido por la macroEXAMPLE_ESP_MAXIMUM_RETRY.Una vez establecida la conexión Wi-Fi, la demostración llama a la API de C-SDK para abrir una conexión MQTT. Al conectarse, el dispositivo puede intercambiar datos con IoT Platform.
linkkit_main()contiene la lógica original de la demostración MQTT de C-SDK.
-
Compile y programe.
En el directorio del proyecto, ejecute
idf.py menuconfigy abra el menúExample Configuration.Establezca
WiFi SSID,WiFi PasswordyMaximum retry, luego guarde y salga.Ejecute
idf.py buildpara compilar.Si la compilación es exitosa, ejecute
idf.py -p /dev/cu.SLAB_USBtoUART flash monitorpara programar el firmware y abrir el monitor de puerto serial.
NotaSi el dispositivo utiliza intercambio de claves Pre-Shared Key (PSK), habilite la compatibilidad con PSK en mbedTLS y establezca la longitud máxima de PSK en 64:
En
idf.py menuconfig, vaya a Component config > mbedTLS >TLS Key Exchange Methods.Habilite
Enable pre-shared-key ciphersuites.En el
CMakeLists.txtdel componente mbedTLS, agregueset(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMBEDTLS_PSK_MAX_LEN=64").
-
Verifique la conexión.
Una conexión exitosa genera una salida similar a la siguiente:
...... 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 ......Busque
MQTT connect successyAIOT_MQTTEVT_CONNECTen la salida. Las líneas recurrentes deheartbeat responseconfirman que la conexión MQTT se mantiene activa.ImportanteSi observa el error
aiot_mqtt_connect failed: -0x0F0F, se trata de un problema de conectividad de red. Compruebe el estado de su red Wi-Fi y asegúrese de que la placa esté dentro del alcance del punto de acceso. Si es necesario, vuelva a programar el firmware e inténtelo de nuevo.El código de error
-0x0F0Fcorresponde aSTATE_PORT_NETWORK_CONNECT_TIMEOUT, lo que indica que el intento de conexión agotó el tiempo de espera.
Solución de problemas
La conexión MQTT falla con aiot_mqtt_connect failed: -0x0F0F
El código de error -0x0F0F corresponde a STATE_PORT_NETWORK_CONNECT_TIMEOUT, lo que significa que la placa no pudo comunicarse con el servidor de IoT Platform dentro del período de tiempo de espera. Compruebe lo siguiente:
Confirme que la placa esté dentro del alcance de la señal Wi-Fi y conectada al SSID correcto.
Verifique los valores de WiFi SSID y WiFi Password que ingresó en
idf.py menuconfig.Si el problema persiste, vuelva a programar el firmware e inténtelo de nuevo.
La compilación falla con símbolos duplicados de mbedTLS
Tanto LinkSDK como ESP-IDF incluyen mbedTLS. Si observa errores del vinculador sobre símbolos duplicados, asegúrese de haber deshabilitado CORE_ADAPTER_MBEDTLS_ENABLED en core_adapter.c como se describe en el paso 2 del procedimiento de portabilidad.
El dispositivo se reinicia continuamente después de la programación
Intente borrar la memoria flash antes de volver a programar:
idf.py -p PORT erase_flash
idf.py -p PORT flash monitor
Puerto serial no reconocido en macOS
Asegúrese de que el controlador USB CP2102 esté instalado. Consulte Establish Serial Connection with ESP32 para obtener instrucciones sobre la instalación del controlador.