67

我的公司编写了安装在客户端机器上以执行销售点交易的软件。该软件与各种外围设备(收据打印机、条形码扫描仪、信用卡阅读器等)连接。我们使用 Microsoft OPOS 库在 Visual Studio 中创建的 WinForms 应用程序执行此操作,该库又与我们的云服务器通信。

这个模型有明显的低效率,主要是更新。我正在研究通过网络与这些外围设备进行通信的其他方法,最好是通过网络浏览器。据我所知,Java 是仅有的可以做我们正在寻找的事情的技术之一(通过小程序),我认为 Adob​​e Flash 也可以(通过 Air 平台)。这些都是可行的,但并不可取,因为我们希望在支持网络的移动设备上运行我们的软件。

有人对通过网络与外部外围设备进行通信的其他方式有建议吗?

4

5 回答 5

87

更新(2019 年 1 月 16 日):凭据管理 API已发布。它目前仅在 Chrome 和 Opera 上受支持,但看起来很有希望。Google Developers 写了一篇文章详细阐述了该规范。

更新(2016 年 12 月 28 日):又过了几年,又一次更新。这将比其他任何事情都更关注两个新的发展。请参阅“完整设备 API”下的新“WebUSB 和 Web 蓝牙”部分。但答案还是一样的。

更新(2014 年 11 月 3 日):距离原帖发布已经过去了两年多,但目前的答案基本相同。然而,我们在几个方面更接近您的原始目标。

原始答案:

有很多方法可以解决这个问题。

背景

HTML5 规范已进入“推荐”状态。这意味着 HTML5 几乎是为它的外观设置的。但是,我将按照世界上每个营销人员都认为最好的方式使用 HTML5。也就是说,我不会谈论 HTML。好吧,我会的,只要你会从 HTML 页面使用它,但不是真的。我实际上要讨论的是 JavaScript (JS),这是一匹不同颜色的马。但出于所有意图和目的,我们将其全部放在与 HTML5 相同的标题下,现在已决定将其表示为“闪亮和新”。

此外,我正在讨论的项目将在支持方面有所不同。有些是非常依赖于浏览器的项目(例如 Chromium 特定的实现),有些是更多标准驱动的项目,可能还没有浏览器实现或试验它们。我会尽量区分这两者。

完整的设备 API

状态:即将到来,但尚未准备好

能够从浏览器访问设备的进展缓慢但稳定。目前,许多现代浏览器都可以访问一些更常见的设备,例如相机游戏手柄,但它们都是高级 API。浏览器供应商标准组织和许多与网络相关的公司都在努力使网络应用程序与本地应用程序一样强大。

但是您正在寻找的 API 仍在进行中,还有很长的路要走。对于您的特定情况,以及将您的 web 应用程序连接到大多数设备的更一般情况,我们距离我们可以使用的东西还有几年的时间。如果您想了解该领域正在发生的令人敬畏的事情,这里只是选择了一些可以直接帮助您的项目:

  • Web 近场通信 (NFC) API
    不幸的是,这个 API 现在可能已经死了。但看起来最初 W3C 的一些人(看起来主要是英特尔)正在考虑向网络添加 NFC API。
  • 媒体捕获流
    WebRTC 小组正致力于以编程方式访问像相机这样的媒体流,这将允许集成条形码扫描或其他功能等功能。这已达到 CR 状态并且在浏览器中可用,但它本身的帮助较小。
  • 网络蓝牙
    如果您有支持蓝牙的工具,此 API 将帮助您从能够收听和连接的计算机和设备与它们连接。目前,主要驱动力似乎是 Chrome 团队,包括一个实验性实现,但我认为它还没有准备好使用(参见“WebUSB 和 Web 蓝牙”部分)。
  • WebUSB
    这将允许完全访问低级 USB 信息,包括列出设备并与它们交互。与网络蓝牙相同,这似乎是当前的 Chrome 宠物项目,但我也不会依赖它(参见“WebUSB 和网络蓝牙”部分)。
  • 网络服务发现
    如果您在网络上有其他设备或项目广播和使用 HTTP,此 API 将允许您发现这些服务并与之交互。没有浏览器实现,但它在 W3C 的工作草案中。

最初,Mozilla 是因为 Boot2Gecko(或 Firefox OS)而推动了其中的一些发展。但是,随着该项目的正式取消,我们现在在这些领域没有看到他们取得太大进展。

然而,Chrome 团队的成员似乎已经决定深入研究并开始不仅致力于这些,而且将它们放在浏览器中。这导致我们...

WebUSB & 网络蓝牙

像香肠一样,最好不知道 Web 标准是如何制定的
——Abraham Lincoln(可能)

在这个领域有一点点嗡嗡声,因为看起来 Chrome 团队偷偷地将这些作为实验性功能并为其开发了自己的规范。太棒了!只是也许不是你所希望的那样。

每个浏览器供应商和 W3C 贡献者组都有自己的风格,并以自己的方式为规范做出贡献。结果通常是浏览器同意的相当不错的规范。但是从无到有是……混乱。真乱。很多时候都是一个过程。它并不总是会产生一个好的规范(是的,我说的是你的弗洛里安妥协......)但即使它做到了,也需要一段时间。

然而,谷歌似乎是自己开发了这个版本的规范。而且,根据我的经验,Google 对规格的处理方式总是有点……嗯……抛开我的个人意见,我们会说“gung-ho”。他们倾向于直接潜入深渊。这似乎就是他们在这里所做的。

我非常怀疑这些规范或实现在成为标准时会看起来像这样。这并没有错。这是过程的一部分。但我不会依赖这个实现或开发任何代码或产品。这是网络上前所未有的功能,所有浏览器供应商都希望在这方面有很大的发言权。

也就是说,这实际上很好。在这种情况下,谷歌经常做的一件事(无论好坏)是强迫对话,它可以推动事情的发展。并且在浏览器中提供一个功能,即使是一个实验性功能,也会增加对它的需求。因此,我们可能很快会在该领域看到更多进展。

电话间隙阿帕奇科尔多瓦。你知道,为了你的手机

状态:功能不全,仅电话

Apache Cordova,以前的Adob​​e PhoneGap,是一种用 HTML、CSS 和 JS 编写程序的方法,它允许您访问手机等较低级别的功能,并跨设备编译。这将是实现您的程序的一种方式,但它将是一个电话应用程序,不一定是桌面应用程序。一个要考虑的选项,我想我会提到的。

Cordova 已经实现了上述一些功能,但没有一些更强大的功能,如 NFC 或蓝牙。

Native-App 解决方案(适用于 Windows 8)

状态:可能,但特定于操作系统和桌面应用程序

Windows 8 提供了以 HTML 和 JS 构建应用程序的能力。这将允许您通过其 API轻松访问操作系统上的较低级别功能。从外观上看,它非常广泛,您可以做很多事情。但是,您提到了跨操作系统支持,这显然将您限制在一个操作系统上。

太闪了!

状态:Dying/Dead,无法作为 Web 应用程序

Flash 无法通过网络直接访问系统。您可以创建一个 AIR 应用程序,但这会破坏基于 Web 的目的。此外,移动设备和网络上的 Flash 支持正在下降。

节点JS

状态:可能有点痛苦,只能作为桌面应用程序

NodeJS 和 JS 应用程序在过去几年一直是一个热门话题。我没有在我的原始帖子中讨论它,因为我觉得它还没有完全存在。然而,事情已经取得了进展,它更接近于为这类事情做好准备,并且拥有不断增长的用户群的支持和力量。也就是说,对于您的特定情况,我不建议使用它。它必须在用户机器上是本地的,并且由于 NodeJS(和类似引擎)目前的情况,它需要大量额外的配置和设置,这会使事情变得有点复杂。

因此,您可以使用带有 NodeJS 或类似引擎的 HTML、CSS 和 JS 构建应用程序,并且对您需要的内容具有低级别访问权限,但它必须是本地的,而且它需要的工作量比我确定的要多您想为客户安装它的时间。

...现在我在哪里?

那么,我们将何去何从?好吧,很简单:如果您想要一种语言/一组代码作为您的代码库,那么 HTML/CSS/JS 并不是一个很好的选择……但是。但他们可能有一天会到来。目前,您的选择仅限于您认为最适合您的客户的选项。Java 是您列出的稳定选项,但显然有其自身的缺点。随着网络的发展,我认为我们会看到很多非常酷的东西从新功能中涌现出来,但我们还有很长的路要走。

更多阅读:

于 2012-10-23T01:05:30.000 回答
12

这是可能的,但必须间接进行。理论上,您可以用低级语言编写一个套接字服务器,它获取 I/O,并通过套接字发送 I/O(我猜是中继)。HTML5 使用 WebSockets 或类似的东西来与这个套接字服务器通信。

于 2012-10-22T23:59:52.600 回答
5

现在可以通过WebUSB API 来实现。

从 54 版开始,它在 Chrome 中可用。

这是 W3C 编辑的草稿,因此我们可以期待(希望)它会被其他浏览器供应商采用...

于 2016-09-02T21:17:59.480 回答
1

我最近一直在考虑这个问题......有一个主要用 VB6 编写的 POS 应用程序,考虑下一步该做什么。HTML5 是一个选项,我想我会使用 VSPE 将串行内容放入 JS 中。

http://www.eterlogic.com/Products.VSPE.html

喜欢这个产品!非常适合在您需要的地方获取串行流量,所以我认为它会很好用,至少作为一个概念验证可以让您继续前进。您需要结合使用“连接器”类型以及“tcpclient”和“tcpserver”。

于 2013-10-14T20:21:34.473 回答
1

仅作记录,一种在 2016 年运行良好(自 chrome 26 起)但将在未来 2 年内撤销的方法是将您的 html5 部署为 chrome 应用程序并使用chrome.usb(或 chrome.serial 或 chrome.serial)。蓝牙)。

我目前正在使用 chrome.usb 并计划使用WebUSB API迁移到 Web 应用程序(请参阅 Supersharp 的答案),我希望在 Google 停止 chrome 应用程序时能够采用。

于 2016-11-16T13:55:21.457 回答