VirtualHub, Hostname et RegisterHub()

VirtualHub, Hostname et RegisterHub()

Alors comme ça, vous adorez les produits Yoctopuce et vous en mettez un peu partout, connectés à des Raspberry-Pi sur lesquels vous faites tourner des VirtualHub. C'est génial! merci pour votre confiance. Mais il y a quand même un truc qui cloche: vous n'arrivez pas à écrire un programme Yoctopuce qui se connecte à deux machines en même temps...

A chaque fois que vous appelez YAPI.RegisterHub() avec l'adresse IP d'un de vos Raspberry Pi, les modules des Raspberry Pi déjà enregistrés disparaissent mystérieusement. Figurez-vous que ce problème n'est pas une limitation de l'API mais la conséquence d'une vilaine erreur de configuration.

Fonctionnement de l'API Yoctopuce

Pour identifier sans ambigüité chaque module Yoctopuce, l'API utilise une caractéristique commune à tous nos modules: ils ont un numéro de série unique. Quelque soit la manière dont vous vous y prenez dans votre code pour retrouver un module, en interne l'API commence toujours par trouver le numéro de série correspondant et l'utilise ensuite pour travailler. L'avantage de cette manière de faire, c'est que les numéros de série de modules étant attribués en usine, on peut être sûr qu'ils sont uniques et qu'aucun conflit n'apparaitra. En fait il y a une petite exception à ce principe.

Le numéro de série des VirtualHub

Le VirtualHub est l'équivalent software d'un YoctoHub, à moins que ce ne soit le contraire. Quoi qu'il en soit, pour que l'API fonctionne avec un VirtualHub, ce dernier doit avoir un numéro série unique. C'est pourquoi à chaque exécution le VirtualHub génère dynamiquement son numéro de série en se basant sur le hostname de la machine qui l'héberge.

Le numéro de série d'un VirtualHub, généré à partir du nom de la machine hôte
Le numéro de série d'un VirtualHub, généré à partir du nom de la machine hôte


RegisterHub et les Raspberry Pi

Cette manière de faire peut entraîner un petit problème quand une machine est installée depuis une image monolithique pré-configurée, les Raspberry PI sont un cas typique. Assez logiquement, les machines installées depuis la même image ont exactement les mêmes réglages y compris le même hostname. Il se trouve que des VirtualHub qui tournent sur des machines qui ont le même hostname auront le même numéro de série et ça, c'est pas un super plan.

Lorsque vous faites un registerHub() de l'adresse IP de la première de vos machines, l'APi va contacter le VirtualHub qui tourne sur cette machine, lui demander plein d'information, y compris son numéro de série et la liste des modules connectés puis classer tout ça en utilisant le numéro de série comme index. Lorsque vous faites un registerHub() de l'adresse IP d'une seconde machine mais qui a le même hostname, l'API va contacter le second VirtualHub, lui demander son numéro de série et va se rendre compte qu'elle le connait déjà et croire qu'elle discute avec le premier VirtualHub. Elle va remarquer que les modules trouvés lors de la première connexion ne sont plus listés et en conclure qu'ils ont été débranchés. Ceci explique cela.

Comment corriger le problème

La solution est toute simple: faites en sorte que toutes les machines présentes sur le même sous réseau aient un hostname différents. Et rappellez-vous qu'un hostname est censé être unique, l'ignorer c'est s'exposer à des comportements réseau un peu bizarres.


Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.