Conectar clientes MQTT usando Paho C

Texto copiado
Introducción

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.

Pre-requisitos para la conexión del cliente MQTT

Antes de conectar a los clientes de MQTT con el broker MQTT, asegúrese se cumplen los siguientes requisitos:

  • Cualquier corredor de MQTT de su elección instalado y funcionando.
  • Eclipse Paho Biblioteca C instalada.
  • Acceso a credenciales (nombre de usuario/palabra de contraseña) para la autenticación de corredores MQTT si es necesario.

Instalación de dependencia

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

Conexión con MQTT Broker

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.

MQTT 3.1.1

#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);
}

MQTT 5.0

/ 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.

MQTT 3.1.1

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.

MQTT 5

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í:

MQTT 5

MQTTProperty property2;
propiedad2.identificador = MQTTPROPERTY_CODE_MAXIMUM_PACKET_SIZE;
property2.value.integer4 = 4094;
MQTTProperties_add(corporaprops, &property2);

Publish

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:

MQTT 3.1.1

#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);
}

MQTT 5

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:

  • QoS 0 (Al menos una vez)
  • QoS 1 (Al menos una vez)
  • QoS 2 (Exactamente una vez)

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.

MQTT5

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.

MQTT5

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.

Suscríbete

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; ipayloadlen; 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);
}

Desconectar al cliente

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);

Construcción de su lógica de negocio

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.

Aplicación de las mejores prácticas

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 Código

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

MQTT 3.1.1

#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; ipayloadlen; 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;
}

MQTT 5

#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; ipayloadlen; 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;
}

Crear un Bundle ejecutable

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