Cette semaine, nous publions un nouvelle version de la librairie Java. Cette nouvelle mouture apporte une nouvelle fonctionnalité : l’accès USB natif. Désormais, il est possible d’accéder aux ports USB sans exécuter le VirtualHub.
Grâce à la nouvelle version de notre librairie Java, il est possible d’accéder aux modules Yoctopuce connectés à la machine qui exécute le code Java sans utiliser le VirtualHub. L'utilisation des modules USB fonctionne de la même manière que dans les langages C++, C#, Objective-C, Delphi, VB-Net et Python.
Pour accéder aux ports USB, il faut simplement remplacer vos appels à YAPI.RegisterHub("localhost") par YAPI.RegisterHub("usb").
// sets up the API to use direct USB access
YAPI.RegisterHub("usb");
System.out.println("Device connected by USB");
YModule module = YModule.FirstModule();
while (module != null) {
System.out.println(module.get_serialNumber());
module = module.nextModule();
}
YAPI.FreeAPI();
} catch (YAPI_Exception ex) {
System.out.println("error:" + ex.getLocalizedMessage());
System.exit(1);
}
Il y a cependant une petite astuce...
D'origine, la JVM ne peut pas accéder aux ports USB de la machine. Pour contourner cette limitation, nous avons utilisé JNI pour charger une librairie dynamique écrite en C.
Notre nouvelle librairie est donc composée de deux parties:
- Le code Java qui contient les objets de notre librairie
- Une librairie dynamique yapi pour chaque plateforme (Windows 32bits, Windows 64 bits, Linux 32bits...)
Le code Java peut être directement copié dans votre projet et compilé, mais il est aussi possible d'ajouter le fichier YoctoLib.jar à votre classpath.
Cependant, la librairie dynamique doit être installée sur la machine qui exécute l'application. Il faut copier la librairie yapi dans un répertoire listé dans la propriété java.library.path de la JVM. Cette propriété est une liste de répertoires dans lesquels la JVM recherche les librairies dynamiques. Par défaut, cette propriété est initialisée comme suit:
sous Windows | avec la variable d'environnement PATH |
sous Linux | avec la variable d'environnement LD_LIBRARY_PATH |
sous OS X | avec la variable d'environnement DYLD_LIBRARY_PATH |
Si l'on désire utiliser d'autres répertoires, il est possible de modifier cette propriété dans le code de l'application avec le code suivant:
Mais il est aussi possible de spécifier cette propriété à l'exécution depuis la ligne de commande avec l'option "-D".
$ java -Djava.library.path=c:\example\yoctopuce\library MainClass
Contrairement au code Java qui fonctionne sur n'importe quel OS, chaque libraire est du code C compilé pour fonctionner sur une plateforme bien spécifique. C'est pour cette raison que nous avons plusieurs binaires pour cette librairie. Vous pouvez soit installer uniquement la bonne version soit tous les fichiers, le code est suffisamment malin pour utiliser la bonne version.
La liste des versions de la libraire dynamique yapi:
Windows 32 bits | yapi.dll |
Windows 64 bits | yapi64.dll |
Linux 32 bits | libyapi-i386.so |
Linux 64 bits | libyapi-amd64.so |
Linux ARM | libyapi-armhf.so |
Linux ARM 64 bits | libyapi-aarch64.so |
Mac OS X | libyapi.dylib |
L'archive de la librairie Java n'inclut que les binaires déjà compilés, mais il est tout à fait possible de la recompiler en téléchargeant la librairie C++.
Lors de l’exécution de l'application, la JVM commence par charger le code Java et l'exécuter, sans s'occuper de la librairie dynamique. C'est uniquement lors de l'appel à YAPI.RegisterHub("usb") qu'elle va parcourir tous les répertoires de la propriété "java.library.path" pour trouver la librairie dynamique yapi. Si aucune librairie compatible n'est trouvée une exception est levée, sinon la librairie est chargée par la JVM et l’exécution continue.
La partie Java de notre librairie est prévue pour fonctionner avec ou sans la librairie dynamique yapi. Évidement, si la librairie dynamique n'est pas présente, il n'est pas possible d’accéder directement aux ports USB à l'aide de l'appel YAPI.RegisterHub("usb"), mais il est toujours possible d’utiliser le VirutalHub ou de se connecter à un YoctoHub.
La libraire Java peut être utilisée avec un YoctoHub, avec le VirtualHub ou avec les ports USB de la machine
Voilà, vous pouvez désormais accéder directement aux modules qui sont branchés aux ports USB de votre machine.