项目开发完了,发现部署上的问题逻辑走不通,求大佬指点一下优化方案?

306 天前
 lalalaXxx

环境

后端: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

不知道大佬们有没有什么建议
5906 次点击
所在节点    程序员
47 条回复
crazytudou
306 天前
做个 C/S 壳,里面用浏览器控件打开网站,硬件<=>桌面程序<=>网站,桌面程序作为中间桥梁,做啥都行。
silentsky
306 天前
买个小型的服务器部署不行吗 为什么要关机
twofox
306 天前
用 electron 或者 Java 单独写个客户端。这个客户端在本机起一个 socket 服务。
vue 网页通过 socket 与这个客户端进行通讯,操作硬件设备

当然,不写 socket 也是可以的,直接通过 URL schema 传递参数应该也可以

我现在用的打印组件就是这么做的。安装个插件就可以实现不用预览,直接操作打印机打印
gaobh
306 天前
同一楼,再写一个客户端,甚至不需要界面,开发一个驱动程序安装好后台运行就行了,这个驱动程序只有本地接口转发功能
twofox
306 天前
用 electron 直接把你的前端包起来也行,通过 electron 调用硬件应该也是可以的
klo424
306 天前
最佳方案,用.NET 8 重新开发成 Windows 服务程序,方便适配跨平台,因为你这个程序很可能将来会要在国产系统上部署。

下次记住,涉及到对接硬件,首选.NET


看了你的方案,不如上 docker ,虽然还得装 docker ,但是感觉一劳永逸。
klo424
306 天前
@crazytudou @gaobh 他这个不是单纯的接口转发,要用对应的串口协议来操作设备,包括初始化串口、调接口、异常处理等,如果体量大的话,做中间件相当于重新做了一套 java 后端程序,不如重新开发了,如果体量小,更不如重新开发了。
whp1473
306 天前
给你两个方案
一、单机方案
java 应用不需要弄什么 node 、nginx ,将前后端编译为一个 jar 运行,然后安装包内直接带着对应的 SDK 就可以,初始化环境变量,之后 java -jar 就可以运行,没什么复杂操作,也不用二次开发
二、集群方案
将服务分为客户端和服务端,服务端可以部署在云上,前面挂个 TCP 负载,客户端部署在 A 、B 、C 、D 机器上,通过 TCP 连接服务端,硬件设施连接 A 、B 、C 、D 后可以通过云上服务器操控,也可以通过 A 、B 、C 、D 页面操控
ihuotui
306 天前
1 直接改为上位机,本地部署
2 硬件都加上网络功能加上 sim 卡,和服务器通信
3 增加一个中间硬件接设备串口抓发到云服务器
crazytudou
305 天前
桌面程序( Winfrom )就可以对接所有硬件设备,原有 Web 还有布置在服务器上。
弄过类似的项目,比如酒店电脑接入了打印机/制卡机/身份扫描器等,就是这样干的,这应该是最简单的方案了。
再不行,让客户机给你放个远程,远程过去布置,要装啥自己操作不是很简单吗(就一台机,弄啥安装包...)
CYTMWIA
305 天前
不知道你的具体需求是什么,是否需要把数据存储到云上。
如果没有比较强烈的云需求,确实可以直接把现有的东西都打包在一起,部署在客户的电脑上。

如果可以让客户使用 Chrome 的话,可以试试 Web Serial API ,它可以让网页与串口设备通信,不过这个还在 Experimental 阶段,以后的稳定性不太确定。
[Web Serial API - Web APIs | MDN]( https://developer.mozilla.org/en-US/docs/Web/API/Web_Serial_API)
cppc
305 天前
之前架构设计没对,如果确定应用是 B/S 架构,你需要在开发并部署一个设备服务在客户端,他跟你的的云端服务通讯,主要作用是跟硬件通讯,执行后台下方指令。如果希望前端 JS 直接跟本地硬件打交道,可以开发浏览器插件。
caomu
305 天前
立项时候没考虑部署?客户只有一台电脑?拿个不用的电脑主机装个 linux 来本地部署行不?
janus77
305 天前
你的 vue 项目是个什么项目,怎么调接口的?根据你的意思好像这个 vue 项目没法单独部署,那他怎么调接口?
实质上你这个项目是没有客户端的啊,我说的是针对终端用户可用的客户端
wxb2dyj
305 天前
在客户端做一个心跳服务,每隔一段时间向云服务器发送指令查询请求,有的话就返回指令给客户端,客户端再将指令透传给设备
lalalaXxx
305 天前
@ihuotui 你是很懂这个业务的,确实你说的三点都能实现,但是
1. 立项时候就想做上位机,但是没有这个语言的人员,就咬着牙用 B/S 先做了; 现在从新搞上位机 时间有点紧 还是没人员;
2.如果设备能查卡的话,一切都解决了,但是采购的这批设备就不支持 sim 卡- -
3.在做 B/S 架构之前我就看了,一个串口服务器,查到硬件的 DB9 口上,可以把串口消息转发为 http ,这个是可以满足的,拿到消息可以发到云服务器,但是一个串口服务器 200-300 ,现场现在 10 几台设备,这个 2000-3000 没人出.....
huijiewei
305 天前
用 Graalvm 直接打包成一个 web 服务就好了啊。运行自动打开浏览器

https://www.graalvm.org/latest/reference-manual/native-image/
msmmbl
305 天前
现代浏览器都直接支持打开串口了,直接在浏览器端打开串口练到硬件好了,然后浏览器和服务器 Java 直接走 websocket 。Java 将数据通过 websocket 发给浏览器,浏览器原封不变再发给串口。不过开发这个少说也得一天吧,一天给程序员工资也得几千了吧。
duckrxy
305 天前
对接硬件设备的服务端程序应该部署在边缘服务器上,负责通过各种协议操控/读取硬件设备的数据,同时提供查询/控制接口或用 mqtt 把数据提供给负责业务需求的服务端,这个可以部署在云上,也可以部署在内网,用户 UI 通过和该服务端交互获得硬件设备的状态乃至操作硬件设备,大致是这样:
hardware <--> edge server <-(api/mqtt)-> application server <--> UI
momocraft
305 天前
这是应该开发完再解决的问题吗?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1018119

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX