我需要创建一个web控制的应用程序(生活在浏览器中),它可以连接到通过USB或串口连接的设备并读取数据。
目前,我正在使用ActiveX控件来执行此操作。然而,我想重写这个系统,使它跨浏览器(支持火狐),并最终跨平台(支持Mac上的Safari )。ActiveX既不是跨浏览器也不是跨平台,所以我正在寻找一种替代技术。
我的第一个倾向是使用Silverlight,因为Silverlight 4允许访问COM自动化。不幸的是,这只适用于OOB (离开浏览器) Silverlight应用程序-浏览器中的系统仍然绑定在沙箱中,并且没有访问权限。
那么,有哪些技术(框架、浏览器插件等)将允许我从基于浏览器的web应用程序中与USB/串行设备进行接口?每种方法的优缺点是什么?
发布于 2010-11-21 16:17:20
到目前为止,我遇到的最好的解决方案是跨浏览器/跨平台插件系统FireBreath。这是一个在C++中构建的框架,允许您从同一个代码库为ActiveX和NPAPI生成插件。
因此,构建它一次,使它工作,它编译成一个DLL,您可以在这两个环境中部署: ActiveX为IE,NPAPI为其他人。
发布于 2010-11-18 19:21:17
在这种情况下,我认为您最好的选择可能是Java。USB,虽然在协议方面是一个行业标准,但在裸金属实现方面绝对不是标准化的。由于这个原因,您仍然需要为每个不同的平台(windows、linux、osx、bsd)提供不同的Java实现。当然,您还必须支付代码签名证书的费用,这样您就可以尝试说服人们授予您的应用程序所需的访问权限;浏览器非常努力地拒绝它的访问,而在这个时代,大多数人都非常不愿意授予它。尽管如此,这里有一篇关于各种Java项目的旧IBM文章,读得很好。祝好运。
http://www.ibm.com/developerworks/library/j-usb.html
-Oisin
发布于 2010-11-18 19:30:56
这可能很痛苦,但您可以使用签名Java applet。签名的Java小程序可以完全访问用户的系统。
Java没有内置USB支持,因此您可能需要将自己的JNI接口转到本地USB。
在applet中使用JNI可能很棘手。我以前也做过。如果你在谷歌上搜索这个话题,大多数结果都会说“不要做”或者“你做不到”。你能做到的。
我就是这样做的:我将本机库(DLL、so等)打包到applet的JAR中,然后使用例如getResourceAsStream从JAR中读取本机库。然后我将库写到磁盘上的适当位置(例如${user.home}/..myapp/)。然后,我使用System.load加载JNI。
JNI库和applet可能存在一些ClassLoader问题。这些问题很微妙,也很难解释。它们基本上与这样一个事实有关: JVM只能在每个VM实例中加载和绑定一个给定的JNI库一次,但是applet会被实例化很多,通常是使用它们自己的新ClassLoader,这可能是有问题的。Sun在下一代浏览器插件中对进程分离所做的工作可能缓解了其中的一些问题,但是您的用户只有在使用Java1.6.0_10或更高版本时才会有这种情况。
还可以在签名的applet中使用南国防军。我不建议使用JNA直接访问USB。但是JNA有时可以为访问简单的本机函数节省大量时间。尽管一旦您设置了JNI基础设施,JNA的价值可能就会降低。
以下是其他一些随机的想法:
https://stackoverflow.com/questions/4218574
复制相似问题