环境
后端:springboot JDK8
前端: vue

需求
业务需求是,服务端对接一些硬件设备,体重秤 血压计等... 使用的是串口协议,通过 DB9 转 USB 直接插到电脑上,服务端使用 java 开发的串口协议(rxtx),然后用 Vue 写的客户端去调接口,来操作这些硬件设备;

问题
现在项目所有都已经开发完成了,需要去部署了,才发现一个问题,如果项目部署到云服务器上,客户那边一台电脑 A 所有硬件设备通过 USB 连接电脑 A ,通过浏览器访问的云服务器的页面,这样的话,是不能直接操作硬件设备的;

方案
现在有两种方案
1.从新用 C# c++等语言,从新开发一个 exe 程序,客户拿到程序 安装完成后,每次打开电脑只需要打开应用程序即可操作硬件 (代价太大 需要从新开发,ui 和一些功能)
2.把 java 项目和 Vue 项目打包,去现场把项目装到连接到硬件设备的电脑上,实现操作。
2.1 问题 1 客户电脑每天关机,从新开机后,还需要重启 java 项目 Nginx 等一些列的操作,就算提供一个 Bat 脚本,依然很复杂,而且客户电脑是 windows 的系统
2.2 问题 2 客户电脑配置不高,如果运行 jar 和 Vue ,还要装 jdk node nginx 等.... 怕客户那边电脑本来就卡,装完这些 更卡

优化
不知道大佬们有没有遇到过类似的场景,怎么能优化一下;

我的一些想法,把 jdk node nginx 这些环境的东西,都在服务器配置好,然后 Java 项目在客户本地运行,然后如果电脑是从新开机, 通过浏览器页面,如果 java 项目没有启动,在浏览器上让客户点击一个按钮,使用 js 来运行 cmd 命令来启动 java 项目,不知道能不能实现到这个想法;

想法 2: 能不能把 java 项目和 vue 项目,打包成类似 C#或者 c++ 这样的 exe 应用程序,客户那边安装完成后,里面是自带 jdk node 这些环境,安装一次后,下次就是正常启动就可以了,研究了以下 electron 好像做不到这个程度吧,环境还是需要在本地配置好,只是把 web 页面打成了 exe

不知道大佬们有没有什么建议

#感谢各位大佬提出的意见1.确实这些事情,在立项的时候就应该考虑到,最简单的就是用 c# .net 或者 c++ 等 写一个 exe 应用程序,客户安装到自己电脑上 里面在内置可以发送 webapi 的功能 这应该是最标准的实现 串口的方式;2.但是针对现在的情况 开发上位机 或者用 c#从新搞 太麻烦了,只能硬着头皮,从现有的情况去尽可能地改进;# 目前最终决定 使用 js 的串口库 serialport ,在 vue 项目里,去做操作串口的业务,java 项目还是部署到云端,然后客户端去调 Java 的 api 。

做个 C/S 壳,里面用浏览器控件打开网站,硬件<=>桌面程序<=>网站,桌面程序作为中间桥梁,做啥都行。

买个小型的服务器部署不行吗 为什么要关机

用 electron 或者 Java 单独写个客户端。这个客户端在本机起一个 socket 服务。vue 网页通过 socket 与这个客户端进行通讯,操作硬件设备当然,不写 socket 也是可以的,直接通过 URL schema 传递参数应该也可以我现在用的打印组件就是这么做的。安装个插件就可以实现不用预览,直接操作打印机打印

同一楼,再写一个客户端,甚至不需要界面,开发一个驱动程序安装好后台运行就行了,这个驱动程序只有本地接口转发功能

用 electron 直接把你的前端包起来也行,通过 electron 调用硬件应该也是可以的

最佳方案,用.NET 8 重新开发成 Windows 服务程序,方便适配跨平台,因为你这个程序很可能将来会要在国产系统上部署。下次记住,涉及到对接硬件,首选.NET 。看了你的方案,不如上 docker ,虽然还得装 docker ,但是感觉一劳永逸。

他这个不是单纯的接口转发,要用对应的串口协议来操作设备,包括初始化串口、调接口、异常处理等,如果体量大的话,做中间件相当于重新做了一套 java 后端程序,不如重新开发了,如果体量小,更不如重新开发了。

给你两个方案一、单机方案java 应用不需要弄什么 node 、nginx ,将前后端编译为一个 jar 运行,然后安装包内直接带着对应的 SDK 就可以,初始化环境变量,之后 java -jar 就可以运行,没什么复杂操作,也不用二次开发二、集群方案将服务分为客户端和服务端,服务端可以部署在云上,前面挂个 TCP 负载,客户端部署在 A 、B 、C 、D 机器上,通过 TCP 连接服务端,硬件设施连接 A 、B 、C 、D 后可以通过云上服务器操控,也可以通过 A 、B 、C 、D 页面操控

1 直接改为上位机,本地部署2 硬件都加上网络功能加上 sim 卡,和服务器通信3 增加一个中间硬件接设备串口抓发到云服务器

桌面程序( Winfrom )就可以对接所有硬件设备,原有 Web 还有布置在服务器上。 弄过类似的项目,比如酒店电脑接入了打印机/制卡机/身份扫描器等,就是这样干的,这应该是最简单的方案了。 再不行,让客户机给你放个远程,远程过去布置,要装啥自己操作不是很简单吗(就一台机,弄啥安装包...)

不知道你的具体需求是什么,是否需要把数据存储到云上。如果没有比较强烈的云需求,确实可以直接把现有的东西都打包在一起,部署在客户的电脑上。如果可以让客户使用 Chrome 的话,可以试试 Web Serial API ,它可以让网页与串口设备通信,不过这个还在 Experimental 阶段,以后的稳定性不太确定。Web Serial API - Web APIs | MDN

之前架构设计没对,如果确定应用是 B/S 架构,你需要在开发并部署一个设备服务在客户端,他跟你的的云端服务通讯,主要作用是跟硬件通讯,执行后台下方指令。如果希望前端 JS 直接跟本地硬件打交道,可以开发浏览器插件。

立项时候没考虑部署?客户只有一台电脑?拿个不用的电脑主机装个 linux 来本地部署行不?

你的 vue 项目是个什么项目,怎么调接口的?根据你的意思好像这个 vue 项目没法单独部署,那他怎么调接口?实质上你这个项目是没有客户端的啊,我说的是针对终端用户可用的客户端

在客户端做一个心跳服务,每隔一段时间向云服务器发送指令查询请求,有的话就返回指令给客户端,客户端再将指令透传给设备

你是很懂这个业务的,确实你说的三点都能实现,但是1. 立项时候就想做上位机,但是没有这个语言的人员,就咬着牙用 B/S 先做了; 现在从新搞上位机 时间有点紧 还是没人员;2.如果设备能查卡的话,一切都解决了,但是采购的这批设备就不支持 sim 卡- -3.在做 B/S 架构之前我就看了,一个串口服务器,查到硬件的 DB9 口上,可以把串口消息转发为 http ,这个是可以满足的,拿到消息可以发到云服务器,但是一个串口服务器 200-300 ,现场现在 10 几台设备,这个 2000-3000 没人出.....

用 Graalvm 直接打包成一个 web 服务就好了啊。运行自动打开浏览器 www.graalvm.org/latest/reference-manual/native-image/

现代浏览器都直接支持打开串口了,直接在浏览器端打开串口练到硬件好了,然后浏览器和服务器 Java 直接走 websocket 。Java 将数据通过 websocket 发给浏览器,浏览器原封不变再发给串口。不过开发这个少说也得一天吧,一天给程序员工资也得几千了吧。

对接硬件设备的服务端程序应该部署在边缘服务器上,负责通过各种协议操控/读取硬件设备的数据,同时提供查询/控制接口或用 mqtt 把数据提供给负责业务需求的服务端,这个可以部署在云上,也可以部署在内网,用户 UI 通过和该服务端交互获得硬件设备的状态乃至操作硬件设备,大致是这样:hardware <--> edge server <-(api/mqtt)-> application server <--> UI

这是应该开发完再解决的问题吗?

“客户那边一台电脑 A 所有硬件设备通过 USB 连接电脑 A ,通过浏览器访问的云服务器的页面,这样的话,是不能直接操作硬件设备的”否的,USB 有 WebUSB ,串口有 WebSerial 。实在不行就套一层 Electron 把访问硬件的接口暴露给前端。

额,首先要确认你这个服务端是只为一台接入端点服务还是面向多台接入端点,其次确认项目后续的维护阶段的投入预算大概是多少多端点或高维护预算:1 楼方案单端点+低维护预算:改为本地部署,不要用云服务器,做好开机启动,没必要打包,JAVA 、Nginx 之类的环境都是可以直接拷贝使用的,直接做成脚本启动就行

最佳方案:你们自己买一台 supermicro 低功耗服务器,放在客户那里,客户任何问题不需要上门,通过路由器 vpn 监控服务状态,修复你在测试过程中未发现的问题;这样做客户体验好,这类产品云端容易出现问题 修复成本高,客户体验差

如果非要云端部署,那就把 java 端拆成接口转发客户端 和 业务两个,业务部署到服务器。需要增加的就是客户端和服务端通信设计。服务器端能监测到所有节点的状态,异常的,人为处理。如果是自己的实施人员驻场,这个样省事儿

东西开发完了才来解决这类型的问题,属实有点难办。最简单的方法是搞一个 agent 代理吧,agent 把收集到的请求发送到你们云服务器上。这样改动是最小的,部署完后把 agent 发到客户的电脑上让装一遍。agent 也用 java ,打包成 exe 。或者 python 最方便。

串口协议 表示你必须在连接串口设备的机器上部署本地的程序才行,可以用 C#写一个带界面的,也可以用别的语言写无头的服务程序,启动一个 httpserver 和 web 页面交互。可以用 go 也可以用 rust 写,C ,C++也是可以的,但是 java 的话你得用最新版本用 graalvm native 编译,python 在 windows 下可以用 py2exe ,直接用 electron 也行,用 tauri 也行。其实一开始实现的时候就该想好了

目的是读取 USB 设备吧,建议看下 VirtualHere 服务器和客户机都要安装,需要授权

买个小型机器,j1900 cpu 就行,几百块钱,24 小时待机。部署一个 agent 读取 usb 信息, 通过 mqtt 协议传到云服务器。

Vue 项目用 electron,wails,tauri 等 web ui 解决方案打包成桌面端程序。java 项目有技术就用 graalvm 编译成 exe ,没技术可以安装 JRE/JDK ,或者绿色版 JRE/JDK 。Nginx 是什么鬼,本地部署哪里需要 Nginx 。这其实就是 shadowsocks,clash for windows,clash verge 之类翻墙软件用的解决方案,去看看它们的源码就懂了。唯一麻烦点就是 java 程序需要虚拟机,比纯 exe 麻烦点,但你想想,IDEA 还不是照样自带了个虚拟机。------归根到底,你这项目最佳的部署方案就是桌面端 GUI 程序。

vue 网页 serial api 已经支持很多浏览器了。前端改一下加入 serialport 和服务器连接。我有一个页面 serial api 的 demo 的供参考 kongdayan.github.io/Web-Serial-API-demo/

方案是,弄一个低功耗低成本边缘网关来接硬件,你就几个串口,一百多块钱的设备就能用,有串口,网口,4g/WiFi 。然后你程序只用和边缘网关交互就行

感谢

有源码吗~

最近我有写网页读取串口的的项目,用的是 Web Serial API ,原生浏览器环境 JS 解决,不过 Chrome90 后都支持,最差也需要 windows7 ,兼容性还是很好的,可以放在 NW.s 里作为一个程序运行,看 MDN 真的用处不大,我参考的是1. wicg.github.io/serial/ 2. github.com/itldg/web-serial-debug3. github.com/Curtion/Web-SerialPort优先级 1>2>3 ,简化了 2 的代码,大概一个下午就搞定。如果只需要简单的串口读取,可以找我要简化后的代码

占楼,同样的处境,笨方法,就是分开部署,客户电脑部署一套,服务器部署一套。

jcef github.com/jcefmaven/jcefmavenjava 版的 electron

  1. vue 项目是可以直接打包进 springboot 包里的,这样直接启动 springboot 就能访问页面,就和前后端不分离是一样的。再配合 graalvm native image 打包成原生镜像可以直接启动。 但是你项目引入的第三方包 graalvm native image 打包也许会有坑,也可以选择 exe4j 等工具打包 exe 直接启动。2. 不用 java ,纯 js 应该也可以串口通讯。直接 electron 打包。这个我了解不多

写个 agent ,用户安装,把原来 java 调用本地硬件地方替换成 agent 通讯。

Web Serial API 能实现同时连上多个串口吗? 我用 API 试了一下,他好像需要 navigator.serial.requestPort(); 让用户选择连哪个串口; 不能直接通过串口名连接吧

不支持同时连多个吗

Java 也有库支持串口的.jSerialComm

第三点的意思,是加一个专门的硬件,串口协议透传成 tcp 流,服务器处理 tcp 流就好了

浏览器环境不能

chrome89 和 firefox 89 以上支持 web 串口吧,用前端来调用串口

用 golang 开发对接硬件,然后开放对外 api,打包 exe 插件在本机直接启动挂到后台,浏览器根据需求调用对应 api 控制硬件,插件只提供功能接口,不处理业务

.....为啥是开发完了才发现不对。友情提示。方案错了。就要按对的去改,不要为了硬头皮而硬头皮,尤其是跟硬件相关的,升级都非常不方便。但你这个项目其实好改。java 的在云端没毛病,暴露出 api 。然后 electron 封装 vue 。electron 里面又可以携带 golang/c++/nodejs 任意语言去和串口通信。工作量并不是特别大。只是把 java 实现的再用其他语言再实现一遍。别用 js 的串口库,不是不信任,是擅长的语言干擅长的事。你后面维护是个大坑,js 的人不好招。

为啥是开发完了才发现?这团队可以全体开除了吧