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.
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.
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 :
- Mettre à jour le système
apt-get update && apt-get upgrade -y
- Installer les paquets nécessaire à la compilation
apt-get install -y g++ make libtool autoconf automake
- 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
- Décompresser l’archive
tar zxvf zeromq-4.0.3.tar.gz
- 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
- 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
- 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 :
- Installer Python
- Installer PyZMQ
sudo easy_install pyzmq
- 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 🙂
Le résultat du client 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.