Multicast

Top Page

Reply to this message
Author: Frédéric
Date:  
To: Guilde
Subject: Multicast
Bonjour,

Je suis en train de développer un framework python pour le bus domotique
KNX :

    http://www.pknyx.org


Lors du fonctionnement normal, la communication entre les devices de ce
bus se fait comme suit : l'apui sur un bouton (par exemple) va envoyer une
trame multicast qui va comporter une adresse de groupe ; les devices
programmés avec cette adresses de groupe, et eux seuls, vont réagir
et lire la trame, et éventuellement réagir (en fonction de la donnée
envoyée en même temps). Le bouton, lui, ne sait pas qui a réagit. Le
gros avantage, c'est que même si un device ne marche plus, le reste
continue de marcher.

Il existe des passerelles pour relier le bus (filaire) à un réseau
ethernet.

Côté ethernet, ces trames multicast peuvent être mapées simplement (si la
passerelle fait office de routeur) sur des trames ethernet multicast UDP.

Dans mon framework, j'ai donc écrit un socket multicast pour
envoyer/recevoir ces trames vers/depuis la passerelle-routeur.

Voici le code de ce socket :

    http://www.pknyx.org/browser/trunk/pknyx/stack/multicastSocket.py


Il marche très bien en tant que tel.

Ce socket est utilisé dans le framework au niveau du transceiver de la
couche 2 de la pile OSI (link layer) :

    http://www.pknyx.org/browser/trunk/pknyx/stack/transceiver/udpTransceiver.py


Comme vous le voyez, j'ai 2 threads reliés à des queues : un pour
recevoir, un pour envoyer. Chacun utilisant une instance propre du socket
multicast.

Et c'est là que ça coince... Le socket de reception semble 'consommer' les
données envoyées par le socket d'émission ! Celles-ci ne parviennent plus
à la passerelle-routeur. Bien sûr, je vois localement mes données émises
(boucle), mais ça ne me pose pas de problème.

À la limite, je comprend cette histoire de boucle, qui boufferait les
données, lesquelles ne seraient alors plus transmises, mais ce qui est
moins compréhensible, c'est que si je lance une autre instance de ma pile
sur la même machine, elle reçoit bien également ces données ! Mais pas la
passerelle-routeur...

Je n'ai pas pu faire de tests sur une autre machine locale pour vérifier
si les données arrivent ou pas.

D'après vous, ce comportement est-il normal ? Comme je ne connais pas trop
le mécanisme multicast, c'est peut-être le cas. J'aimerais comprendre
comment ça fonctionne exactement, et comment contourner mon problème.

Par exemple, est-ce que je peux utiliser le même socket pour
envoyer/recevoir (utilisé donc dans 2 threads différents) ? Les données
seront-elles 'consommées' localement, ou se propageront-elles bien ? Cela
risque-t-il de pose d'autres problèmes ?

Merci d'avance pour vos lumières.

-- 
    Frédéric