Utiliser nos modules USB en Java

Utiliser nos modules USB en Java

De nombreux clients nous ont demandé le support Java pour notre libraire, et nous pouvons enfin leur fournir une solution: nous publions aujourd'hui la librairie Java en beta-test. Il reste encore à finaliser la documentation et probablement à corriger quelques bugs, mais toutes les fonctions disponibles dans les autres langages sont implémentées et commentées.




Comment accéder aux périphériques USB depuis Java?

Cette question est loin d'être évidente. Bien que le slogan de Java soit « Write once, run anywhere » la réalité est toute autre. Pour accéder au bus USB (et au hardware de manière générale) il n'existe aucune solution 100 % Java. En voulant créer une abstraction "propre" de la machine, Sun s'est aussi écarté de nombreux scénarios où l'on a besoin d’accéder au matériel. Il existe bien une plateforme qui offre un accès natif aux périphériques USB: Android. Mais cette API n’est disponible que sur les dernières versions de l’OS et peu de téléphones et de tablettes le supportent complètement. Pour les autres architectures, les solutions viables impliquent soit un code non portable, soit l'utilisation d'un logiciel externe qui fera l'abstraction hardware que la JVM aurait dû implémenter dans un monde meilleur. Ce logiciel doit être disponible et installé sur toutes les platformes que l'on voudra supporter.

il n'existe aucune solution 100 % Java
il n'existe aucune solution 100 % Java



Dans notre cas nous allons utiliser la même stratégie que nous avons utilisé pour PHP et JavaScript: utiliser le VirtualHub comme passerelle. Le code Java communique avec le VirtualHub par TCP, et ce dernier est responsable d'accéder aux modules USB nativement et de retransmettre le trafic USB sur le socket TCP. Comme le VirtualHub est disponibles sur les principales plateformes (Windows, Mac OS X ainsi que Linux en 32 bits, 64 bits et ARM), nous pouvons réaliser la promesse de Sun ("Write once, run anywhere") !

Le VirtualHub sert de passerelle pour acceder au module USB
Le VirtualHub sert de passerelle pour acceder au module USB


Un petit exemple

Nous allons écrire un petit programme d’exemple pour illustrer les particularités de la librairie Java. Le but va simplement être d’afficher en boucle la luminosité ambiante sur la ligne de commande.

Avant de commencer à coder, il faut penser à lancer le VirtualHub sur la machine à laquelle les modules sont connectés. Il faudra aussi prendre soin de copier le fichier yoctoAPI.jar dans votre classpath (ou rajouter le répertoire Binaries à votre classpath).

Pour le code, la première chose à faire est d’importer les classes Yoctopuce avec import com.yoctopuce.YoctoAPI.*;. Il faut ensuite enregistrer le VirtualHub qui tourne sur la même machine, en prenant soin d'intercepter les potentielles exceptions. Cette étape va nous permettre d’accéder à tous les modules connectés à la machine.



 try {
    // setup the API to use local VirtualHub
    YAPI.RegisterHub("http://127.0.0.1:4444/");
} catch (YAPI_Exception ex) {
    System.out.println("Cannot contact VirtualHub on 127.0.0.1 (" + ex.getLocalizedMessage() + ")");
    System.out.println("Ensure that the VirtualHub application is running");
    System.exit(1);
}
 



Il nous faut maintenant accéder au capteur de lumière du Yocto-Light. Nous avons deux solutions :
1: utiliser le premier capteur branché
2: accéder à un capteur en particulier en lui spécifiant son identifiant hardware.

On va supporter les deux solutions. Si le programme est lancé sans argument nous utiliserons YLightSensor.FirstLightSensor() pour regarder s'il y a un capteur de lumière branché. Si le programme est lancé avec un identifiant hardware sur la ligne de commande nous le passons directement cette information à YLightSensor.FindLightSensor(args[0] ).


YLightSensor sensor;
if(args.length>0) {
    sensor = YLightSensor.FindLightSensor(args[0] );
} else {
    sensor = YLightSensor.FirstLightSensor();
    if(sensor== null){
        System.out.println("No module connected (check USB cable)");
    }
}
 




Maintenant que nous avons notre objet YLightSensor, le reste est trivial: il ne s’agit que d’une boucle sans fin qui va périodiquement lire la valeur du module et l’afficher. Il faut juste rajouter du code pour intercepter correctement les exceptions (par exemple si on débranche le module durant l'exécution). Pour temporiser la boucle il faut utiliser YAPI.Sleep() qui, en plus d’attendre intelligemment (sans utiliser inutilement le CPU) va périodiquement vérifier la connexion avec le VirtualHub. Dans cet exemple précis, nous n’utilisons aucun callback; nous aurions donc pu utiliser une attente classique (par exemple: Thread.currentThread().sleep(1000);), mais autant prendre tout de suite les bonnes habitudes.


public class Demo {

  /**
   * @param args the command line arguments
   */

  public static void main(String[] args)
  {
    try {
      // setup the API to use local VirtualHub
      YAPI.RegisterHub("http://127.0.0.1:4444/");
    } catch (YAPI_Exception ex) {
      System.out.println("Cannot contact VirtualHub on 127.0.0.1 ("
                         + ex.getLocalizedMessage() + ")");
      System.out.println("Ensure that the VirtualHub application is running");
      System.exit(1);
    }

    YLightSensor sensor;
    if (args.length > 0) {
      sensor = YLightSensor.FindLightSensor(args[0] + ".lightSensor");
    } else {
      sensor = YLightSensor.FirstLightSensor();
      if (sensor == null) {
        System.out.println("No module connected (check USB cable)");
      }
    }
    while (true) {
      try {
        System.out.println("Current ambient light: "
                           + sensor.get_currentValue() + " lx");
      } catch (YAPI_Exception ex) {
        System.out.println("Module not connected (check identification and USB cable)");
      }
      System.out.println(" (press Ctrl-C to exit)");
      YAPI.Sleep(1000);
    }
  }
}

 




Pourquoi publier la librairie en beta ?

Pour plusieurs raisons. Premièrement il est assez sûr qu'il reste encore quelques bugs qui nous ont échappé, et la documentation n'est pas encore complètement traduite. Malgré cela, l'API est utilisable. Si vous avez déjà utilisé une de nos librairies, vous pourrez facilement vous passer de la documentation Java, les objets et les méthodes sont les mêmes que dans les autres langages. Seule la syntaxe spécifique à Java diffère.

Deuxièmement, chaque langage a ses propres conventions et particularités. Même si techniquement le portage de la librairie en Java fonctionne, nous voulons en plus que notre librairie soit intuitive et facile d'accès à tout point de vue. Nous comptons donc sur vos suggestions d'améliorations le cas échéant. De même, nous voulons que nos utilisateurs puissent commencer à coder sans avoir à apprendre un nouvel environnement ou à comprendre comment compiler leur projet avec notre librairie. Pour ce faire, nous fournissons des projets complets permettant de lancer les exemples dans un IDE, pour l'instant seulement pour l'environnement NetBeans que nous utilisons. Nous allons bien sur rajouter Eclipse dans les semaines qui viennent. Là aussi, si vous avez des remarques, n'hésitez pas à nous contacter par mail ou à laisser un commentaire.

Librairie pour Java (beta)

Commenter aucun commentaire
Retour au blog












Yoctopuce, get your stuff connected.