Este tema describe cómo usar el proyecto de código abierto Paho MQTT para C embebido para conectar un dispositivo a IoT Platform y habilitar la mensajería.
Notas de uso
En este tema se usan los permisos de un usuario común para ejecutar todas las operaciones. Si desea ejecutar operaciones específicas que requieren permisos de administrador, ejecute el comando sudo.
Requisitos previos
Se crean un producto y un dispositivo en una instancia de la consola de IoT Platform. Se obtienen el certificado del dispositivo y un endpoint MQTT. La información del certificado del dispositivo incluye ProductKey, DeviceName y DeviceSecret. Para obtener más información, consulte los temas que se muestran a continuación:
Preparar el entorno de desarrollo
En este ejemplo se usa Ubuntu 16.04-LTS para construir el entorno de desarrollo. Ejecute los comandos que se muestran a continuación para construirlo:
sudo apt-get update
sudo apt-get install build-essential git sed cmake
Descargar la biblioteca Paho MQTT para C
Ejecute el comando que se muestra a continuación para clonar la biblioteca Paho MQTT para C:
git clone https://github.com/eclipse-paho/paho.mqtt.embedded-c.git
En este tema se usa la rama master para desarrollar el código de ejemplo. El commit ID es 29ab2aa29c5e47794284376d7f8386cfd54c3eed.
El proyecto Paho MQTT para C embebido incluye los subproyectos que se muestran a continuación:
MQTTPacket: proporciona serialización y deserialización de paquetes de datos MQTT y algunas funciones auxiliares.
MQTTClient: encapsula el programa cliente de alto nivel en C++ que genera MQTTPacket.
-
MQTTClient-C: encapsula el programa cliente de alto nivel en C que genera MQTTPacket.
El proyecto MQTTClient-C incluye los directorios y archivos que se muestran a continuación:
├── CMakeLists.txt ├── samples │ ├── CMakeLists.txt │ ├── FreeRTOS │ └── linux ├── src │ ├── CMakeLists.txt │ ├── FreeRTOS │ ├── MQTTClient.c │ ├── MQTTClient.h │ ├── cc3200 │ └── linux └── test ├── CMakeLists.txt └── test1.cEl directorio samples proporciona código de ejemplo para sistemas FreeRTOS y Linux.
El directorio src proporciona código de ejemplo para implementar MQTTClient y los controladores de red para portarlos a FreeRTOS, CC3200 y Linux.
Para obtener más información sobre la API de Paho MQTT, consulte MQTTClient.h.
Conectar el cliente a IoT Platform
-
Haga clic en aiot_mqtt_sign.c y copie el código fuente proporcionado por Alibaba Cloud para obtener los parámetros de conexión MQTT. Después, cree un archivo llamado aiot_mqtt_sign.c localmente y pegue el código en el archivo.
El archivo aiot_mqtt_signal.c define la función aiotMqttSign().
-
Definición:
int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret, char clientId[150], char username[65], char password[65]); -
Función:
Calcula los parámetros username, password y clientID obligatorios para conectar un dispositivo a IoT Platform a través de MQTT.
-
Parámetros de entrada:
Parámetro
Tipo
Descripción
productKey
const char *
El ProductKey del producto al que pertenece el dispositivo. Este ProductKey se usa para identificar el dispositivo en la consola de IoT Platform.
deviceName
const char *
El DeviceName del dispositivo. Este DeviceName se usa para identificar el dispositivo en la consola de IoT Platform.
deviceSecret
const char *
El DeviceSecret del dispositivo. Este DeviceSecret se usa para identificar el dispositivo en la consola de IoT Platform.
-
Salida:
Parámetro
Tipo
Descripción
username
char *
El nombre de usuario que se usa para establecer la conexión MQTT.
password
char *
La contraseña que se usa para establecer la conexión MQTT.
clientId
char *
El ID del cliente MQTT.
-
Códigos de respuesta
Código de respuesta
Descripción
0
La llamada se completó correctamente.
-1
La llamada finalizó con errores.
-
-
Agregue un archivo de programa que permita conectar un dispositivo a IoT Platform.
Debe escribir un programa para llamar a la función aiotMqttSign() en el archivo aiot_mqtt_sign.c y obtener los parámetros obligatorios para establecer una conexión MQTT con IoT Platform.
Esta sección proporciona las instrucciones de desarrollo y el código de ejemplo.
-
Llame a la función aiotMqttSign() para inicializar los parámetros clientId, username y password.
#define EXAMPLE_PRODUCT_KEY "a11xsrW****" #define EXAMPLE_DEVICE_NAME "paho_****" #define EXAMPLE_DEVICE_SECRET "Y877Bgo8X5owd3lcB5wWDjryNPoB****" extern int aiotMqttSign(const char *productKey, const char *deviceName, const char *deviceSecret, char clientId[150], char username[65], char password[65]); /* invoke aiotMqttSign to generate mqtt connect parameters */ char clientId[150] = {0}; char username[65] = {0}; char password[65] = {0}; if ((rc = aiotMqttSign(EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME, EXAMPLE_DEVICE_SECRET, clientId, username, password) < 0)) { printf("aiotMqttSign -%0x4x\n", -rc); return -1; } printf("clientid: %s\n", clientId); printf("username: %s\n", username); printf("password: %s\n", password); -
Conecte el cliente a IoT Platform.
Realice las operaciones que se muestran a continuación:
Llame a las funciones NetworkInit() y NetworkConnect() para establecer una conexión TCP.
Llame a la función MQTTClientInit() para inicializar el cliente MQTT.
Configure la estructura MQTTPacket_connectData que contiene los parámetros de conexión MQTT.
Código de ejemplo:
/* network init and establish network to aliyun IoT platform */ NetworkInit(&n); rc = NetworkConnect(&n, host, port); printf("NetworkConnect %d\n", rc); /* init mqtt client */ MQTTClientInit(&c, &n, 1000, buf, sizeof(buf), readbuf, sizeof(readbuf)); /* set the default message handler */ c.defaultMessageHandler = messageArrived; /* set mqtt connect parameter */ MQTTPacket_connectData data = MQTTPacket_connectData_initializer; data.willFlag = 0; data.MQTTVersion = 3; data.clientID.cstring = clientId; data.username.cstring = username; data.password.cstring = password; data.keepAliveInterval = 60; data.cleansession = 1; printf("Connecting to %s %d\n", host, port); rc = MQTTConnect(&c, &data); printf("MQTTConnect %d, Connect aliyun IoT Cloud Success!\n", rc); -
Publique mensajes.
Llame a la función MQTTPublish() para publicar mensajes con formato personalizado en el tema personalizado especificado.
Para obtener más información sobre los temas, consulte What is a topic.
char *pubTopic = "/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/user/update"; int cnt = 0; unsigned int msgid = 0; while (!toStop) { MQTTYield(&c, 1000); if (++cnt % 5 == 0) { MQTTMessage msg = { QOS1, 0, 0, 0, "Hello world", strlen("Hello world"), }; msg.id = ++msgid; rc = MQTTPublish(&c, pubTopic, &msg); printf("MQTTPublish %d, msgid %d\n", rc, msgid); } } -
Suscríbase a un tema para recibir mensajes de IoT Platform.
void messageArrived(MessageData* md) { MQTTMessage* message = md->message; printf("%.*s\t", md->topicName->lenstring.len, md->topicName->lenstring.data); printf("%.*s\n", (int)message->payloadlen, (char*)message->payload); } char *subTopic = "/"EXAMPLE_PRODUCT_KEY"/"EXAMPLE_DEVICE_NAME"/user/get"; printf("Subscribing to %s\n", subTopic); rc = MQTTSubscribe(&c, subTopic, 1, messageArrived); printf("MQTTSubscribe %d\n", rc);
Consulte los patrones de comunicación entre dispositivo y nube en Overview of communications among devices, IoT platform, and servers.
-
Copie el archivo aiot_mqtt_signal.c y el archivo modificado en el paso 2 a ../paho.mqtt.embedded-c/MQTTClient-C/samples/linux. Después, compile el proyecto.
Código de ejemplo
Puede ejecutar el código de ejemplo para conectarse a IoT Platform.
-
Descargue el paquete de demostración y descomprímalo.
Se obtienen los archivos que se muestran a continuación:
Archivo de certificado
Descripción
aiot_mqtt_sign.c
Este archivo contiene el código que se usa para obtener los parámetros de conexión MQTT. Al ejecutar el archivo aiot_c_demo.c, se llama a la función aiotMqttSign() para obtener los valores de los parámetros username, password y clientId.
aiot_c_demo.c
Este archivo contiene el código de lógica que se usa para conectarse y comunicarse con IoT Platform.
-
En el archivo aiot_c_demo.c, reemplace la información del dispositivo con la información de su dispositivo.
-
Reemplace los valores de los parámetros EXAMPLE_PRODUCT_KEY, EXAMPLE_DEVICE_NAME y EXAMPLE_DEVICE_SECRET con la información de su certificado de dispositivo.
#define EXAMPLE_PRODUCT_KEY "The ProductKey of the product" #define EXAMPLE_DEVICE_NAME "The DeviceName of the device" #define EXAMPLE_DEVICE_SECRET "The DeviceSecret of the device" -
Modifique el endpoint en
char *host = EXAMPLE_PRODUCT_KEY".iot-as-mqtt.cn-shanghai.aliyuncs.com".Para obtener más información sobre los endpoints de las instancias públicas y las instancias Enterprise Edition, así como sobre los formatos de los endpoints, consulte View the endpoint of an instance.
-
Mueva los archivos aiot_mqtt_signal.c y aiot_c_demo.c al directorio ../paho.mqtt.embedded-c/MQTTClient-C/samples/linux del proyecto Paho.
-
Compile el proyecto y ejecute el programa.
Puede compilar el proyecto mediante uno de los métodos que se muestran a continuación:
-
Use la herramienta CMake.
-
Agregue aiot_c_demo.c y aiot_mqtt_signal.c al archivo CMakeLists.txt del directorio /paho.mqtt.embedded-c/MQTTClient-C/samples/linux.
El código que se muestra a continuación indica cómo modificar el archivo CMakeLists.txt.
add_executable( stdoutsubc stdoutsub.c ) add_executable( aiot_c_demo aiot_c_demo.c aiot_mqtt_sign.c ) target_link_libraries(stdoutsubc paho-embed-mqtt3cc paho-embed-mqtt3c) target_include_directories(stdoutsubc PRIVATE "../../src" "../../src/linux") target_compile_definitions(stdoutsubc PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h) target_link_libraries(aiot_c_demo paho-embed-mqtt3cc paho-embed-mqtt3c) target_include_directories(aiot_c_demo PRIVATE "../../src" "../../src/linux") target_compile_definitions(aiot_c_demo PRIVATE MQTTCLIENT_PLATFORM_HEADER=MQTTLinux.h) -
Regrese al directorio /paho.mqtt.embedded-c y ejecute el comando que se muestra a continuación para compilar el proyecto.
mkdir build.paho cd build.paho cmake .. make -
Vaya al directorio /paho.mqtt.embedded-c/build.paho y ejecute el comando que se muestra a continuación para ejecutar el programa:
./MQTTClient-C/samples/linux/aiot_c_demo
-
-
Use el archivo build.sh.
Abra el archivo build.sh en el directorio /paho.mqtt.embedded-c/MQTTClient-C/samples/linux.
En el archivo build.sh, reemplace
stdoutsub.cconaiot_mqtt_sign.c aiot_c_demo.c, y-o stdoutsubcon-o aiot_c_demo. Después, guarde el archivo build.sh.-
Vaya al directorio /paho.mqtt.embedded-c/MQTTClient-C/samples/linux y ejecute el comando
./build.sh.Después de compilar, se genera el archivo ejecutable aiot_c_demo.
Ejecute el comando
./aiot_c_demopara ejecutar el archivo.
Después de ejecutar el archivo, se generan los registros locales que se muestran a continuación:
clientid: paho_mqtt&a11xsrW****|timestamp=2524608000000,_v=sdk-c-1.0.0,securemode=3,signmethod=hmacsha256,lan=C| username: paho_mqtt&a11xsrW**** password: 36E955DC3D9D012EF62C80657A29328B1CFAE6186C611A17DC7939FAB637**** NetworkConnect 0 Connecting to a11xsrW****.iot-as-mqtt.cn-shanghai.aliyuncs.com 443 MQTTConnect 0, Connect aliyun IoT Cloud Success! Subscribing to /a11xsrW****/paho_mqtt/user/get MQTTSubscribe 0 MQTTPublish 0, msgid 1 MQTTPublish 0, msgid 2 MQTTPublish 0, msgid 3 MQTTPublish 0, msgid 4 MQTTPublish 0, msgid 5 ...Inicie sesión en la consola de IoT Platform y consulte el estado del dispositivo y los registros de su instancia.
En el panel de navegación izquierdo, elija . Verá que el estado del dispositivo es Online.
Elija . Después, haga clic en la pestaña Cloud run log o Device local log para consultar los registros. Para obtener más información, consulte IoT Platform logs y On-premises device logs.
-
Códigos de error
Si un dispositivo no puede establecer una conexión MQTT con IoT Platform, puede solucionar el problema según el código de error. Para obtener más información, consulte Troubleshooting.