Ressources informatiques

Ressources informatiques

Ressources informatiques

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