web-dev-qa-db-fra.com

Écrire des données sur USB HID à l'aide de Javascript, HTML5 ou de tout langage multiplateforme (supporte Android)

J'ai écrit une interface utilisateur en HTML5 et JavaScript. J'ai choisi cette implémentation pour pouvoir partager le même code entre Android Chrome et Windows 8 RT.

Maintenant, mon prochain objectif est d’écrire des données sur un HID USB. Le périphérique avec lequel je communique est traité comme un HID. Je mentionne cette partie au cas où il serait possible d'écrire sur un périphérique HID plutôt que sur un périphérique USB RAW.

J'ai fait beaucoup de recherches sur le sujet. Mais les spécifications HTML5 changent si souvent que j'ai peut-être oublié quelque chose.

Quoi qu'il en soit, quelqu'un peut-il suggérer un langage ou une implémentation que je peux utiliser pour partager le code commun permettant d'accéder à un périphérique USB sous Android et Windows 8 RT? S'il n'y a pas moyen de partager entre les deux, pourquoi ne pas suggérer que la communication USB ne fonctionne qu'avec Android?


Ci-dessous, mes recherches et conclusions:

  • Silverlight: UNSUPPORTED. En termes de plug-in Web, non pris en charge sous Windows 8 RT ou Android

  • Flash: option possible. Pris en charge dans les deux systèmes d'exploitation, bien qu'ils aient supprimé le support pour Android avec la sortie de Jelly Bean

  • HTML5: UNSUPPORTED

    • Regardé l'API GamePad, mais il semble ne supporter que la lecture à partir d'un gamepad
    • Examine la balise de périphérique, mais cette balise n'existe plus dans le brouillon actuel. J'ai lu que l'objet "navigator" le remplace en Javascript, mais il semble complètement différent. De plus, l'appareil cible uniquement l'acquisition de vidéo et d'audio
  • JavaScript: UNSUPPORTED. Si j'ai bien compris, c'est parce que ce serait un risque pour la sécurité.

  • Application fournie avec Chrome: UNSUPPORTED. Pas sûr de la prise en charge de Windows 8 RT. Mais, il n'est pas non plus pris en charge dans Android Chrome.

    • Un API USB existe qui répond exactement à mes besoins, mais l'API n'est disponible que pour une application packagée
  • Applet Java: UNSUPPORTED. Pas sûr de la prise en charge de Windows 8 RT. Mais, il n'est pas non plus pris en charge dans Android Chrome.

    • Nombreuses ressources disponibles sur la façon de communiquer avec des périphériques USB. Cependant, étant donné que les applets Java ne sont pas pris en charge sur les smartphones, cela finit par ne plus être pris en charge.
  • Quelques articles utiles

13
cheezy

J'ai en fait réfléchi à la façon de faire des choses semblables à celles-ci ...

Voici un moyen sûr de le faire si vous avez le contrôle sur l'ordinateur auquel le périphérique USB est connecté:

Demandez à l'ordinateur avec le périphérique USB d'exécuter un serveur Web tel que Apache/php. Faites-le uniquement écouter localhost.

Ensuite, dans la page html affichée, exécutez une publication ajax sur localhost/somescript.php (ou cgi, cfm ou autre). 

Dans le script php/cgi, communiquez avec le périphérique USB, puis renvoyez une chaîne JSON au navigateur en indiquant que quelque chose s'est passé.


METTRE À JOUR: 


Une autre approche consiste à utiliser des protocoles d'URL personnalisés. Vous créez un fichier exécutable et «l'installez» sur l'ordinateur client avec votre protocole URL personnalisé.

Vous pouvez ensuite appeler l'exécutable à partir du navigateur à l'aide de votre protocole d'URL personnalisé.

7
Brian McGinity

Il existe une autre alternative à Web Socket.Créez un serveur de socket Web qui accédera au périphérique USB dans le système local.

Connectez votre serveur Web à l'aide de Web Socket à partir de Web Application.Web Socket est doté de l'API standard. 

Vous pouvez faire quelque chose comme ça 

  var Host = "wss://localhost:25000/test";

  Websokcet ws = new WebSocket(Host);

Vous pouvez créer votre serveur Web Sokcet en utilisant RFC 6455

pour les navigateurs plus anciens, vous pouvez également penser au serveur http.

2
Chris_vr

S'il vous plaît jeter un oeil à JSFS. Cela fonctionne de manière similaire à l'approche de Chris_vr et est déjà une solution fonctionnelle.

https://github.com/jsfsproject/jsfs . C'est gratuit et sous licence GPL.

2
wimix

Si le périphérique USB que vous souhaitez contrôler est une imprimante de codes à barres, vous pouvez utiliser jZebra. 

https://code.google.com/p/jzebra/

Ceci est une applet qui communique directement avec les imprimantes connectées localement.

1
Brian McGinity

Que dis-tu de ça?

Ecrire sur un port série:

var writeSerial=function(str) {
  chrome.serial.write(connectionId, str2ab(str), onWrite);
}
// Convert string to ArrayBuffer
var str2ab=function(str) {
  var buf=new ArrayBuffer(str.length);
  var bufView=new Uint8Array(buf);
  for (var i=0; i<str.length; i++) {
    bufView[i]=str.charCodeAt(i);
  }
  return buf;
}

plus à http://developer.chrome.com/apps/app_hardware.html

1
Joe Oliver