Todos los productos
Search
Centro de documentos

:Integrar el SDK en módulos compatibles con MQTT

Última actualización: Sep 17, 2026

Descripción del escenario

Link SDK es un kit de desarrollo de software (SDK) para dispositivos de Alibaba Cloud IoT Platform que conecta los dispositivos a la plataforma. Se encarga de funciones como la autenticación de dispositivos y la comunicación de datos. Integrar Link SDK en un módulo de comunicación ofrece las siguientes ventajas:

  • Los fabricantes de dispositivos pueden conectarse a Alibaba Cloud IoT Platform mediante los comandos AT que proporciona el módulo, en lugar de gestionar la conexión desde la unidad de microcontrolador (MCU). Este método evita aumentar el consumo de recursos de la MCU.

  • Alibaba Cloud publica modelos de módulos certificados, enlaces de compra y guías de desarrollo en su página de socios certificados. Esto facilita que los fabricantes de dispositivos y los proveedores de servicios (SP) adquieran módulos de comunicación certificados para conectarse a Alibaba Cloud IoT Platform.

A continuación se muestra cómo desarrollar un dispositivo con un módulo que tiene el SDK integrado.

El flujo de desarrollo para los fabricantes de dispositivos es el siguiente:

  • Adquiera un módulo que tenga integrado Alibaba Cloud Link SDK.

  • Utilice los comandos AT del módulo en la MCU para conectarse a Alibaba Cloud y para enviar y recibir datos desde Alibaba Cloud IoT Platform.

  • Despliegue servicios en la nube en Alibaba Cloud IoT Platform para gestionar el dispositivo.

Los fabricantes de módulos deben completar las siguientes tareas en el módulo:

  • Integre correctamente Link SDK en el módulo.

  • Proporcione comandos AT que la MCU pueda invocar para conectarse a Alibaba Cloud IoT Platform.

Objetivo del documento

Este tema explica cómo integrar Link SDK en un módulo que ya admite el protocolo Message Queuing Telemetry Transport (MQTT). Así, los fabricantes de módulos comprenden el proceso general de integración del SDK. Para simplificar el proceso, este tema solo describe cómo integrar el módulo de firma de dispositivo de Link SDK. De esta manera, el módulo puede conectarse a Alibaba Cloud IoT Platform.

Dado que el módulo ya admite el protocolo MQTT, el SDK utiliza los módulos funcionales de MQTT existentes en él. Link SDK proporciona una API para generar el ClientID, UserName, Password y otra información obligatoria para conectarse al broker de MQTT de Alibaba Cloud IoT Platform. Después, el fabricante del módulo usa estos datos para establecer la conexión con el broker de Alibaba Cloud IoT Platform. Esto permite que el módulo se suscriba a temas de MQTT o envíe datos a temas específicos.

Crear un producto Basic Edition en Alibaba Cloud IoT Platform

Cuando depure el módulo, cree un producto y un dispositivo de prueba para comprobar que el SDK funciona correctamente. Siga estos pasos para crear un dispositivo:

  1. Inicie sesión en la consola de Alibaba Cloud IoT Platform. Es necesario registrar una cuenta de Alibaba Cloud. El registro es gratuito.

  2. Cree un dispositivo de prueba. Puede obtener el device_name y el device_secret del dispositivo en la página del dispositivo.

En la siguiente sección se describe el proceso de desarrollo para integrar el SDK en un módulo.

Proceso de desarrollo de la integración del SDK

Cuando integre el SDK, siga el proceso de desarrollo que se muestra a continuación:

Configuración y extracción de código del SDK

El SDK incluye muchas funciones. Para evitar que consuma demasiada memoria RAM y memoria flash, proporciona herramientas de configuración y extracción. Estas herramientas permiten a los desarrolladores usar únicamente los componentes que necesitan.

Configurar el SDK

A continuación se explica cómo configurar las funciones de software obligatorias.

Ejecutar el comando de configuración

  • Linux

Vaya al directorio raíz del SDK y ejecute el siguiente comando:

make menuconfig
            
  • Sistema operativo Windows

Ejecute config.bat en el directorio raíz del SDK.

config.bat
            

Ambos métodos inician la herramienta de configuración del SDK. La interfaz se muestra de la siguiente manera:

Nota:

  • Un asterisco ()* junto a una opción de función indica que la función está habilitada. Si no hay asterisco, significa que la función está deshabilitada.

  • La tabla muestra las opciones configurables. Las funciones principales del SDK permanecen activas incluso si usted deshabilita todas las opciones configurables.

  • Presione la barra espaciadora para seleccionar o anular la selección de una función. Use las teclas de flecha hacia arriba y hacia abajo del teclado para cambiar entre funciones.

  • Para conocer más sobre una opción, use las teclas de flecha para mover la barra de resaltado hasta esa opción y presione la tecla 'h' del teclado. Aparecerá un texto de ayuda que explica la opción y los efectos de habilitarla o deshabilitarla.

Para este escenario:

  • Si el entorno de desarrollo admite stdint.h, habilite PLATFORM_HAS_STDINT.

  • Si el entorno de desarrollo admite malloc/free, habilite PLATFORM_HAS_DYNMEM.

  • Si el entorno de ejecución tiene un sistema operativo, habilite PLATFORM_HAS_OS.

Deshabilite todas las demás opciones. Una vez que termine la configuración, seleccione el botón 'Exit' y guarde la configuración cuando el sistema lo solicite.

Extraer el código del SDK

A continuación se explica cómo extraer el código del SDK.

Ejecutar el comando de extracción

  • Linux

Vaya al directorio raíz del SDK y ejecute el siguiente comando:

sh ./extract.sh
            
  • Sistema operativo Windows

Puede ejecutar config.bat en el directorio raíz del SDK.

extract.bat
            

Ambos métodos inician la herramienta de extracción de código del SDK. Esta herramienta extrae los archivos necesarios y los coloca en el directorio de salida, como se muestra en la siguiente imagen:

Agregar los archivos del SDK a su proyecto

Copie la carpeta eng del directorio de salida al directorio de su proyecto. Luego, agregue los archivos de código a su proyecto.

Los archivos que debe agregar están en los directorios eng/dev_sign, eng/infra y eng/wrappers. Durante la compilación, también debe especificar estos directorios en la ruta de búsqueda de archivos de encabezado.

Adaptación de HAL

Ninguna

Integrar Link SDK con su MQTT existente

Generar el ClientID, UserName y Password de MQTT

Cuando un cliente de MQTT se conecta a un broker de MQTT, debe especificar información como el ClientID, UserName y Password. Link SDK proporciona la API IOT_Sign_MQTT() para generar estos datos:

int32_t IOT_Sign_MQTT(iotx_mqtt_region_types_t region, iotx_dev_meta_info_t *meta, iotx_sign_mqtt_t *signout)
            

Nota: para usar esta función, debe incluir el archivo de encabezado dev_sign_internal.h:

#include "dev_sign_internal.h"
            

Descripciones de los parámetros de entrada

  • region

Especifica el sitio de Alibaba Cloud IoT Platform al que desea conectarse. Los valores disponibles se definen en el archivo eng/infra/infra_defs.h:

typedef enum {
    IOTX_CLOUD_REGION_SHANGHAI,   /* Shanghai */
    IOTX_CLOUD_REGION_SINGAPORE,  /* Singapore */
    IOTX_CLOUD_REGION_JAPAN,      /* Japan */
    IOTX_CLOUD_REGION_USA_WEST,   /* America */
    IOTX_CLOUD_REGION_GERMANY,    /* Germany */
    IOTX_CLOUD_REGION_CUSTOM,     /* Custom setting */
    IOTX_CLOUD_DOMAIN_MAX         /* Maximum number of domain */
} iotx_mqtt_region_types_t;
            
  • Si el módulo se vende en China, establezca este parámetro en IOTX_CLOUD_REGION_SHANGHAI.

  • meta

Especifica las credenciales del dispositivo. La estructura de datos se define de la siguiente manera:

typedef struct {
    char product_key[IOTX_PRODUCT_KEY_LEN + 1];
    char product_secret[IOTX_PRODUCT_SECRET_LEN + 1];
    char device_name[IOTX_DEVICE_NAME_LEN + 1];
    char device_secret[IOTX_DEVICE_SECRET_LEN + 1];
} iotx_dev_meta_info_t;
            

El fabricante del dispositivo solicita estas cuatro variables para cada dispositivo después de definir el producto en Alibaba Cloud IoT Platform. En el desarrollo real de productos, estos parámetros deben pasarse de la MCU al módulo mediante comandos AT.

Descripciones de los parámetros de respuesta

  • signout

Este parámetro devuelve el ClientID, Username, Password y otra información obligatoria para conectarse al broker de MQTT. La estructura de datos se define de la siguiente manera:

typedef struct {
    char hostname[DEV_SIGN_HOSTNAME_MAXLEN];
    uint16_t port;
    char clientid[DEV_SIGN_CLIENT_ID_MAXLEN];
    char username[DEV_SIGN_USERNAME_MAXLEN];
    char password[DEV_SIGN_PASSWORD_MAXLEN];
} iotx_sign_mqtt_t;
            

En esta estructura, hostname es el nombre de dominio del broker de MQTT del sitio de Alibaba Cloud IoT Platform, y port es el número de puerto del broker de MQTT.

Descripción del valor de retorno

La función devuelve 0 si se ejecuta correctamente y -1 si falla.

Ejemplo de uso

El archivo eng/examples/dev_sign_example.c muestra cómo usar la función IOT_Sign_MQTT(). El siguiente fragmento presenta un ejemplo:

#define EXAMPLE_PRODUCT_KEY     "a1X2bEnP82z"
#define EXAMPLE_PRODUCT_SECRET  "7jluWm1zql7bt8qK"
#define EXAMPLE_DEVICE_NAME     "example1"
#define EXAMPLE_DEVICE_SECRET   "ga7XA6KdlEeiPXQPpRbAjOZXwG8ydgSe"

/* Implement this HAL or use "printf" of your own system if you want to print something in the example. */
void HAL_Printf(const char *fmt, ...);

int main(int argc, char *argv[])
{
    iotx_mqtt_region_types_t region = IOTX_CLOUD_REGION_SHANGHAI;
    iotx_dev_meta_info_t meta;
    iotx_sign_mqtt_t sign_mqtt;

    memset(&meta,0,sizeof(iotx_dev_meta_info_t));
    memcpy(meta.product_key,EXAMPLE_PRODUCT_KEY,strlen(EXAMPLE_PRODUCT_KEY));
    memcpy(meta.product_secret,EXAMPLE_PRODUCT_SECRET,strlen(EXAMPLE_PRODUCT_SECRET));
    memcpy(meta.device_name,EXAMPLE_DEVICE_NAME,strlen(EXAMPLE_DEVICE_NAME));
    memcpy(meta.device_secret,EXAMPLE_DEVICE_SECRET,strlen(EXAMPLE_DEVICE_SECRET));

    if (IOT_Sign_MQTT(region,&meta,&sign_mqtt) < 0) {
        return -1;
    }
    ...
}

            

En este ejemplo, el product_key, product_secret, device_name y device_secret del dispositivo usan valores fijos. En un entorno de ejecución de producción real, la MCU debe proporcionar estos valores al módulo.

Cuando depure el módulo, debe crear un producto y un dispositivo de prueba en Alibaba Cloud IoT Platform. Después, utilice el product_key, product_secret, device_name y device_secret que la plataforma genera para el dispositivo.

Cargar el código del proveedor del módulo y el modelo del módulo

Si desea enviar su módulo a Alibaba Cloud IoT para obtener la certificación, debe reportar el código de proveedor del módulo y el modelo del módulo. Esto permite que Alibaba Cloud IoT Platform registre la cantidad de dispositivos que se conectan a la plataforma con un proveedor y un modelo de módulo específicos.

Antes de integrar el SDK, comuníquese con Alibaba Cloud para obtener el código de proveedor del módulo y el modelo del módulo. Envíe un correo electrónico a linkcertification@list.alibaba-inc.com con el asunto 'Module/Chip Model Application'. Nota: si usted no es proveedor de módulos, no necesita solicitar un código.

Una vez que el módulo establezca la conexión con Alibaba Cloud IoT Platform, copie e invoque la siguiente función para reportar la información. El parámetro pid es el código del proveedor del módulo y el parámetro mid es el código del modelo:

#define PID_STRING_LEN_MAX          32  /* Maximum length of the PID string */
#define MID_STRING_LEN_MAX          32  /* Maximum length of the MID string */

int example_report_pid_mid(void *pclient, const char *product_key, const char *device_name, const char *pid, const char *mid)
{
    int res = 0;
    iotx_mqtt_topic_info_t topic_msg;

    const char topic_frag1[] = "/sys/";
    const char topic_frag2[] = "/thing/deviceinfo/update";
    char topic[sizeof(topic_frag1) + sizeof(topic_frag2) + IOTX_PRODUCT_KEY_LEN + IOTX_DEVICE_NAME_LEN] = {0};

    const char payload_frag1[] = "{\"id\":\"0\",\"version\":\"1.0\",\"params\":[{\"attrKey\":\"SYS_MODULE_ID\",\"attrValue\":\"";
    const char payload_frag2[] = "\",\"domain\":\"SYSTEM\"},{\"attrKey\":\"SYS_PARTNER_ID\",\"attrValue\":\"";
    const char payload_frag3[] = "\",\"domain\":\"SYSTEM\"}],\"method\": \"thing.deviceinfo.update\"}";
    char payload[sizeof(payload_frag1) + sizeof(payload_frag2) + sizeof(payload_frag3) + PID_STRING_LEN_MAX + MID_STRING_LEN_MAX] = {0};

    if (strlen(pid) > PID_STRING_LEN_MAX || strlen(mid) > MID_STRING_LEN_MAX) {
        return -1;
    }

    /* Assemble the MQTT topic string. */
    memcpy(topic, topic_frag1, strlen(topic_frag1));
    memcpy(topic + strlen(topic), product_key, strlen(product_key));
    memcpy(topic + strlen(topic), "/", 1);
    memcpy(topic + strlen(topic), device_name, strlen(device_name));
    memcpy(topic + strlen(topic), topic_frag2, strlen(topic_frag2));

    /* Assemble the MQTT payload string. The payload contains the PID and MID strings. */
    memcpy(payload, payload_frag1, strlen(payload_frag1));
    memcpy(payload + strlen(payload), mid, strlen(mid));
    memcpy(payload + strlen(payload), payload_frag2, strlen(payload_frag2));
    memcpy(payload + strlen(payload), pid, strlen(pid));
    memcpy(payload + strlen(payload), payload_frag3, strlen(payload_frag3));

    topic_msg.qos = IOTX_MQTT_QOS0;
    topic_msg.retain = 0;
    topic_msg.dup = 0;
    topic_msg.payload = (void *)payload;
    topic_msg.payload_len = strlen(payload);

    /* Use the MQTT publish API to send the message that contains the PID and MID. 
       Because you are using the module's built-in MQTT feature, replace the following publish function with your actual publish function during integration. */
    res = IOT_MQTT_Publish(pclient, topic, &topic_msg);
    if (res < 0) {
        return -1;
    }

    return 0;
}

            

Depuración

Conectar el módulo a Alibaba Cloud IoT Platform

Debe escribir una función para conectar el módulo a Alibaba Cloud IoT Platform. El componente de MQTT del módulo debería proporcionar una función para conectarse al broker de MQTT. En esta función, debe ingresar el nombre de dominio, el puerto, el ClientID, el nombre de usuario y la contraseña que se obtienen al invocar la API IOT_Sign_MQTT() de Link SDK.

El siguiente pseudocódigo es un ejemplo de integración del SDK con mosquitto, una biblioteca de MQTT de código abierto:

        // Call the signature function to get MQTT username, password, clientID, and other information.
        IOT_Sign_MQTT(region,&meta,&sign_mqtt);

        mosquitto_lib_init();

        // The following code sets the MQTT clientID and cleansession parameters.
        mosq = mosquitto_new(sign_mqtt.clientid,0/*dont clean session*/,NULL);
        if(mosq==NULL){
                printf("Error:Failed creating mosquitto client\n\r");
                return(-1);
        }
        // The following code sets the username and password for the MQTT connection.
        if(0 != mosquitto_username_pw_set(mosq, sign_mqtt.username, sign_mqtt.password)){
                printf("Error:Failed setting username or password\n\r");
                return(-1);
        }

        ...
        // The following code establishes a connection to the MQTT broker. It uses the domain name and port.
        if(mosquitto_connect(mosq, sign_mqtt.hostname, sign_mqtt.port, kaInterval)){
                printf("Error: Failed connecting cloud.\n\r");
                sleep(1);
                return -1;
        }
            

Nota: cuando establezca una conexión de MQTT, también debe especificar el intervalo de keepalive. El valor recomendado es de 60 segundos. También puede proporcionar un comando AT para permitir que la MCU modifique dinámicamente este parámetro. Alibaba Cloud IoT Platform acepta un intervalo de keepalive de entre 30 y 1200 segundos.

Una vez que el módulo se conecta a IoT Platform, permanece en línea si no cierra la conexión de MQTT. Busque el dispositivo de prueba en la consola de Alibaba Cloud IoT Platform para consultar su estado. La siguiente imagen muestra el estado de un dispositivo en línea:

Cómo comprobar si el programa puede enviar datos a IoT Platform

Después de que el módulo establezca la conexión con Alibaba Cloud IoT Platform, envíe un mensaje al tema /${productKey}/${deviceName}/get para comprobar si los datos se envían correctamente a la plataforma.

Nota: de forma predeterminada, el tema /${productKey}/${deviceName}/get solo tiene el permiso 'Subscribe'. En la consola de IoT Platform, cambie su permiso a 'Publish and Subscribe'. Este cambio evita que la nube descarte el mensaje después de enviarlo. Modificar el permiso del tema a 'Publish and Subscribe' sirve principalmente para garantizar que el programa de ejemplo se ejecute sin errores.

A continuación se muestra un ejemplo de implementación de referencia:

    int res = 0;
    iotx_mqtt_topic_info_t topic_msg;
    const char *fmt = "/%s/%s/get";
    char *topic = NULL;
    int topic_len = 0;
    char *payload = "hello,world";

    topic_len = strlen(fmt) + strlen(product_key) + strlen(device_name) + 1;
    topic = HAL_Malloc(topic_len);
    if (topic == NULL) {
        HAL_Printf("memory not enough\n");
        return -1;
    }
    memset(topic, 0, topic_len);
    // Generate the topic here.
    HAL_Snprintf(topic, topic_len, fmt, product_key, device_name);

        // The following code generates a message.
    memset(&topic_msg, 0x0, sizeof(iotx_mqtt_topic_info_t));
    topic_msg.qos = IOTX_MQTT_QOS0;
    topic_msg.retain = 0;
    topic_msg.dup = 0;
    topic_msg.payload = (void *)payload;
    topic_msg.payload_len = strlen(payload);

        // The following code sends a message to the specified topic. 
        // Replace the sending function below with the MQTT Publish function on your module.
    res = IOT_MQTT_Publish(handle, topic, &topic_msg);
            

En la consola de IoT Platform, revise el registro de Simple Log Service del dispositivo específico para ver si la plataforma recibió los datos:

查看是否接收到数据

Nota:

  • El registro muestra la hora en que se recibió el mensaje del dispositivo y el tema del mensaje. No muestra el contenido del mensaje.

  • Actualmente, Alibaba Cloud IoT Platform no admite Quality of Service (QoS) 2.

Cómo comprobar si el programa se suscribió correctamente a un tema

Suscríbase al tema /{productKey}/${deviceName}/get. De esta manera, cuando el dispositivo reporte datos a IoT Platform, la plataforma los devolverá al dispositivo. Esto le permite verificar que la suscripción funciona correctamente. A continuación se muestra un ejemplo de pseudocódigo:

    int res = 0;
    const char *fmt = "/%s/%s/get";
    char *topic = NULL;
    int topic_len = 0;

    topic_len = strlen(fmt) + strlen(product_key) + strlen(device_name) + 1;
    topic = HAL_Malloc(topic_len);
    if (topic == NULL) {
        HAL_Printf("memory not enough\n");
        return -1;
    }
    // The following code assembles the topic.
    memset(topic, 0, topic_len);
    snprintf(topic, topic_len, fmt, product_key, device_name);

    /* The following code subscribes to the topic and specifies the message handler function.
      Replace the code below with the actual MQTT subscribe function on your module. */
    res = IOT_MQTT_Subscribe(handle, topic, IOTX_MQTT_QOS0, example_message_arrive, NULL);
            

En la consola de IoT Platform, compruebe si la plataforma envió los datos al dispositivo:

Nota:

  • El registro muestra la hora en que se envió el mensaje al dispositivo. No muestra el contenido del mensaje.

  • Debe revisar en el módulo que los datos recibidos sean iguales a los datos que cargó. Esto garantiza que la recepción de datos funciona correctamente.

Implementación de comandos AT

También debe proporcionar comandos AT que la MCU pueda invocar. Como el módulo ya admite MQTT, debería ofrecer interfaces para la configuración de la conexión de MQTT, el inicio de la conexión, la desconexión, la suscripción y la publicación. Después de integrar Link SDK, agregue nuevos comandos AT para Alibaba Cloud o modifique los existentes.

A continuación se muestran los comandos AT recomendados para agregar:

Comando

Descripción

Configuración de credenciales de dispositivo de Alibaba Cloud

Establece el product_key, product_secret, device_name y device_secret del dispositivo.

Configuración de región de Alibaba Cloud

Alibaba Cloud IoT ofrece varios sitios en la nube en regiones como China, Estados Unidos y Japón. Esto permite que la MCU especifique el sitio y el puerto de Alibaba Cloud IoT a los que se conectará.

Para las instrucciones restantes de MQTT, continúe usando las del proveedor del módulo.