如何在2017年从用户的串口读取网页?

Maw*_*awg 19 com activex serial-port web-applications

我必须从头开始重新实现现有系统.

有一次,当用户导航到某个网页时,服务器必须从用户的串口读取数据.

目前,该网页具有ActiveX控件; 当页面加载时,ActiveX控件调用用户PC上的COM DLL,该DLL从串行端口读取数据.

该系统已有10年历史.有没有"更好"的方式可以实现这个?

例如,技术在过去十年中不断发展.而这个解决方案似乎只适用于MS IE,它现在的市场份额约为26%(2013年,当我上次更新这个问题时.截至2107年2月,MS IE有3-4%而且Edge有由于Edge也是MS产品,它可能支持Active X - 我没有尝试过.Otoh,因为它是从头开始的新功能,很有可能它没有.)

HTML 5是否提供了任何新的可能性?Cordova等产品怎么样?

还有其他可能性吗?

我可以添加一个Raspberry Pi来通过串口读取吗?并让浏览器应用程序通过RESTful服务与之通信?


[更新] @ EuroMicelli说:"我将假设您有充分的理由从网络浏览器而不是本机应用程序运行您的应用程序".我不知道原来的项目计划时我不在身边(设计它的公司现在已经不存在了).

也许他们不希望最终用户直接与数据库连接?也许"基于浏览器"当时是一个新的流行语?我个人对桌面应用程序没有任何问题(因为我发现它们更容易实现),但是我们应该考虑保留基于浏览器的?(此外,我可以自己处理桌面应用程序;它只是从COM端口读取浏览器,导致我提供奖金;-)

Sim*_*ier 23

有一点可以肯定的是,如果没有在本地计算机上安装一些特殊的二进制文件(并以适当的权限运行它),您将无法与本地计算机硬件进行通信.但是,这并不意味着您必须使用ActiveX组件并且仍然无法使用Internet Explorer.当然,您也可以为市场上的每个浏览器开发一个组件.

我建议另一种方法:

  • 编写Windows服务(我假设您的计算机运行Windows),使用必要的权限进行配置.无论如何,你必须在机器上安装一些东西.该服务可以用任何语言实现.
  • 添加HTTP(S)服务器功能.您可以在这里使用从WCF到WebAPI的许多技术.
  • 通过HTTP发明您自己的通信协议.您可以使用JSON,Ajax,WebSockets,SignalR等.
  • 编写一个与市场上大多数浏览器兼容的Javascript文件 - 因此您只需编写一次 - 这将成为您的串行COM API.您可以使用Javascript和Ajax功能(XmlHttpRequest)支持所有浏览器,只需一个代码库.

这是它的样子: 在此输入图像描述


Mar*_* A. 10

为了最小化客户端计算机上的外部库或插件要求,我将编写一个Java Applet.

摘要 (包括实现此目的所需的大多数文档的链接):

  1. 确保您的客户端安装了Java(大多数已安装Java ,如果没有,浏览器可以安装它)(这是您可能需要从某些客户那里获得此方法的唯一安装)
  2. 选择一个不需要任何外部安装的Java串口库,如PureJavaComm
  3. 编写一个非常简单的Java小程序,它提供了执行串行端口读取的公共方法
  4. 对您的applet进行签名,以便为其授予所需的系统访问权限
  5. 在您的网页中包含applet,只需直接从JavaScript调用公共方法即可

更多细节:

根据StatOwl,大约三分之二的机器已经安装了所需的Java框架,因此您甚至可能不需要要求您的客户提供任何其他基础架构.如果你这样做,至少你要求一个(大部分)维护良好的软件,人们知道并且不会过于怀疑.并且,大多数浏览器应该能够提示用户在缺少Java框架的情况下自动安装Java框架.

您可以在Java中使用几个不同的库来访问串行端口.PureJavaComm似乎是为数不多的,不需要外部代码运行.具体来说,在Windows上,他们的WinAPI Java类使您可以直接访问COM端口,包括使用已安装的Windows库调用的所有设置.由于PureJavaComm是一个仅限Java的库,因此您可以将其与applet打包在一个.jar文件中,浏览器会自动将其下载,因此无需安装任何内容.

然后,您可以编写一个最小的Java Applet(可能只有大约50-100行),它定义了您需要的串行端口访问的公共方法,然后您可以直接从JavaScript轻松调用:从JavaScript代码调用Applet方法

您需要确保的唯一事情是您签署applet并将串行端口代码包装在doPrivileged(...)调用中,以便从JVM Sandbox中授予所需的系统访问权限.为此,您可以获得已购买的SSL证书(如果您的服务使用https,您可能已拥有该证书)或生成您自己的证书.如果您生成自己的,则会提示用户,他们是否想要信任您的applet,但他们可以选择"始终信任",因此它只是一次性复选框,然后单击确定.但除此之外,这应该是一个完全透明的解决方案,可以最大限度地减少对用户体验的影响.

备选方案1:

另一个选择是简单地放弃Web界面,而是提供一个Java程序,用户可以使用JNLP(Java Web Start)直接从您的网站轻松运行(有或没有安装).

备选方案2(仅限Windows):

我想你也可以使用Microsoft Silverlight,它似乎也得到了相当广泛的部署:

与Silverlight 5的串行通信(COM端口)

有些人可能认为它比Java Applets更"现代",但它可能不那么跨平台.

从JavaScript调用Silverlight代码似乎也更复杂,但它有可能:

使用JavaScript编写Silverlight脚本

  • @Chris:AFAIK Java Applet比ActiveX更广泛支持,ActiveX主要是Microsoft(Internet Explorer)发明(参见原始问题).此外,编写和签署这些applet实际上非常直接(我做了一些).但是,当您尝试从JavaScript调用它们时,主要收获.使用Java Applet,您需要做的就是直接调用它的公共方法.完成.它就像你可能做到的那样直截了当.虽然这里提出的涉及外部HTTP服务的一些其他解决方案将需要跨站点脚本,这可能是一个巨大的痛苦. (3认同)

Chr*_*ris 7

仅仅命名另一个(更像是"web-of-things")选项:外部硬件.

根据使用情况,您可以使用外部低成本设备,如arduino微控制器或raspberry-pi嵌入式PC.

在这些设备上构建简单的串行到Web服务桥并不是很困难.你可以使用这样的项目,例如:https://code.google.com/p/serwebproxy/

在这种情况下,所有低级别的东西都由外部硬件处理,并通过类似于Web的服务接口(通过get/post)提供给您.

进一步的优点是运行应用程序的pc不需要串行端口(在某些系统上变得非常罕见).

从您的浏览器应用程序,您可以通过简单的ajax调用查询嵌入式设备上的Web服务.浏览器根本不需要任何插件,该解决方案可以跨平台工作,并且通用且独立于不久的将来浏览器技术的开发.


Eur*_*lli 5

可能不是.

我将假设您有充分的理由从Web浏览器而不是本机应用程序运行您的应用程序.我可以想到几个场景,我可以看到这是一个合理的商业决策.

即使在今天,随着所有现代技术的进步,Web浏览器仍然是花哨的交互式文档查看器,而不是通用运行时环境 甚至最先进的功能,如websockets也被引入,以实现复杂的客户端 - 服务器通信,而不是因为有一天能够从浏览器做所有事情的普遍兴趣.

可能存在一些本地可能的特殊环境(Chrome OS?),但它不是一般解决方案.我不知道通过浏览器标签或脚本打开串行端口的现有标准或建议标准.这意味着您将需要某种类似ActiveX的相当低级别的插件技术.如果你只支持IE,那么ActiveX是一个非常好的解决方案,特别是如果它已经编写并且有效.

从浏览器中寻找串口访问的大多数人可能从他们指定(构建/销售?)和控制的某些专有硬件进行数据采集,例如实验室设备,条形码扫描仪,科学仪器等.我认为此时它同样指定所需的浏览器也是完全可以接受的.专业应用程序通常这样做.

如果您仍想查看更广泛的浏览器支持,请尝试查看针对此问题的建议解决方案:使用Adobe Flash与串行端口通信.我没有这个产品的经验,但是如果它有效,它应该使大多数浏览器能够用一个代码库做你想做的事情,那就是你所希望的那样好.

无论你最终做什么,它肯定会涉及某种形式的第三方插件.


And*_*dyS 5

您可以使用Web USB - 但浏览器兼容性(目前)非常低 - Chrome 61似乎就是这样.

这种方法的主要好处是usb设备插入浏览器机器.显然这也适用于Android 64的Chrome(未经过测试).

该API位于https://wicg.github.io/webusb/.

有关教程,请参阅https://developers.google.com/web/updates/2016/03/access-usb-devices-on-the-web.