ZeroMQ sur le Raspberry Pi pour lier vos systèmes

Nous avions déjà vu comment installer le broker de message RabbitMQ. Ici vous allez pouvoir installer le broker qui monte, multi plateforme : ZeroMQ.

logo

Dans les objectifs d’un fournisseur de messages, il y a la belle théorie :

  • Simplifier le transport
  • Délivrer un message à un ou plusieurs destinataires
  • Demander des informations à un serveur distant
  • S’abonner à des publications
  • Transformer des messages pour l’interopérabilité des systèmes

Ce qui est sympa avec ZeroMQ c’est qu’en plus de proposer ces fonctionnalités, il est multi plateformes (Windows, Mac, Linux, iOS, Android, etc.), peut être utilisé dans plus de 40 languages de programmation, est rapide et peut fonctionner sur des systèmes avec peu de mémoire. Donc le Raspberry Pi ! Et il est loin de valoir le prix d’un IBM Websphere Integration Bus puisqu’il est Open Source !

Pour bien comprendre toutes les fonctionnalités proposées par ZeroMQ, je vous invite à regarder ce lien qui explique les fonctionnalités principales.

ZeroMQ-Functions

Je vous propose donc de mettre en place un client-serveur simple pour illustrer l’usage de ZeroMQ. Nous allons donc installer le broker sur le Raspberry Pi dans un premier temps. Ca sera notre serveur :

  1. Mettre à jour le système
    apt-get update && apt-get upgrade -y
  2. Installer les paquets nécessaire à la compilation
    apt-get install -y g++ make libtool autoconf automake
  3. Télécharger la dernière version (4.0.3 au moment de la rédaction)
    wget http://download.zeromq.org/zeromq-4.0.3.tar.gz
  4. Décompresser l’archive
    tar zxvf zeromq-4.0.3.tar.gz
  5. Compiler et installer ZeroMQ
    cd zeromq-4.0.3
    ./configure
    make
    make install
    ldconfig

Vous voila avec votre ZeroMQ prêt à l’emploi. Ou presque. Reste à mettre en place le programme pour gérer vos échanges.

Je vous propose un serveur simple en Python

  1. Coté Raspberry Pi, le serveur, nous allons installer le « binding » en Python, donc en fait la librairie qui va vous permettre d’utiliser ZeroMQ via des programmes Python.
    apt-get install python-pip python-all-dev
    pip install pyzmq
  2. Voici le source du programme qui va être le serveur. Alors j’espère que les commentaires sont assez clairs :
    #!/usr/bin/env python
    
    # Import basic packages
    import os
    import sys
    import time
    
    # Import ZeroMQ package
    import zmq
    
    print "Starting Pi Home Server ZeroMQ server"
    # Initialize the ZeroMQ context
    context = zmq.Context()
    
    # Configure ZeroMQ to send messages
    zmq_send = context.socket(zmq.PUB)
    # The communication is made on socket 1111
    zmq_send.bind("tcp://*:1111")
    print "Sending messages on tcp://*:1111"
    
    # Configure ZeroMQ to receive messages
    zmq_recv = context.socket(zmq.SUB)
    # The communication is made on socket 1112
    zmq_recv.bind("tcp://*:1112")
    zmq_recv.setsockopt(zmq.SUBSCRIBE, '')  # subscribe to everything
    print "Receiving messages on tcp://*:1112"
    
    print "Pi Home Server ZeroMQ server running !"
    while True:
        message = None
        answer = None
    
        # Command to wait for an incoming message
        try:
            # Capture the message and store it
            message = zmq_recv.recv()
            print "Message received : " + message
        except zmq.ZMQError as err:
            print "The server received the following error message : " + str(err)
    
        # A message has been received
        if message:
            answer = str(int(message) * 2)
            try:
    	    print "Sending answer : " + answer
                zmq_send.send(answer)
            except zmq.ZMQError as err:
                print "Error while trying to send the answer : " + str(err)
    
    # Never reached in theory ...
    zmq_send.close()
    zmq_recv.close()
    context.term()
    print "The server has been closed !"

Coté client, j’ai choisi de faire ça sur mon Mac, en Python toujours (Java je n’ai pas réussi à compiler comme je voulais). Pour ça :

  1. Installer Python
  2. Installer PyZMQ
    sudo easy_install pyzmq
  3. Et voici la partie client :
    #!/usr/bin/env python
    
    import os
    import sys
    import time
    
    import zmq
    
    context = zmq.Context()
    
    # Configure ZeroMQ to send messages
    zmq_recv = context.socket(zmq.SUB)
    # The communication is made on socket 1111
    zmq_recv.connect("tcp://192.168.1.33:1111")
    
    # Configure ZeroMQ to receive messages
    zmq_send = context.socket(zmq.PUB)
    # The communication is made on socket 1112
    zmq_send.connect("tcp://192.168.1.33:1112")
    zmq_recv.setsockopt(zmq.SUBSCRIBE, '')
    
    print "Pi Home Server ZeroMQ client running !"
    
    while True:
        print "Input value to send : "
        message = raw_input().strip()
    
        if message:
            try:
                print "Sending value : " + message
                zmq_send.send(message)
            except zmq.ZMQError as err:
                print "Error while trying to send the value " + message + " : " + str(err)
    
        try:
            incoming_message = zmq_recv.recv()
            print "Value received from the server : " + incoming_message
        except zmq.ZMQError as err:
            print 'Receive error: ' + str(err)

Donc le serveur attend une valeur, la multiplie par 2 et retourne le résultat au client. Oui c’est très utile je sais … C’est l’intention qui compte 🙂

ZeroMQ client

Le résultat du client ZeroMQ

ZeroMQ server

Le résultat du serveur ZeroMQ

Voilà donc le grand principe. Ce système peut être très pratique pour relier vos systèmes, centraliser des traitements, etc. C’est rapide et vraiment simple à mettre en place.

N’hésitez pas à partager vos idées d’utilisations à la maison ou même dans un cadre professionnel !

D’autres infos et exemples ici.

Vous aimez cet article ? Supportez-moi sur Patreon!

Vous aimerez aussi...