L’Internet des Objets

L’Internet des Objets

23.1 Installation du serveur mosquitto

Page précédente Page suivante

Un serveur MQTT est un serveur intermédiaire entre les capteurs et les applications. Les capteurs collectent des données et ils doivent les publier. Les applications vont collecter les informations et les utiliser. Il permet de découpler les capteurs et les applications. Les données d’un capteur peuvent ainsi être utilisées par de nombreuses applications.

Un serveur MQTT est un serveur intermédiaire. Il attend des connexions depuis des éditeurs publisher) et des souscripteurs. Les actions sont indépendantes. Les publications peuvent se faire même en l’absence de souscripteurs. Un éditeur publie une information sur un sujet (topic). Un souscripteur peut s’abonner à un topic, il recevra les publications à partir de ce moment. La figure 23.1 présente ce mécanisme.

(image)

Fig. 23.1 : Chronogramme MQTT.

Les topics ont une définition libre. Il s’agit d’une chaîne de caractère quelconque. Le caractère / (barre oblique ou slash), permet de définir une hierarchie personnalisée. Il est possible de remplacer une partie du topic par le caractère * qui permet d’écouter n’importe quoi.

23.1.1 Ressources MQTT

Le protocole MQTT est un protocole standardisé par OASIS. La fondation Eclipse propose une implémentation intégrée dans tous les systèmes d’exploitation.

23.1.2 Installation du serveur

Sur une Debian, il faut utiliser le paquet mosquitto. Il y a deux actions à faire : configurer les utilisateurs et configurer le réseau.

Pour les utilisateurs, il faudra autoriser ou interdire les connexions anonymes ou définir des utilisateurs. Le répertoire /etc/mosquitto/conf.d contient les fichiers de configuration. Ensuite, il faut définir si le serveur écoute sur le réseau ou si il se limite aux connexions depuis localhost. voici les manipulations à faire :

# apt install mosquitto

# mosquitto_passwd -c /etc/mosquitto/pwfile mqttuser

# cat conf.d/users.conf
allow_anonymous false
password_file /etc/mosquitto/pwfile

cat conf.d/listen.conf
listener 1883 10.3.30.3

23.1.3 Utilisez des clients

Le paquet mosquitto-clients fournit deux implémentations pour communiquer avec un serveur en ligne de commande. La souscription permet de recevoir les publications envoyées pendant la connexion. La publication permet d’envoyer une information.

Pour s’abonner à un topic, il faut :

stud@archeron:~$ mosquitto_sub -h 10.3.30.3 -u mqttuser -P x -t sensor/temperature/chambre
20-06-11 09:26:26 27.6 62


Et pour publier une information.

arno@archeron:~$ mosquitto_pub -h   10.3.30.3 -u mqtt -P x -t sensor/temperature/chambre -m "20-06-11 09:26:26 27.6 62"


(image)La définition du couple login / mot de passe sur la ligne de commande permet à tous les utilisateurs connectés d’obtenir cette information avec la commande ps.

23.1.4 Le python et le Moustique

Le projet Paho (merci le peuple Maori) propose un support python pour MQTT. Il faut installer le paquet python3-paho-mqtt, ensuite c’est simple à utiliser.

import paho.mqtt.client as MQTT

>>> client.username_pw_set("mqtt","x")
>>> client = MQTT.Client(client_id='publisher-1')
>>> client.username_pw_set("mqtt","x")
>>> client.publish("sensor/temperature/chambre","22222 ij")

>>> client.connect("osiris", 1883, 60)
0
>>> client.publish("sensor/temperature/chambre","22222 ij")

>>>
client.publish("sensor/temperature/chambre","22")


23.1.5 Le moustique codé C

L’utilisation dans un programme C est simple aussi. Il faut utiliser la librairie libmosquitto-dev. Puis, se connecter au serveur et diffuser une information :

#include 
#include 
#include 

#include 

struct mosquitto *mosq = NULL;
char * host = "MQTThost";
char * username = "mqtt" ;
char * pwd "x";



void afmqtt_init()
{
        int port = 1883;
        int keepalive = 60;
        bool clean_session = true;

          mosquitto_lib_init();
          mosq = mosquitto_new(NULL, clean_session, NULL);
          if(!mosq){
                  fprintf(stderr, "Error: Out of memory.\n");
          }
          mosquitto_username_pw_set( mosq, username,pwd);
          if(mosquitto_connect(mosq, host, port, keepalive)){
                  fprintf(stderr, "Unable to connect.\n");
          }
}

void afmqtt_pub(char ID, char * buf, double Res)
{
  int mid;
  char * topic;
  char * topic_head;
  int payloadlen;
  char *payload;
  int qos=0;
  bool retain = false;
  topic="gardi/energie/";
  payload="10/5/61 12,24"
  payloadlen=strlen(payload);

    mosquitto_publish(mosq, &mid, topic,
                      payloadlen,
                      payload,
                      qos,
                      retain);
}

La documentation d’Eclipse n’est pas claire pour expliquer les variables de la fonction de publication.

mosq

la référence de la connexion vers le serveur ;

mid

et un paramètre retourné par la fonction qui pourra être utilisé par une callback ;

topic

une chaîne de caractère précisant le topic publié ;

payload

l’information à transmettre avec sa longueur ;

qos

la qualité de service (un paramètre MQTT) ;

retain

le serveur peut conserver la dernière donnée pour la fournir à un souscripteur qui se connecte après la publication.

Page précédente Page suivante