Publier un topic MQTT en langage C
Documentations :
Installer la librairie
pi@raspberrypi:~ $ sudo apt-get install libmosquitto-dev
Coder un programme permettant de publier à un topic sans couche SSL
Code > fichier mosquittoPublish.c
#include <stdio.h>
#include <string.h>
#include <mosquitto.h>
#define PORT_SERVEUR_MQTT 1883
#define ADRESSE_IP_SERVEUR_MQTT "192.168.56.101"
#define KEEPALIVE 60
// MQTT Utilisateur : user1, mot de passe : IOTPasswd
#define USER_MQTT "user1"
#define PASSWORD_MQTT "bonjour"
#define TOPIC_IOT1_TEMPERATURE "iot1/temperature"
int main(int argc, char *argv[]) {
struct mosquitto *clientMosquitto;
char payload[100];
float temperature = 0.0f;
// Initialiser la librairie
mosquitto_lib_init();
// Créer un client mosquitto
clientMosquitto = mosquitto_new(NULL, true, NULL);
if (clientMosquitto == NULL)
{perror("mosquitto_new()");return -1;}
// Définir l'utilisateur et le mot de passe
mosquitto_username_pw_set(clientMosquitto, USER_MQTT, PASSWORD_MQTT);
// Effectuer la connexion
if (mosquitto_connect(clientMosquitto, ADRESSE_IP_SERVEUR_MQTT, PORT_SERVEUR_MQTT, KEEPALIVE) != MOSQ_ERR_SUCCESS)
{perror("mosquitto_new()");return -1;}
// Publier le topic -> QOs = 1 ; retain = true
temperature = 22.3;
sprintf(payload, "%0.2f",temperature);
mosquitto_publish(clientMosquitto, NULL, TOPIC_IOT1_TEMPERATURE, strlen(payload), payload,1, true);
mosquitto_destroy(clientMosquitto);
mosquitto_lib_cleanup();
return 0;
}
Compiler
pi@raspberrypi:~ $ gcc -o mosquittoPublish mosquittoPublish.c -lmosquitto
Abonnement
doe@debian:~$ mosquitto_sub -h localhost -u user1 -P bonjour -t 'iot1/temperature' 22.30
Publication
pi@raspberrypi:~ $ ./mosquittoPublish
Coder un programme permettant de publier à un topic avec une couche SSL
Code > fichier mosquittoPublishSSL.c
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <mosquitto.h>
#define PORT_SERVEUR_MQTT 8883
#define ADRESSE_IP_SERVEUR_MQTT "broker.btscielmichelet.lan"
#define KEEPALIVE 60
// MQTT Utilisateur : user1, mot de passe : IOTPasswd
#define USER_MQTT "user1"
#define PASSWORD_MQTT "IOTPasswd"
// certificat serveur
#define CA_CRT "ca.crt"
// Cle privee et certificat client
#define CLIENT_KEY "client1.key"
#define CLIENT_CRT "client1.crt"
#define TOPIC_IOT1_TEMPERATURE "iot1/temperature"
void on_connect(struct mosquitto *mosq, void *obj, int reason_code) {
printf("Connect: callback, rc=%d\n", reason_code);
}
void on_disconnect(struct mosquitto *mosq, void *obj, int rc) {
printf("Disconnect: callback, rc=%d\n", rc);
}
void on_log(struct mosquitto *mosq, void *obj, int level, const char *str) {
printf("Log: %s\n", str);
}
int main(int argc, char *argv[]) {
struct mosquitto *clientMosquitto;
char payload[100];
float temperature = 0.0f;
// Initialiser la librairie
mosquitto_lib_init();
// Créer un client mosquitto
clientMosquitto = mosquitto_new(NULL, true, NULL);
if (clientMosquitto == NULL)
{perror("mosquitto_new()");return -1;}
mosquitto_connect_callback_set(clientMosquitto, on_connect);
mosquitto_disconnect_callback_set(clientMosquitto, on_disconnect);
mosquitto_log_callback_set(clientMosquitto, on_log);
// Définir l'utilisateur et le mot de passe
mosquitto_username_pw_set(clientMosquitto, USER_MQTT, PASSWORD_MQTT);
// Définir la sécurité SSL
int retour = mosquitto_tls_set(clientMosquitto, CA_CRT, NULL, CLIENT_CRT, CLIENT_KEY, NULL);
if (retour != MOSQ_ERR_SUCCESS)
{fprintf(stderr, "Error setting TLS options: %s\n", mosquitto_strerror(retour)); return -1;}
retour = mosquitto_tls_opts_set(clientMosquitto, 1, "tlsv1.2", NULL);
if (retour != MOSQ_ERR_SUCCESS) {
fprintf(stderr, "Error setting TLS options: %s\n", mosquitto_strerror(retour));
return 1;
}
// Effectuer la connexion
retour = mosquitto_connect(clientMosquitto, ADRESSE_IP_SERVEUR_MQTT, PORT_SERVEUR_MQTT, KEEPALIVE);
if (retour != MOSQ_ERR_SUCCESS)
{fprintf(stderr, "Unable to connect: %s\n", mosquitto_strerror(retour)); return -1;}
mosquitto_loop_start(clientMosquitto);
// Publier le topic -> QOs = 1 ; retain = false
temperature = 22.3;
sprintf(payload, "%0.2f",temperature);
mosquitto_publish(clientMosquitto, NULL, TOPIC_IOT1_TEMPERATURE, strlen(payload), payload,1, false);
sleep(1);
mosquitto_loop_stop(clientMosquitto, true);
mosquitto_destroy(clientMosquitto);
mosquitto_lib_cleanup();
return 0;
}
Abonnement
doe@client2:~$ mosquitto_sub -h broker.btscielmichelet.lan -u user1 -P IOTPasswd -p 8883 --cafile ca.crt --cert client2.crt --key client2.key -d -t '#' Client (null) sending CONNECT Client (null) received CONNACK (0) Client (null) sending SUBSCRIBE (Mid: 1, Topic: #, QoS: 0, Options: 0x00) Client (null) received SUBACK Subscribed (mid: 1): 0
Publication
doe@client1:~$ ./mosquittoPublishSSL Log: Client (null) sending CONNECT Log: Client (null) sending PUBLISH (d0, q1, r0, m1, 'iot1/temperature', ... (5 bytes)) Log: Client (null) received CONNACK (0) Connect: callback, rc=0 Log: Client (null) received PUBACK (Mid: 1, RC:0)
Résultat abonnement
doe@client2:~$ Client (null) received PUBLISH (d0, q0, r0, m0, 'iot1/temperature', ... (5 bytes)) 22.30