19

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

在某一时刻,当用户导航到某个网页时,服务器必须从用户的串行端口读取数据。

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

该系统已有 10 年历史。有什么“更好”的方法可以实现吗?

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

HTML 5 是否提供了任何新的可能性?那么像Cordova这样的产品呢?

还有其他可能吗?

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


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

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

4

6 回答 6

24

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

我建议另一种方法:

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

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

于 2013-03-05T14:24:15.583 回答
11

为了最大限度地减少客户端机器上的外部库或插件需求,我会编写一个Java Applet

摘要 (包括实现它所需的大部分文档的链接)

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

更多细节:

根据StatOwl的说法,大约三分之二的机器已经安装了所需的 Java 框架,因此您甚至可能不需要要求您的客户提供任何额外的基础设施。如果你这样做了,至少你要求的是(在大多数情况下)维护良好的软件,人们知道并且不会太怀疑。而且,大多数浏览器应该能够提示您的用户在缺少 Java 框架时自动安装它。

您可以在 Java 中使用几个不同的库来访问串行端口。不过, PureJavaComm似乎是少数不需要外部代码即可运行的公司之一。具体来说,在 Windows 上,它们的WinAPI Java 类使您可以直接访问 COM 端口,包括它们的所有设置,只需调用已安装的 Windows 库即可。由于 PureJavaComm 是一个纯 Java 库,您可以将它与您的小程序打包在一个 .jar 文件中,浏览器会自动下载该文件,因此无需安装任何内容。

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

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

备选方案 1:

另一种选择是,简单地完全放弃 Web 界面,而是提供一个 Java 程序,用户可以使用JNLP (Java Web Start) 直接从您的网站轻松运行(无论是否安装它)

备选方案 2(可能仅限 Windows):

我想您也可以使用Microsoft Silverlight,它似乎也被广泛部署

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

有些人可能认为它比 Java Applets 更“现代”,但它的跨平台可能更少。

从 JavaScript 调用您的 Silverlight 代码似乎也更复杂一些,但有可能:

通过 JavaScript 使 Silverlight 可编写脚本

于 2013-03-06T00:57:55.840 回答
7

仅举另一个(更像“物联网”)选项:外部硬件。

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

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

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

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

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

于 2013-03-11T22:46:40.957 回答
5

可能不是。

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

即使在所有现代进步的今天,Web 浏览器仍然是花哨的交互式文档查看器,而不是通用的运行时环境。即使是最先进的功能(如 websockets)也被引入来实现复杂的客户端-服务器通信,而不是因为某种普遍的兴趣,有一天能够从浏览器中完成所有事情。

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

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

如果您仍想查看更广泛的浏览器支持,请尝试查看针对此问题的建议解决方案:Communicating with Serial Port using Adob​​e Flash。我没有使用过这个产品的经验,但如果它有效的话,它应该能让大多数浏览器用一个代码库做你想做的事情,这和你希望的一样好。

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

于 2013-03-05T05:02:04.273 回答
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

于 2017-12-10T21:47:12.720 回答
2

通过 Node JS 使用 serialport 包作为服务器是一种选择。这适用于 Windows,显然也适用于 Linux 和 OSX。请参阅https://github.com/node-serialport/node-serialport

这是我用来通过 USB 读取微比特通信到浏览器的解决方案。我确实必须使用以下命令重建 Windows (10) 的驱动程序:

  • npm install --global --production windows-build-tools
  • npm install serialport --build-from-source

我在下面粘贴了一些代码以供参考:

const serialport = require('serialport')

// list serial ports:
const find_microbit = (error, success) => {
  serialport.list((err, ports) => {
    if (err) {
      error(err)
    } else {
      let comName = null
      ports.forEach((port) => {
        if ((port.vendorId == '0D28') && (port.productId == '0204')) {
          comName = port.comName
        }
      })
      if (comName != null) {
        success(comName)
      } else {
        error('Could not find micro:bit.')
      }
    }
  })
}

exports.get_serial = (error, success) => {
  find_microbit(error, (comName) => {
    let serial = new serialport(comName, {baudRate: 115200, parser: serialport.parsers.readline('\n')}, (err) => {
      if (err) {
        error(err)
      } else {
        success(serial)
      }
    })
  })
}
/* e.g.
get_serial((err)=>{console.log("Error:" + err)},
    (serial)=>{
        serial.on('data', (data) => {
            let ubit = JSON.parse(data)
            if (ubit.button == 'a') {
                console.log('Button A Pressed')
            }
            if (ubit.button == 'b') {
                console.log('Button B Pressed')
            }
            if (ubit.ir) {
                console.log('Visitor detected')
            }
        })
    })
    */

这种方法有效 - 对我来说 - 但让它工作起来可能很耗时。在我看来,这不是一个明显或简单的解决方案。它需要相当多的技术知识——而且,我觉得,比它应该的要复杂和“棘手”得多。

特别是 - 重建库不是我在使用 Node JS 时期望做的事情。一种可能的影响是您需要为不同的平台重建串行端口二进制文件。

于 2017-12-10T21:43:26.163 回答