Java et l'accès natif aux ports USB

Java et l'accès natif aux ports USB

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").

try {

  // 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 Windowsavec la variable d'environnement PATH
sous Linuxavec la variable d'environnement LD_LIBRARY_PATH
sous OS Xavec 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:

  System.setProperty("java.library.path", "c:\example\yoctopuce\library");



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 bitsyapi.dll
Windows 64 bitsyapi64.dll
Linux 32 bitslibyapi-i386.so
Linux 64 bitslibyapi-amd64.so
Linux ARMlibyapi-armhf.so
Linux ARM 64 bitslibyapi-aarch64.so
Mac OS Xlibyapi.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
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.

Commenter aucun commentaire Retour au blog












Yoctopuce, get your stuff connected.