Esta documentación le guía por la conexiónMQTT clientesnuestraMQTT broker(CrystalMQ) o cualquier corredor de su elección usandoEclipse Paho Cbiblioteca, permitiendo una comunicación eficiente entre dispositivos.
Eclipse Paho Embedded C es adecuado para sistemas operativos de escritorio pero es principalmente diseñado para entornos incrustados como mbed, Arduino y FreeRTOS.
Antes de conectar a los clientes de MQTT con el broker MQTT, asegúrese se cumplen los siguientes requisitos:
Eclipse Paho MQTT C Library
Esta biblioteca debe ser incluida en el código del cliente como:
#include "MQTTAsync.h"
Esta biblioteca se puede construir desde la fuente.
Linux/macOS
git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqt.c
hacer
Sudo make install
Windows
mkdir construir. paho
cd build. paho
llamar "C:\Program Files (x86)\Microsoft Visual Studio
14.0\VC\vcvarsall.bat" x64
cmake -G "NMake Makefiles" -DPAHO_WITH_SSL=TRUE
-DPAHO_BUILD_DOCUMENTATION=FALSE -DPAHO_BUILD_SAMPLES=TRUE
-DCMAKE_BUILD_TYPE=Release -DCMAKE_VERBOSE_MAKEFILE=TRUE ..
nmake
Esta sección tiene fragmentos de código de varias maneras de conectarse a MQTT Broker. Asegúrese de que el MQTT Broker admite el tipo de conexión que le gustaría utilizar. Además, obtenga los parámetros de conexión correspondientes del MQTT Broker (Address, Port, Nombre de usuario/Password, certificado CA)
MQTT Over TCP
Utilice el siguiente código para conectar al cliente sobre TCP. Define el Macro ADDRESS utilizando los parámetros de conexión de MQTT Broker.
#define ADDRESS "tcp://public-mqt-broker.bevywise.com:1883"
CLIENTID "crystamq_testclient"
MQTTAsync client;
MQTTAsync_create, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE,
NULL);
MQTTAsync_connectOptions conn_opts =
MQTTAsync_connectOptions_initializer;
int rc;
si (rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
{}
printf("Failed to start connect, return code %d\n", rc);
(EXIT_FAILURE);
}
/ Crear cliente
MQTTAsync client;
MQTTAsync_createOptions create_opts =
MQTTAsync_createOptions_initializer;
create_opts.MQTTVersion = MQTTVERSION_5;
int rc = MQTTAsync_createConOpciones (cliente, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL, &create_opts);
si (rc!= MQTTASYNC_SUCCESS)
{}
fprintf(stderr, "Failed to create client, return code: %s\n",
MQTTAsync_strerror(rc));
(EXIT_FAILURE);
}
// Conectar cliente
MQTTAsync_connectOptions conn_opts =
MQTTAsync_connectOptions_initializer5;
si (rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
{}
printf("Failed to start connect, return code %d\n", rc);
(EXIT_FAILURE);
}
MQTT sobre TLS / SSL
Utilice el siguiente código para conectarse de forma segura a MQTT Broker sobre TLS. Define el Macro ADDRESS utilizando los parámetros de conexión de MQTT Broker.
#define ADDRESS
"ssl://freemqtbroker.sfodo.mqtserver.com:8883"
Establecer parámetros TLS antes de llamar al MQTTClient_connect conectar el cliente al mQTT Broker de forma segura sobre TLS.
Si el MQTT Broker es hospedado en un servidor de confianza y el servidor No se requiere verificación, el siguiente código se puede utilizar para configurar Opciones TLS:
MQTTAsync_SSLOptions ssl_opts = MQTTAsync_SSLOptions_initializer;
ssl_opts.verify = 0;ssl_opts.sslVersion = MQTT_SSL_VERSION_TLS_1_2;
ssl_opts.enableServerCertAuth = 0;
ssl_opts.verify = 0;
conn_opts.ssl = < ssl_opts;
Si el MQTT Broker tiene certificado de servidor emitido por un fideicomiso CA, entonces el Certificado de Servidor se puede verificar utilizando:
MQTTAsync_SSLOptions ssl_opts = MQTTAsync_SSLOptions_initializer;
ssl_opts.verify = 0;ssl_opts.sslVersion = MQTT_SSL_VERSION_TLS_1_2;
ssl_opts.enableServerCertAuth = 1;
ssl_opts.verify = 1;
conn_opts.ssl = < ssl_opts;
Si el MQTT Broker tiene un certificado de servidor auto-firmado entonces el Certificado de Servidor se puede verificar utilizando el Certificado de Root obtenido del MQTT Broker:
MQTTAsync_SSLOptions ssl_opts = MQTTAsync_SSLOptions_initializer;
ssl_opts.verify = 0;ssl_opts.sslVersion = MQTT_SSL_VERSION_TLS_1_2;
ssl_opts.enableServerCertAuth = 1;
ssl_opts.verify = 1;
ssl_opts.CApath = "./root.crt";
conn_opts.ssl = < ssl_opts;
MQTT sobre WebSocket
Define la dirección MQTT Broker como esta para conectar al cliente WebSocket.
#define ADDRESS
"ws://freemqtbroker.sfodo.mqtserver.com:10443"
MQTT sobre Secure WebSocket
Utilice el siguiente código para conectar al cliente sobre Secure WebSocket. Establecer opciones TLS como se indica en la sección MQTT Más TLS. Define el Macro ADDRESS utilizando los parámetros de conexión de MQTT Broker.
#define ADDRESS "wss://public-mqt-broker.bevywise.com:11443"
Configuración de MQTT Autenticación
Para conectarse a MQTT Broker que requiere MQTT Usuario y MQTT Contraseña para autenticación, añadir a nombre de usuario y contraseña a las opciones de conexión como esto:
MQTTAsync_create, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE,
NULL);
conn_opts.username = "tu nombre-mqt-username";
conn_opts.password = "tu-mqtt-password";
Características avanzadas
Configuración de la última voluntad
Configurar elÚltima Voluntad y Testamentofunción para especificar un mensaje que el corredor publicará si el cliente se desconecta inesperadamente. Esto ayuda a informar a otros suscriptores del estado del cliente desconectado.
Utilice el siguiente código para establecer Last Will en la conexión Opciones:
MQTTAsync_willOptions will_opts = MQTTAsync_willOptions_initializer;
will_opts.topicName = "MQTT/Will"; //Cambia esto para el tema de tu voluntad
elección
will_opts.qos = 0; //Cambia esto a QoS de tu elección
will_opts.message = "Inesperadamente desconectado";
conn_opts.will = &will_opts;
Ajuste Mantener Alive
Ajuste elmantener la calmaintervalo para controlar con frecuencia el cliente envía mensajes PINGREQ al corredor.
Modifique el código de abajo para satisfacer sus requisitos:
MQTTAsync_create(cliente, ADDRESS, CLIENTID,
MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.keepAliveInterval = 20;
Configuración de la Persistencia de Sesión
Datos de sesión de un cliente MQTT incluyen las suscripciones hecho por el Cliente y cualquier dato que el Cliente recibiría con QoS =0. El cliente puede conseguir elMQTT Brokeralmacenar sus datos de sesión a través de las conexiones.
MQTT 3.1.1 Los clientes pueden establecer sesión limpia = 0 para solicitar el MQTT Broker para mantener su información de sesión almacenada a través de conexiones.
conn_opts.cleansession = 0;
MQTT 5 Los clientes pueden establecer el inicio limpio = 0 y el gasto de sesión Interval = 'N' para solicitar al MQTT Broker que mantenga su información de sesión almacenada a través de conexiones para 'N' segundos.
MQTTAsync_connectOptions conn_opts =
MQTTAsync_connectOptions_initializer5;
conn_opts.cleanstart = 1;
MQTTProperties props = MQTTProperties_initializer;
MQTTProperty property1
;
property1.identifier = MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL;
propiedad1.value.integer2 = 90;
MQTTProperties_add(corporaprops, &property1);
Configuración Máxima Tamaño del paquete
MQTT5 Client puede solicitar el MQTT Broker para enviar solo datos paquetes de menos de un tamaño específico configurando así:
MQTTProperty property2;
propiedad2.identificador = MQTTPROPERTY_CODE_MAXIMUM_PACKET_SIZE;
property2.value.integer4 = 4094;
MQTTProperties_add(corporaprops, &property2);
Envío de datos
Distribución eficiente de los datos a múltiples suscriptores por publicarlos a los designados temas con el siguiente fragmento de código:
#define TOPIC "device/status"
#define PAYLOAD "ON"
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
int rc;
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = 1;
pubmsg.retained = 0;
entregado = 0;
si (rc = MQTTAsync_sendMessage(cliente, TOPIC, &pubmsg, &opts)) !=
MQTTASYNC_SUCCESS)
{}
printf("Failed to start sendMessage, return code %d\n", rc);
(EXIT_FAILURE);
}
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
si (rc = MQTTAsync_sendMessage(cliente, TOPIC, &pubmsg, &pub_opts))!=
MQTTASYNC_SUCCESS)
{}
printf("Failed to start sendMessage, return code %d\n", rc);
(EXIT_FAILURE);
}
Configuración de mensajes retenidos
Permitir la bandera de retención al publicar un mensaje para asegurar broker almacena el último mensaje para cada tema. Esto garantiza que los nuevos suscriptores recibir el mensaje más reciente al conectarse.
Para implementar esto, utilice el siguiente fragmento de código:
pubmsg.retained = 1
Especificación de los niveles de QoS
MQTT proporciona tres niveles de calidad del servicio (QoS) para el mensaje entrega:
Especifique el nivel QoS requerido al publicar mensajes MQTT utilizando este código:
pubmsg.qos = 1; // Set to 0 or 1 or 2
Intervalo de viaje
La propiedad 'intervalo de caducidad del mensaje' establece la vida útil del mensaje en segundos; si no se entrega dentro de este tiempo, el corredor lo descarta. MQTT5 admite esta función. MQTT5 Los clientes pueden configurar esto mientras publican datos.
MQTTAsync_responseOptions pub_opts =
MQTTAsync_responseOptions_initializer;
pub_opts.context = cliente;
MQTTProperties pub_props = MQTTProperties_initializer;
MQTTProperty property3;
property3.identifier = MQTTPROPERTY_CODE_MESSAGE_EXPIRY_INTERVAL;
property3.value.integer4 = 90;
MQTTProperties_add( limitpub_props, &property3);
pub_opts.properties = pub_props;
Tema Alias
La propiedad 'Topic Alias' permite a los clientes utilizar un breve alias en lugar de un nombre completo del tema, reduciendo el tamaño del paquete de mensajes y mejorando la red eficiencia.
MQTTAsync_responseOptions pub_opts =
MQTTAsync_responseOptions_initializer;
pub_opts.context = cliente;
MQTTProperties pub_props = MQTTProperties_initializer;
MQTTProperty property3;
propiedad3.identifier = MQTTPROPERTY_CODE_TOPIC_ALIAS;
property3.value.integer2 = 10;
MQTTProperties_add( limitpub_props, &property3);
pub_opts.properties = pub_props;
Propiedades asociadas con MQTT PUBLISH mejorar el manejo de mensajes, proporcionar contexto o instrucciones para los corredores y clientes. Estas propiedades, incluyendo intervalos de expiración de mensajes y alias tópicos, optimizar la entrega de mensajes y la red ancho de banda.
Suscribirse al filtro del tema
Para recibir datos publicados por otros clientes, este cliente tiene que Suscríbete a un Filtro de Tema igualado como este:
#define FILTER "tu-topic-filter"
#define QOS 1
si (rc = MQTTAsync_subscribe(cliente, FILTER, QOS, NULL))) !=
MQTTASYNC_SUCCESS)
{}
printf("Failed to subscribe, return code %d\n", rc);
(EXIT_FAILURE);
}
Este filtro de tema puede coincidir con un tema exacto o puede tener como # y +
Datos de recepción
Para recibir los datos enviados para las suscripciones, una función callback debe definirse así:
/*Este Callback se activa cuando este cliente ha recibido un mensaje*/
int msgarrvd(void *context, char *topicName, int topicLen,
MQTTClient_message *message)
{}
int i;
char* payloadptr;
printf("Message arrived\n");
printf(" tema: %s\n", topicName);
printf(" mensaje: ");
payloadptr = mensaje- ratiopayload;
para(i=0; i
{}
putchar(*payloadptr++);
}
putchar('\n');
MQTTClient_freeMessage( implicamessage);
MQTTClient_free(topicName);
retorno 1;
}
MQTTClient_setCallbacks(cliente, NULL, NULL, msgarrvd, NULL);
Suscripción de Temas
Para dejar de recibir actualizaciones de un tema, utilice el código proporcionado a Suscribe.
#define FILTER "tu-topic-filter"
si (rc = MQTTAsync_unsubscribe(cliente, FILTER, NULL)) !=
MQTTASYNC_SUCCESS)
{}
printf("Failed to unsubscribe, return code %d\n", rc);
}
Asegurar una terminación adecuada de la conexión de su cliente con la broker to avoid issues and resource leaks on both sides, thereby maintaining system estabilidad.
Utilice el siguiente código para desconectar al cliente del broker:
MQTTAsync_disconnect(client, NULL);
MQTTAsync_destroy (cliente);
Usted tiene la oportunidad de desarrollar y personalizar su propio lógica de negocio intrincada dentro de este entorno, adaptándolo precisamente a su necesidades y objetivos.
Asignación de identificación del cliente
Asignar un ID de cliente específico a cada dispositivo para mantener una identificación precisa. In instancias privadas, asignar identificaciones únicas a clientes individuales, y en entornos compartidos, adjunta una cadena aleatoria a cada ID de cliente para la singularidad seguridad.
Diseño de datos
Organiza tu estructura de datos con una cuidadosa planificación. Ya sea manejando texto plano, JSON formatear, o datos numéricos, asegurar que el diseño se adapte a los requisitos específicos de tu solicitud.
Manejo de error robusto
Implementar una gestión de errores sólida para manejar fallos de conexión MQTT, suscripción problemas y errores de publicación de mensajes eficazmente.
Verificación de credenciales
Guardar información confidencial como nombres de usuario, contraseñas y IDs de cliente por no codificación dura en su código fuente. Use variables ambientales o archivos de configuración seguros en su lugar.
Pruebas periódicas " Monitoreo
Prueba continuamente la comunicación del MQTT y monitorea las métricas del cliente como estado de conexión, transmisión de mensajes y tasas de error para identificar y corregir rápidamente cuestiones.
Optimización de la gestión de las sesiones
Elija entre sesiones limpias y persistentes (`limpia: verdadera` o `claran: false`) basado en su necesidad de retener suscripciones y mensajes apagados a través de conexiones cliente.
Reconnect on Disconnect
Reconnect on Disconnect Agregar código para intentar la reconexión con el MQTT Broker cuando hay un inesperado desconexión. Esto asegurará que su cliente permanezca conectado y no pierda nada datos.
Descargar el código completo para el cliente que utiliza Paho C MQTT Client Biblioteca para conectar con nuestro corredor de mensajería o cualquier corredor de su elección
#include .stdio.h
#include יstdlib.h
*incluyen.
#incluye el tiempo indicado.h
#include ■unistd.h
#include "MQTTAsync.h"
#define ADDRESS "tcp://localhost:1883"
#define TOPIC "sensor/temperatura"
#define PAYLOAD "180"
#define QOS 1
#define TIMEOUT 10000L
int finished = 0;
void generate_clientid(char *str, int str_length)
{}
srand(time(NULL));
const char *alphanum =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", *PREFIX =
"crystalmq_"
strncpy(str, PREFIX, strlen(PREFIX));
para (int i = 0; i) (str_length-strlen(PREFIX)); ++i) {
str[10 + i] = alfanum[rand() % 62]; // 62 es la longitud del alfanum
cuerda
}
str[str_length] = '\0';
}
vacio en Desconexión (void* context, MQTTAsync_successData* response)
{}
printf("Succesful disconnection\n");
terminado = 1;
}
invalid onSubscribe(void* context, MQTTAsync_successData* response)
{}
printf("Suscribir sucedió\n");
}
vacío enConnectFailure(void* context, MQTTAsync_failureData* response)
{}
printf("Connect falló, rc %d\n", respuesta ? response- iconocode : 0);
terminado = 1;
}
vacío enConnect(void* context, MQTTAsync_successData* response)
{}
printf("Succesful connection\n");
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message
*mensaje)
{}
int i;
char* payloadptr;
printf("Message arrived\n");
printf(" tema: %s\n", topicName);
printf(" mensaje: ");
payloadptr = mensaje- ratiopayload;
para(i=0; i
{}
putchar(*payloadptr++);
}
putchar('\n');
MQTTAsync_freeMessage( implicamessage);
MQTTAsync_free(topicName);
retorno 1;
}
int main(int argc, char* argv[])
{}
// Crear cliente
char clientid[21];
generate_clientid(clientid, 20);
MQTTAsync client;
MQTTAsync_create, ADDRESS, clientid, MQTTCLIENT_PERSISTENCE_NONE,
NULL);
MQTTAsync_setCallbacks(cliente, NULL, NULL, msgarrvd, NULL);
MQTTAsync_connectOptions conn_opts =
MQTTAsync_connectOptions_initializer;
conn_opts.keepAliveInterval = 60;
conn_opts.cleansession = 1;
conn_opts.onSucces = onConnect;
conn_opts.on Failure = onConnectFailure;
conn_opts.context = cliente;
int rc;
si (rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
{}
printf("Failed to start connect, return code %d\n", rc);
(EXIT_FAILURE);
}
sueño(1);
// Suscribirse
MQTTAsync_responseOptions sub_opts =
MQTTAsync_responseOptions_initializer;
sub_opts.onSucces = onSubscribe;
sub_opts.context = cliente;
si (rc = MQTTAsync_subscribe(cliente, TOPIC, QOS, ⊂_opts)) !=
MQTTASYNC_SUCCESS)
{}
printf("Failed to subscribe, return code %d\n", rc);
(EXIT_FAILURE);
}
// Publish
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
si (rc = MQTTAsync_sendMessage(cliente, TOPIC, &pubmsg, NULL))!=
MQTTASYNC_SUCCESS)
{}
printf("Failed to start sendMessage, return code %d\n", rc);
(EXIT_FAILURE);
}
Mientras (!finished)
#if defined(WIN32) tención eterna definida(WIN64)
(100 años);
#else
usleep(10000L);
#endif
MQTTAsync_destroy (cliente);
retorno rc;
}
#include .stdio.h
#include יstdlib.h
*incluyen.
#incluye el tiempo indicado.h
#include ■unistd.h
#include "MQTTAsync.h"
#define ADDRESS "tcp://localhost:1883"
#define TOPIC "sensor/humidity"
Define PAYLOAD 20.3
#define QOS 1
#define TIMEOUT 10000L
int finished = 0;
void generate_clientid(char *str, int str_length)
{}
srand(time(NULL));
const char *alphanum =
"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", *PREFIX =
"crystalmq_"
strncpy(str, PREFIX, strlen(PREFIX));
para (int i = 0; i) (str_length-strlen(PREFIX)); ++i) {
str[10 + i] = alfanum[rand() % 62]; // 62 es la longitud del alfanum
cuerda
}
str[str_length] = '\0';
}
vacio en Desconexión (void* context, MQTTAsync_successData* response)
{}
printf("Succesful disconnection\n");
terminado = 1;
}
vacío enConnectFailure(void* context, MQTTAsync_failureData* response)
{}
printf("Connect falló, rc %d\n", respuesta ? response- iconocode : 0);
terminado = 1;
}
vacío enConnect(void* context, MQTTAsync_successData* response)
{}
printf("Succesful connection\n");
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message
*mensaje)
{}
int i;
char* payloadptr;
printf("Message arrived\n");
printf(" tema: %s\n", topicName);
printf(" mensaje: ");
payloadptr = mensaje- ratiopayload;
para(i=0; i
{}
putchar(*payloadptr++);
}
putchar('\n');
MQTTAsync_freeMessage( implicamessage);
MQTTAsync_free(topicName);
retorno 1;
}
int main(int argc, char* argv[])
{}
// Crear cliente
char clientid[21];
generate_clientid(clientid, 20);
MQTTAsync client;
MQTTAsync_createOptions create_opts =
MQTTAsync_createOptions_initializer;
create_opts.MQTTVersion = MQTTVERSION_5;
int rc = MQTTAsync_createConOpciones(clclient, ADDRESS, clientid,
MQTTCLIENT_PERSISTENCE_NONE, NULL, &create_opts);
MQTTAsync_setCallbacks(cliente, NULL, NULL, msgarrvd, NULL);
/ Conjunto CONNECT Propiedades
MQTTAsync_connectOptions conn_opts =
MQTTAsync_connectOptions_initializer5;
conn_opts.keepAliveInterval = 20;
conn_opts.cleanstart = 1;
conn_opts.onSucces = onConnect;
conn_opts.on Failure = onConnectFailure;
conn_opts.context = cliente;
MQTTProperties props = MQTTProperties_initializer;
// Intervalo de gastos de período de sesiones
MQTTProperty property1;
property1.identifier = MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL;
propiedad1.value.integer2 = 90;
MQTTProperties_add(corporaprops, &property1);
// Tamaño máximo del paquete
MQTTProperty property2;
propiedad2.identificador = MQTTPROPERTY_CODE_MAXIMUM_PACKET_SIZE;
property2.value.integer4 = 4094;
MQTTProperties_add(corporaprops, &property2);
conn_opts.connectProperties = &prop
si (rc = MQTTAsync_connect(client, &conn_opts)) != MQTTASYNC_SUCCESS)
{}
printf("Failed to start connect, return code %d\n", rc);
(EXIT_FAILURE);
}
sueño(1);
// Suscribirse
si (rc = MQTTAsync_subscribe(cliente, TOPIC, QOS, NULL)))!=
MQTTASYNC_SUCCESS)
{}
printf("Failed to subscribe, return code %d\n", rc);
(EXIT_FAILURE);
}
sueño(1);
// Publish
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
pubmsg.payload = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
pubmsg.retained = 0;
// Set Publish Properties
MQTTAsync_responseOptions pub_opts =
MQTTAsync_responseOptions_initializer;
pub_opts.context = cliente;
MQTTProperties pub_props = MQTTProperties_initializer;
MQTTProperty property3;
propiedad3.identifier = MQTTPROPERTY_CODE_TOPIC_ALIAS;
property3.value.integer4 = 90;
MQTTProperties_add( limitpub_props, &property3);
pub_opts.properties = pub_props;
si (rc = MQTTAsync_sendMessage(cliente, TOPIC, &pubmsg, &pub_opts))! =
MQTTASYNC_SUCCESS)
{}
printf("Failed to start sendMessage, return code %d\n", rc);
(EXIT_FAILURE);
}
sueño(1);
si (rc = MQTTAsync_unsubscribe(cliente, TOPIC, NULL)) !=
MQTTASYNC_SUCCESS)
{}
printf("Failed to unsubscribe, return code %d\n", rc);
(EXIT_FAILURE);
}
Mientras (!finished)
#if defined(WIN32) tención eterna definida(WIN64)
(100 años);
#else
usleep(10000L);
#endif
MQTTAsync_destroy (cliente);
retorno rc;
}
Así es como este cliente C puede ser compilado utilizando el compilador gcc a un ejecutable.
$ gcc -o mqtclient mqtclient.c -lpaho-mqt3a -lpaho-mqtt3as
$ ./mqtclient
Conecta a tu cliente con nuestro estado de arteMQTT brokero cualquier agente de su elección. Esta potente combinación garantizará un rendimiento y una fiabilidad óptimos para todo su necesidades de mensajería, allanando el camino para una integración del sistema robusta y eficiente