6

最近收到一个请求,通过我的网页向通过客户端机器上的串行端口连接的设备添加通信。

我做了一些谷歌搜索,发现带有 node-serialport 的 node.js 似乎是 javascript 的方式。但是,在我的情况下,设备实际上连接到客户端的机器,而不是服务器。

我的问题是我如何在这个意义上实现 node.js?由于代码在客户端浏览器上运行,我是否可以在我的网页上“嵌入”node.js?

或者还有其他选择吗?不过,Applet 和 ActiveX 已经不在了。

谢谢

更新: 已经设法说服客户端从网络加载小程序,所以我们将通过小程序路线。感谢大家提供的重要信息!=)

4

6 回答 6

7

浏览器中的JavaScript只能访问浏览器提供的 API:它存在于浏览器沙箱中,它(正确地)无法访问客户端文件系统或其他硬件。

这与 node.js 不同,node.js 是一个服务器实现,可以访问各种其他文件系统 API。

要“突破”浏览器,您必须使用某种浏览器扩展。

于 2012-07-27T04:30:11.440 回答
3

在将数据发送到服务器之前,您必须创建一个插件、一个小程序或一个客户端应用程序来将数据输入客户端的 Web 浏览器。

您可以制作一个小应用程序来读取创建 .js 文件的客户端计算机的串行端口,然后您的网页包含客户端计算机上“动态”创建的 js 文件的 src,然后您的网页就可以访问串行端口以迂回的方式。

这就是 GPSGate 的工作原理:http ://gpsgate.com/developer/gps_in_browser/

另请参阅:如何从网页中的串行端口读取

还有一个基于 Java 小程序的解决方案: http ://code.google.com/p/java-simple-serial-connector/

http://code.google.com/p/java-simple-serial-connector/wiki/jSSC_Terminal

于 2012-07-27T04:30:15.553 回答
1

如果您想从浏览器访问 node.js 功能,请尝试app.js。

于 2012-07-27T06:55:56.897 回答
0

这只能通过 Active X 或 Java 或 Flash 等插件来完成。JavaScript 中的代码仅与浏览器提供给它的 API 一样强大。

想要向服务器发送 HTTP 请求?JavaScript 可以做到这一点(受同源策略约束),因为浏览器具有XMLHttpRequestAPI。想查询当前操作系统上正在运行哪些进程?JavaScript 无法做到这一点,因为没有浏览器提供 API 来查询操作系统正在运行的进程。

据我所知,没有浏览器实现任何类型的 JavaScript API 来执行串行端口操作,因此如果不使用插件,就无法做到这一点。

但是,这并不排除有朝一日这样的 API 存在的可能性:该getUserMedia功能可以从摄像头或麦克风中获取数据,并且理论上可以扩展以从其他设备获取数据。

于 2012-07-27T04:37:00.410 回答
0

另一种选择(除了具有安全权限的 ActiveX 或 Java 小程序)可能是 Google Native Client 和 Pepper API,尽管这是否足以访问串行端口,我不知道。

Firefox 扩展可以包含可以访问串行端口的本机 XPCOM 组件,并且您可能会发现已经有一种方法可以从浏览器 chrome(扩展是)访问串行端口,因为安全令牌和智能卡系统支持串行读取器。Firefox 扩展也可用于提供下一个解决方案,这需要在系统上放置一个本地组件或应用程序。

您能告诉我们这里针对哪些浏览器和操作系统,以及为什么 ActiveX 和 Java 被排除在外吗?

其他人建议使用本机运行代理通过某种协议公开串行端口。您可以为此使用 node、python 或任何其他可以同时创建串行连接和套接字的语言。要从浏览器应用程序访问代理,您需要向页面授予特殊的安全权限,然后您可以使您的代理成为 HTTP 或 WebSocket 服务器。您还可以从代理提供 javascript,这将授予脚本 HTTP 和 WebSocket 访问其作为代理的原始服务器的权限。Google Chrome 扩展程序可以使用其套接字客户端访问任何目标和端口。另外,我相信可以在 Google Chrome 中设置一个配置,以允许对某些或每个页面进行此操作,与允许网页使用本机客户端相同。

在不了解您的目标的情况下,我无法确定最佳解决方案是什么。

于 2012-07-27T05:08:14.247 回答
0

读取串口数据的另一种选择是在服务器端使用 sockjs 和 sockjs-client-node,在客户端使用 sockjs-0.3.js。

于 2014-07-31T09:16:29.743 回答