Esta guía te ayuda a usarEclipse Paho Ccliente para conectarse a un corredor MQTT, publicar mensajes, y suscribirse a temas. Es ligero, escrito en C, y soporta MQTT v3.1.1 y v5.0 - ideal for embedded andAplicaciones IoT.
Antes de comenzar, asegúrate de tener la siguiente configuración:
git clone --branch v1.3.14 https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqt.c
hacer
Sudo make install
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 cubre múltiples maneras de conectarse a unMQTT broker. Asegúrese de tener los detalles del corredor (nombre de host, puerto, nombre de usuario/password, certificado CA) útiles.
Basic TCP Conexión
#define ADDRESS "tcp://public-mqt-broker.bevywise.com:1883"
#define CLIENTID "testclient4"
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);
}
Conectarse con la autenticación
MQTTAsync_create, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.username = "tu nombre-mqt-username";
conn_opts.password = "tu-mqtt-password";
Conexión sobre TLS/SSL
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;
Conectar a través de WebSocket
#define ADDRESS
"ws://freemqtbroker.sfodo.mqtserver.com:10443"
#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);
}
#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);
}
Para darse de baja:
#define FILTER "tu-topic-filter"
si (rc = MQTTAsync_unsubscribe(cliente, FILTER, NULL)) != MQTTASYNC_SUCCESS)
{}
printf("Failed to unsubscribe, return code %d\n", rc);
}
La desconexión limpia asegura que el corredor libera recursos vinculados a la sesión y evita las conexiones de toma de corriente.
MQTTAsync_disconnect(client, NULL);
MQTTAsync_destroy (cliente);
#include .stdio.h
#include יstdlib.h
*incluyen.
#incluye el tiempo indicado. h
#include ■unistd. h
#include "MQTTAsync.h"
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "testclientC4"
#define TOPIC "sensor/temperatura"
#define PAYLOAD "180"
#define QOS 1
#define TIMEOUT 10000L
int AUTHENTICATION = 0;
int finished = 0;
vacio en Desconex (contexto devoid*, MQTTAsync_successData*)
{}
printf("Succesful disconnection\n");
Termina = 1;
}
invalid onSubscribe(void* context, MQTTAsync_successData* response)
{}
printf("Suscribir Pablo\n");
}
vacío enConnectFailure(void* context, MQTTAsync_failureData* response)
{}
printf("Connect falló, rc %d\n", respuesta ? iconocódigo de respuesta : 0);
Termina = 1;
}
vacío enConnect(void* context, MQTTAsync_successData* response)
{}
printf("Succesful connection\n");
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_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');
MQTTAsync_freeMessage( implicamessage);
MQTTAsync_free(topicName);
Termina = 1;
retorno 1;
}
int main(int argc, char* argv[])
{}
// Crear cliente
MQTTAsync client;
MQTTAsync_create, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
MQTTAsync_setCallbacks(cliente, NULL, NULL, msgarrvd, NULL);
MQTTAsync_connectOptions conn_opts = MQTTAsync_connectOptions_initializer;
(AUTHENTICATION == 1)
{}
conn_opts.username = "dev2";
conn_opts.password = "key2";
}
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;
}
Guardar el código comomqt4Client.c
Compile:
gcc -o mqt4client mqt4Client.c -lpaho-mqt3a -lpaho-mqt3as
Ejecutar:
./mqt4client
#include .stdio.h
#include יstdlib.h
*incluyen.
#incluye el tiempo indicado. h
#include ■unistd. h
#include "MQTTAsync.h"
#define ADDRESS "tcp://localhost:1883"
#define CLIENTID "testClientC5"
#define TOPIC "sensor/humidity"
Define PAYLOAD 20.3
#define QOS 1
#define TIMEOUT 10000L
int AUTHENTICATION = 0;
int finished = 0;
vacio en Desconex (contexto devoid*, MQTTAsync_successData*)
{}
printf("Succesful disconnection\n");
Termina = 1;
}
vacío enConnectFailure(void* context, MQTTAsync_failureData* response)
{}
printf("Connect falló, rc %d\n", respuesta ? iconocódigo de respuesta : 0);
Termina = 1;
}
vacío enConnect(void* context, MQTTAsync_successData* response)
{}
printf("Succesful connection\n");
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_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');
MQTTAsync_freeMessage( implicamessage);
MQTTAsync_free(topicName);
Termina = 1;
retorno 1;
}
int main(int argc, char* argv[])
{}
// Crear cliente
MQTTAsync client;
MQTTAsync_createOptions create_opts = MQTTAsync_createOptions_initializer;
create_opts.MQTTVersion = MQTTVERSION_5;
int rc = MQTTAsync_createConOptions(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;
(AUTHENTICATION == 1)
{}
conn_opts.username = "dev2";
conn_opts.password = "key2";
}
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);
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;
}
Guardar el código comomqtt5Client.c
Compile:
gcc -o mqt5client mqt5lient.c -lpaho-mqt3a -lpaho-mqt3as
Ejecutar:
./mqtt5client