Diese Anleitung hilft Ihnen, dieEclipse Paho CClient, um mit einem MQTT-Broker zu verbinden, Nachrichten zu veröffentlichen, und abonnieren Sie Themen. Es ist leicht, in C geschrieben und unterstützt MQTT v3.1.1 und v5.0 — ideal für eingebettet undInternet und Internet.
Bevor Sie beginnen, stellen Sie sicher, dass Sie die folgende Einrichtung haben:
git clone --branch v1.3.14 https://github.com/eclipse/paho.mqt.c.git
cd paho.mqtt.c
machen
sudo make install
mkdir bauen. Paho
cd bauen. Paho
rufen Sie "C:\Programme (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
Dieser Abschnitt umfasst mehrere Möglichkeiten, eine Verbindung zu einemMQTT Broker. Stellen Sie sicher, dass Sie die Broker-Details (Hostname, Port, Benutzername/Passwort, CA-Zertifikat) handlich haben.
Basis TCP Verbindung
#definieren ADDRESS "tcp://public-mqtt-broker.bevywise.com:1883"
#definieren CLIENTID "testclient4"
MQTTAsync Client;
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
MQTTAsync_connectOptionen conn_opts = MQTTAsync_connectOptionen_initializer;
int rc;
wenn ((rc = MQTTAsync_connect(client, &conn_opts))) MQTTASYNC_SUCCESS)
{\cHFFFF}
printf("Failed to start connect, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Verbindung mit Authentication
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
conn_opts.username = "your-mqtt-username";
conn_opts.password = "your-mqtt-password";
Über TLS/SSL verbinden
MQTTAsync_SSLOptionen 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.sl = &ssl_opts;
Verbindung über WebSocket
#define ADDRESS
"ws://freemqtbroker.sfodo.mqttserver.com:10443"
#definieren 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;
geliefert = 0;
wenn ((rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &opts))) MQTTASYNC_SUCCESS)
{\cHFFFF}
printf("Failed to start sendMessage, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
#definieren FILTER "Ihr-Topik-Filter"
#define QOS 1
wenn ((rc = MQTTAsync_subscribe(client, FILTER, QOS, NULL)) MQTTASYNC_SUCCESS)
{\cHFFFF}
printf("Failed to abonnieren, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Abmelden:
#definieren FILTER "Ihr-Topik-Filter"
wenn ((rc = MQTTAsync_unsubscribe(client, FILTER, NULL))) MQTTASYNC_SUCCESS)
{\cHFFFF}
printf("Failed to abbestellen, return code %d\n", rc);
}
Saubere Trennung sorgt dafür, dass der Broker Ressourcen freigibt, die an die sitzung und vermeidet lingering Steckdosenverbindungen.
MQTTAsync_disconnect(client, NULL);
MQTTAsync_destroy(&client);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "MQTTAsync.h"
#definieren Sie ADDRESS "tcp://localhost:1883"
#definieren CLIENTID "testclientC4"
#definieren TOPIC "Sensor/Temperatur"
#define PAYLOAD "180"
#define QOS 1
#define TIMEOUT 10000L
Int AUTHENTIC = 0;
int fertig = 0;
Leere onDisconnect(void* Kontext, MQTTAsync_successData* Antwort
(STÖHNT)
printf("Erfolgsame Trennung\n");
Fertig = 1;
}
Leere auf Abonnieren(void* Kontext, MQTTAsync_successData* Antwort
(STÖHNT)
printf("Beschreiben Sie erfolgreich\n");
}
ungültig aufConnectFailure(void* Kontext, MQTTAsync_failure Daten* Antwort
(STÖHNT)
printf("Connect fail, rc %d\n", Antwort? > Antwortcode : 0);
Fertig = 1;
}
Leere onConnect(void* Kontext, MQTTAsync_successData* Antwort
(STÖHNT)
printf("Erfolgreiche Verbindung\n");
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message)
(STÖHNT)
int i;
char* payloadptr;
printf("Message eingetroffen\n");
Printf(') Thema: %s\n", topName;
printf("-Nachricht: ");
payloadptr = message->payload;
für(i=0; i<message->payloadlen; i++)
(STÖHNT)
putchar(*payloadptr++)
}
putchar('n');
MQTTAsync_freeMessage(&message);
MQTTAsync_free(topicName);
Fertig = 1;
Rückgabe 1;
}
int main(int argc, char* argv[])
(STÖHNT)
• Der Kunde
MQTTAsync Client;
MQTTAsync_create(&client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL);
MQTTAsync_setCallbacks(Client, NULL, NULL, msgarrvd, NULL);
MQTTAsync_connectOptionen conn_opts = MQTTAsync_connectOptionen_initializer;
(AUTHENTIC == 1)
(STÖHNT)
conn_opts.username = "dev2";
conn_opts.password = "key2";
}
conn_opts.keepAliveInterval = 60;
conn_opts.cleansession = 1;
conn_opts.onSuccess = onConnect;
Der Präsident Ausfall = onConnectFailure;
conn_opts.context = Client;
int rc;
wenn ((rc = MQTTAsync_connect(client, &conn_opts))) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failed to start connect, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Schlaf(1);
Ich bin hier.
MQTTAsync_responseOptionen sub_opts = MQTTAsync_responseOptionen_initializer;
sub_opts.onSuccess = onSubscribe;
sub_opts.context = Client;
wenn ((rc = MQTTAsync_subscribe(client, TOPIC, QOS, Θ_opts))) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failing to abonnieren, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Englisch
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
Scham. Nutzlast = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
Pubmsg.retained = 0;
wenn (rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, NULL)) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failed to start sendMessage, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
(!vollendet)
(STÖHNT)
#if definiert(WIN32) || definiert(WIN64)
Schlaf(100)
#else
Verwendungep(10000L)
#endif
}
MQTTAsync_destroy(&client);
Rückgabe rc;
}
Speichern Sie den Code alsmqt4Client.c
Compile:
gcc -o mqtt4client mqtt4Client.c -lpaho-mqtt3a -lpaho-mqt3as
Ausführung:
./mqt4client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "MQTTAsync.h"
#definieren Sie ADDRESS "tcp://localhost:1883"
#definieren CLIENTID "testClientC5"
#definieren TOPIC "Sensor/Feuchtigkeit"
#define PAYLOAD "20.3"
#define QOS 1
#define TIMEOUT 10000L
Int AUTHENTIC = 0;
int fertig = 0;
Leere onDisconnect(void* Kontext, MQTTAsync_successData* Antwort
(STÖHNT)
printf("Erfolgsame Trennung\n");
Fertig = 1;
}
ungültig aufConnectFailure(void* Kontext, MQTTAsync_failure Daten* Antwort
(STÖHNT)
printf("Connect fail, rc %d\n", Antwort? > Antwortcode : 0);
Fertig = 1;
}
Leere onConnect(void* Kontext, MQTTAsync_successData* Antwort
(STÖHNT)
printf("Erfolgreiche Verbindung\n");
}
int msgarrvd(void *context, char *topicName, int topicLen, MQTTAsync_message *message)
(STÖHNT)
int i;
char* payloadptr;
printf("Message eingetroffen\n");
Printf(') Thema: %s\n", topName;
printf("-Nachricht: ");
payloadptr = message->payload;
für(i=0; i<message->payloadlen; i++)
(STÖHNT)
putchar(*payloadptr++)
}
putchar('n');
MQTTAsync_freeMessage(&message);
MQTTAsync_free(topicName);
Fertig = 1;
Rückgabe 1;
}
int main(int argc, char* argv[])
(STÖHNT)
• Der Kunde
MQTTAsync Client;
MQTTAsync_createOptionen create_opts = MQTTAsync_createOptionen_initializer;
create_opts.MQTTVersion = MQTTVERSION_5;
int rc = MQTTAsync_createWithOptionen(Client, ADDRESS, CLIENTID, MQTTCLIENT_PERSISTENCE_NONE, NULL, &create_opts);
MQTTAsync_setCallbacks(Client, NULL, NULL, msgarrvd, NULL);
// KONNEKT Eigenschaften
MQTTAsync_connectOptionen conn_opts = MQTTAsync_connectOptionen_initializer5;
(AUTHENTIC == 1)
(STÖHNT)
conn_opts.username = "dev2";
conn_opts.password = "key2";
}
conn_opts.keepAliveInterval = 20;
conn_opts.cleanstart = 1;
conn_opts.onSuccess = onConnect;
Der Präsident Ausfall = onConnectFailure;
conn_opts.context = Client;
MQTTProperties props = MQTTProperties_initializer;
Englisch abbrechen
MQTTProperty property1;
Eigenschaften1.identifier = MQTTPROPERTY_CODE_SESSION_EXPIRY_INTERVAL;
Eigenschaften1.value.integer2 = 90;
MQTTProperties_add(&properties1)
conn_opts.connectProperties = &props
wenn ((rc = MQTTAsync_connect(client, &conn_opts))) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failed to start connect, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Schlaf(1);
Ich bin hier.
wenn (rc = MQTTAsync_subscribe(client, TOPIC, QOS, NULL)) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failing to abonnieren, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Schlaf(1);
Englisch
MQTTAsync_message pubmsg = MQTTAsync_message_initializer;
Scham. Nutzlast = PAYLOAD;
pubmsg.payloadlen = strlen(PAYLOAD);
pubmsg.qos = QOS;
Pubmsg.retained = 0;
Englisch Sie haben es geschafft
MQTTAsync_responseOptionen pub_opts = MQTTAsync_responseOptions_initializer;
pub_opts.context = Client;
MQTTProperties pub_props = MQTTProperties_initializer;
MQTTProperty Eigenschaft3;
Eigenschaften3.identifier = MQTTPROPERTY_CODE_TOPIC_ALIAS;
Eigenschaften3.value.integer4 = 90;
MQTTProperties_add(&pub_property3);
pub_opts.properties = pub_properties;
wenn (rc = MQTTAsync_sendMessage(client, TOPIC, &pubmsg, &pub_opts))) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failed to start sendMessage, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
Schlaf(1);
wenn (rc = MQTTAsync_unsubscribe(client, TOPIC, NULL))) MQTTASYNC_SUCCESS)
(STÖHNT)
printf("Failed to abbestellen, return code %d\n", rc);
Ausstieg (EXIT_FAILURE)
}
(!vollendet)
(STÖHNT)
#if definiert(WIN32) || definiert(WIN64)
Schlaf(100)
#else
Verwendungep(10000L)
#endif
}
MQTTAsync_destroy(&client);
Rückgabe rc;
}
Speichern Sie den Code alsmqtt5Client.c
Compile:
gcc -o mqt5client mqt5lient.c -lpaho-mqt3a -lpaho-mqt3as
Ausführung:
./mqt5client