YoctoHubs et Discovery

YoctoHubs et Discovery

Vous l'aviez peut-être deviné pour avoir déjà utilisé Yocto-Discovery, mais si votre application Yoctopuce utilise des hubs réseau elle n'a pas forcément besoin de connaître leur adresse IP pour établir une communication avec eux. Elle peut essayer de les découvrir par elle-même: les YoctoHub-Ethernet et YoctoHub-Wireless implémentent le protocole SSDP (Simple Service Discovery Protocol) qui permet de découvrir des équipements présents sur un réseau local.


Dans presque toutes les librairies de programmation Yoctopuce, vous trouverez des exemples qui permettent de découvrir les hubs Yoctopuce présents sur votre réseau. En fait, il existe deux variantes du code de discovery.

Variante 1

La première technique consiste à utiliser YAPI.RegisterHubDiscoveryCallback() pour mettre en place un callback qui sera appelé à chaque fois qu'un hub sera découvert, puis à attendre que les hubs se manifestent. Attention le callback ne sera appelé que pendant un appel à YAPI.UpdateDeviceList().

Le callback sera appelé à chaque fois qu'un hub se sera manifesté. Les paramètres d'appel du callback sont le numéro de série et la chaîne de caractères que vous pourrez employer pour vous connecter au hub à l'aide d'un appel à YAPI.RegisterHub(). L'exemple le plus simple qu'on puisse écrire ressemble un peu au code ci-dessous, c'est du Python, mais ça marche aussi dans la plupart des autres langages.

from yocto_api import *

def HubDiscovered(serial, url):
    print("hub found: " + serial + " (" + url + ")")

YAPI.RegisterHubDiscoveryCallback(HubDiscovered)
errmsg = YRefParam()

# wait for 30 seconds, doing nothing but waiting
for j in range(30):
    YAPI.UpdateDeviceList(errmsg)
 YAPI.Sleep(1000, errmsg)


Lorsque vous appelez YAPI.RegisterHubDiscoveryCallback(), l'API broadcaste automatiquement un paquet UDP sur le réseau local, demandant à tous les appareils connectés à ce réseau de se manifester. UDP ne permettant pas de garantir que chaque paquet arrivera à destination, ce paquet de discovery est en fait envoyé deux fois avec un petit temps d'attente aléatoire entre les deux paquets. Lorsqu'ils reçoivent un des ce paquets, les équipements réseau qui supporte SSDP répondent par l'intermédiaire d'un paquet UDP pour s'annoncer. En pratique, il y a un petit risque pour que tout le monde essaye de répondre plus ou moins en même temps et que quelques réponses se perdent. C'est pourquoi chaque hub, quand il reçoit un paquet de discovery SSDP, s'annonce deux fois de suite avec un intervalle plus ou moins aléatoire avant chacune des deux réponses.

Le callback HubDiscoveryCallback() étant systématiquement appelé à chaque réponse reçue, il y a donc des chances pour qu'il soit appelé jusqu'à quatre fois par hub trouvé. C'est normal, et c'est à vous de filtrer si nécessaire les hubs que vous connaissez déjà. Dans les exemples de la librairie, c'est fait à l'aide d'un simple dictionnaire

Par ailleurs il faut savoir que les hubs annoncent spontanément leur présence au démarrage et ensuite deux fois par heure. Si vous avez besoin de relancer un cycle de discovery, vous pouvez appeler YAPI.TriggerHubDiscovery().

Variante 2

Il existe une seconde méthode qui permet de découvrir tous les hubs présents sur un réseau local: si vous appelez YAPI.RegisterHub() avec le paramètre "net" cela aura pour effet lancer une discovery et d'enregistrer automatiquement tous les hubs qui répondent. Vous pouvez alors détecter l'arrivée des hubs avec un YAPI.RegisterDeviceArrivalCallback().

from yocto_api import *

def arrivalCallback(dev):
    print("new device : " + dev.get_friendlyName())

errmsg = YRefParam()
if YAPI.RegisterHub("net", errmsg) != YAPI.SUCCESS:
    sys.exit("init error" + errmsg.value)

YAPI.RegisterDeviceArrivalCallback(arrivalCallback)

# wait for 30 seconds, doing nothing.
for j in range(30):
    YAPI.UpdateDeviceList(errmsg)
    YAPI.Sleep(1000, errmsg)



Avec cette méthode, l'API va littéralement faire l’équivalent d'un YAPI.RegisterHub() sur tous les hubs réseau qu'elle va trouver, ce qui veut dire que non seulement on va recevoir un DeviceArrivalCallback pour chaque hub trouvé mais aussi pour tous les modules qui leur sont raccordés.

Limitations

La fonctionnalité discovery de l'API a des limitations: pour que cela fonctionne, il faut que tous les acteurs concernés puissent recevoir des paquets UDP sur le port 1900. Donc si ça ne marche pas du tout, commencez par vérifier la configuration de vos firewalls. D'autre part, il faut savoir SSDP étant basé sur des adresses multicast, les paquets SSDP ne pourront pas passer d'un sous-réseau à l'autre, à moins que vous n'ayez explicitement configurés vos routeurs pour qu'ils acceptent de les laisser passer. De plus les paquets SSDP ne peuvent en aucun cas sortir de votre réseau local. En d'autres termes, la plupart du temps vous ne pourrez voir que les hubs qui sont sur le même sous-réseau que la machine qui fait tourner votre code de discovery.

SSDP n'est pas implémenté dans les YoctoHub-GSM parce que ça ne rimerait à rien, les YoctoHub-GSM ne se retrouveront jamais sur le même réseau local que la machine qui fait tourner votre code.

La discovery n'est pas disponible dans les librairies JavaScript, Typescript et PHP parce que ce sont des langages qui ne permettent pas d'envoyer ni de recevoir facilement un paquet UDP.

L'API filtre les réponses SSDP qu'elle reçoit et ne garde que ce qui a un rapport avec du matériel Yoctopuce. Vous ne pourrez pas l'utiliser pour découvrir des équipements non Yoctopuce.

Désactivation

Si, pour de raisons qui vous appartiennent, vous n'avez pas envie que des applications puissent découvrir vos hubs Yoctopuce , pour pouvez désactiver cette fonctionnalité dans leur configuration réseau avec, par exemple, l'API en ligne de commande. Supposons que l'adresse IP du hub dont vous voulez désactiver la discovery soit 192.168.1.123, la ligne de commande sera:

C:\>ynetwork -r 192.168.1.123 -s any set_discoverable 0


Une dernière chose

On a récemment découvert et corrigé un bug dans le code de discovery des YoctoHubs. Si vous prévoyez d'utiliser cette fonctionnalité, vous aurez avantage à mettre le firmware de tous vos hub à jour :-)

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.