1

J'ai besoin de créer une application Web (qui vit dans le navigateur) qui peut se connecter et lire des données à partir de périphériques connectés via USB ou le port série.Comment puis-je "sortir" du sandbox du navigateur?

À l'heure actuelle, j'utilise un contrôle ActiveX pour ce faire. Cependant, je voudrais réécrire ce système pour le rendre cross-browser (support Firefox) et éventuellement multi-plateforme (support Safari sur Mac). ActiveX n'est ni inter-navigateur ni multi-plateforme, donc je suis à la recherche d'une technologie alternative.

Ma première préférence aurait été d'utiliser Silverlight, car Silverlight 4 donne accès à COM Automation. Malheureusement, cela fonctionne uniquement avec OOB (Hors navigateur) Les applications Silverlight - les systèmes dans le navigateur sont toujours liés dans un sandbox et n'ont pas accès. Alors, quelles technologies existent (frameworks, plug-ins de navigateur, etc.) qui me permettront d'interfacer avec un périphérique USB/Serial à partir d'une application Web basée sur un navigateur? Quels sont les avantages/inconvénients de chacun?

+2

Votre titre n'est pas vraiment approprié ici. Vous ne devriez pas essayer de "casser" le bac à sable du navigateur. Vous devriez utiliser les API appropriées pour accorder la confiance à votre application (la JVM/Java si vous voulez une plate-forme x) – x0n

Répondre

0

la meilleure solution que je suis venu Acros s jusqu'ici est le système de plug-in cross-browser/cross-platform appelé FireBreath. Ceci est un framework construit en C++ qui vous permet de générer des plug-ins pour les deux ActiveX et NPAPI à partir de la même base de code. Alors construisez-le une fois, faites le fonctionner, et il compile en une DLL que vous pouvez déployer dans l'un ou l'autre environnement: ActiveX pour IE, NPAPI pour tout le monde.

1

Je pense que votre meilleur pari est probablement Java dans ce cas. L'USB, bien qu'un standard de l'industrie en termes de protocole ne soit définitivement pas standardisé en termes d'implémentation bare-metal. Pour cette raison, vous aurez toujours besoin d'une implémentation Java USB différente pour chaque plate-forme distincte (windows, linux, osx, bsd) que vous avez l'intention de prendre en charge. Bien sûr, vous devrez également payer pour les certificats de signature de code afin que vous puissiez essayer de convaincre les gens d'accorder à votre application le type d'accès dont elle a besoin; quelque chose que les navigateurs essaient très fort de refuser l'accès à et la plupart des gens de ce jour et sont très réticents à accorder. Cela dit, il y a un vieux article d'IBM ici sur les différents projets Java USB qui fait une bonne lecture. Bonne chance.

http://www.ibm.com/developerworks/library/j-usb.html

-Oisin

1

Il peut être douloureux, mais vous pouvez utiliser un signed Java applet. Les applets Java signés peuvent avoir un accès complet au système de l'utilisateur. Java ne dispose pas d'un support USB intégré, vous devrez donc probablement ajouter votre propre interface JNI aux API USB natives. L'utilisation de JNI dans une applet peut être difficile. Je l'ai déjà fait. Si vous Google le sujet, la plupart des résultats disent "ne le faites pas" ou "vous ne pouvez pas le faire". Eh bien, vous pouvez le faire.

Voici comment je l'ai fait: J'ai empaqueté les bibliothèques natives (DLL, etc.) dans le JAR de l'applet, puis j'ai lu les bibliothèques natives hors du JAR en utilisant par exemple. getResourceAsStream. J'ai ensuite écrit les bibliothèques à un emplacement approprié sur le disque (par exemple $ {user.home}/.monapp /.) J'ai ensuite utilisé System.load pour charger la DLL JNI.

Il peut y avoir des problèmes de ClassLoader avec les bibliothèques JNI et les applets. Les problèmes sont subtils et difficiles à expliquer. Ils ont essentiellement à voir avec le fait qu'une JVM ne peut charger et lier une bibliothèque JNI donnée qu'une fois par instance de machine virtuelle, mais les applets sont beaucoup instanciés, souvent avec leur propre ClassLoader, ce qui peut être problématique. Le travail effectué par Sun sur la séparation de processus dans le Next Generation Browser Plugin a peut-être résolu certains de ces problèmes, mais vos utilisateurs n'en auront que s'ils utilisent Java 1.6.0_10 ou une version ultérieure.

Il est également possible d'utiliser JNA dans une applet signée.Je ne recommanderais pas d'utiliser JNA pour accéder directement aux API USB. Mais JNA peut parfois être un gros gain de temps pour accéder à des fonctions natives simples. Bien qu'une fois que vous avez configuré votre infrastructure JNI, la JNA a probablement moins de valeur.


Voici quelques autres pensées au hasard:

  1. Java WebStart - Peut être lancé à partir du navigateur, mais fonctionne en dehors du navigateur
  2. Microsoft ClickOnce - Peut être lancé à partir du navigateur, mais fonctionne en dehors le navigateur
  3. flash/AIR - ne peut pas échapper à son bac à sable
Questions connexes