V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
lalalaXxx
V2EX  ›  程序员

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

  •  
  •   lalalaXxx · 273 天前 · 5842 次点击
    这是一个创建于 273 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境

    后端: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 条附言  ·  272 天前
    #感谢各位大佬提出的意见

    1.确实这些事情,在立项的时候就应该考虑到,最简单的就是用 c# .net 或者 c++ 等 写一个 exe 应用程序,客户安装到自己电脑上 里面在内置可以发送 webapi 的功能 这应该是最标准的实现 串口的方式;

    2.但是针对现在的情况 开发上位机 或者用 c#从新搞 太麻烦了,只能硬着头皮,从现有的情况去尽可能地改进;


    # 目前最终决定

    使用 js 的串口库 serialport ,在 vue 项目里,去做操作串口的业务,java 项目还是部署到云端,然后客户端去调 Java 的 api 。
    47 条回复    2024-02-26 15:24:08 +08:00
    crazytudou
        1
    crazytudou  
       273 天前   ❤️ 1
    做个 C/S 壳,里面用浏览器控件打开网站,硬件<=>桌面程序<=>网站,桌面程序作为中间桥梁,做啥都行。
    silentsky
        2
    silentsky  
       273 天前
    买个小型的服务器部署不行吗 为什么要关机
    twofox
        3
    twofox  
       273 天前
    用 electron 或者 Java 单独写个客户端。这个客户端在本机起一个 socket 服务。
    vue 网页通过 socket 与这个客户端进行通讯,操作硬件设备

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

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

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


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

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

    https://www.graalvm.org/latest/reference-manual/native-image/
    msmmbl
        18
    msmmbl  
       273 天前 via Android   ❤️ 1
    现代浏览器都直接支持打开串口了,直接在浏览器端打开串口练到硬件好了,然后浏览器和服务器 Java 直接走 websocket 。Java 将数据通过 websocket 发给浏览器,浏览器原封不变再发给串口。不过开发这个少说也得一天吧,一天给程序员工资也得几千了吧。
    duckrxy
        19
    duckrxy  
       272 天前
    对接硬件设备的服务端程序应该部署在边缘服务器上,负责通过各种协议操控/读取硬件设备的数据,同时提供查询/控制接口或用 mqtt 把数据提供给负责业务需求的服务端,这个可以部署在云上,也可以部署在内网,用户 UI 通过和该服务端交互获得硬件设备的状态乃至操作硬件设备,大致是这样:
    hardware <--> edge server <-(api/mqtt)-> application server <--> UI
    momocraft
        20
    momocraft  
       272 天前
    这是应该开发完再解决的问题吗?
    ysc3839
        21
    ysc3839  
       272 天前
    “客户那边一台电脑 A 所有硬件设备通过 USB 连接电脑 A ,通过浏览器访问的云服务器的页面,这样的话,是不能直接操作硬件设备的”
    否的,USB 有 WebUSB ,串口有 WebSerial 。实在不行就套一层 Electron 把访问硬件的接口暴露给前端。
    cowcomic
        22
    cowcomic  
       272 天前
    额,首先要确认你这个服务端是只为一台接入端点服务还是面向多台接入端点,其次确认项目后续的维护阶段的投入预算大概是多少
    多端点或高维护预算:1 楼方案
    单端点+低维护预算:改为本地部署,不要用云服务器,做好开机启动,没必要打包,JAVA 、Nginx 之类的环境都是可以直接拷贝使用的,直接做成脚本启动就行
    vircs
        23
    vircs  
       272 天前 via iPhone
    最佳方案:你们自己买一台 supermicro 低功耗服务器,放在客户那里,客户任何问题不需要上门,通过路由器 vpn 监控服务状态,修复你在测试过程中未发现的问题;这样做客户体验好,这类产品云端容易出现问题 修复成本高,客户体验差
    simo
        24
    simo  
       272 天前
    如果非要云端部署,那就把 java 端拆成接口转发客户端 和 业务两个,业务部署到服务器。需要增加的就是客户端和服务端通信设计。
    服务器端能监测到所有节点的状态,异常的,人为处理。如果是自己的实施人员驻场,这个样省事儿
    GameAuto
        25
    GameAuto  
       272 天前
    东西开发完了才来解决这类型的问题,属实有点难办。最简单的方法是搞一个 agent 代理吧,agent 把收集到的请求发送到你们云服务器上。这样改动是最小的,部署完后把 agent 发到客户的电脑上让装一遍。agent 也用 java ,打包成 exe 。或者 python 最方便。
    niubee1
        26
    niubee1  
       272 天前   ❤️ 1
    串口协议 表示你必须在连接串口设备的机器上部署本地的程序才行,可以用 C#写一个带界面的,也可以用别的语言写无头的服务程序,启动一个 httpserver 和 web 页面交互。可以用 go 也可以用 rust 写,C ,C++也是可以的,但是 java 的话你得用最新版本用 graalvm native 编译,python 在 windows 下可以用 py2exe ,直接用 electron 也行,用 tauri 也行。其实一开始实现的时候就该想好了
    imnpc
        27
    imnpc  
       272 天前
    目的是读取 USB 设备吧,建议看下 VirtualHere 服务器和客户机都要安装,需要授权
    joyoyao
        28
    joyoyao  
       272 天前
    买个小型机器,j1900 cpu 就行,几百块钱,24 小时待机。部署一个 agent 读取 usb 信息, 通过 mqtt 协议传到云服务器。
    CLMan
        29
    CLMan  
       272 天前   ❤️ 1
    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 程序。
    kongwenyan
        30
    kongwenyan  
       272 天前
    vue 网页 serial api 已经支持很多浏览器了。前端改一下加入 serialport 和服务器连接。我有一个页面 serial api 的 demo 的供参考 https://kongdayan.github.io/Web-Serial-API-demo/
    kaiveyoung
        31
    kaiveyoung  
       272 天前 via Android
    方案是,弄一个低功耗低成本边缘网关来接硬件,你就几个串口,一百多块钱的设备就能用,有串口,网口,4g/WiFi 。然后你程序只用和边缘网关交互就行
    lalalaXxx
        32
    lalalaXxx  
    OP
       271 天前
    @kongwenyan 感谢
    lalalaXxx
        33
    lalalaXxx  
    OP
       271 天前
    @kongwenyan 有源码吗~
    Felix96
        34
    Felix96  
       271 天前
    最近我有写网页读取串口的的项目,用的是 Web Serial API ,原生浏览器环境 JS 解决,不过 Chrome90 后都支持,最差也需要 windows7 ,兼容性还是很好的,可以放在 NW.s 里作为一个程序运行,看 MDN 真的用处不大,我参考的是
    1. https://wicg.github.io/serial/
    2. https://github.com/itldg/web-serial-debug
    3. https://github.com/Curtion/Web-SerialPort
    优先级 1>2>3 ,简化了 2 的代码,大概一个下午就搞定。
    如果只需要简单的串口读取,可以找我要简化后的代码
    buyerhou
        35
    buyerhou  
       271 天前
    占楼,同样的处境,笨方法,就是分开部署,客户电脑部署一套,服务器部署一套。
    caiqichang
        36
    caiqichang  
       271 天前
    litchinn
        37
    litchinn  
       271 天前
    1. vue 项目是可以直接打包进 springboot 包里的,这样直接启动 springboot 就能访问页面,就和前后端不分离是一样的。再配合 graalvm native image 打包成原生镜像可以直接启动。
    但是你项目引入的第三方包 graalvm native image 打包也许会有坑,也可以选择 exe4j 等工具打包 exe 直接启动。
    2. 不用 java ,纯 js 应该也可以串口通讯。直接 electron 打包。这个我了解不多
    bianhui
        38
    bianhui  
       271 天前
    写个 agent ,用户安装,把原来 java 调用本地硬件地方替换成 agent 通讯。
    laaaaaa
        39
    laaaaaa  
       271 天前
    @Felix96 Web Serial API 能实现同时连上多个串口吗? 我用 API 试了一下,他好像需要 navigator.serial.requestPort(); 让用户选择连哪个串口; 不能直接通过串口名连接吧
    laaaaaa
        40
    laaaaaa  
       271 天前
    @kongwenyan 不支持同时连多个吗
    QWE321ASD
        41
    QWE321ASD  
       271 天前
    Java 也有库支持串口的.jSerialComm
    gaogang
        42
    gaogang  
       271 天前
    @lalalaXxx 第三点的意思,是加一个专门的硬件,串口协议透传成 tcp 流,服务器处理 tcp 流就好了
    Felix96
        43
    Felix96  
       271 天前 via iPhone
    @laaaaaa 浏览器环境不能
    fuckshiter
        44
    fuckshiter  
       271 天前
    chrome89 和 firefox 89 以上支持 web 串口吧,用前端来调用串口
    Hudiebbk
        45
    Hudiebbk  
       271 天前
    用 golang 开发对接硬件,然后开放对外 api,打包 exe 插件在本机直接启动挂到后台,浏览器根据需求调用对应 api 控制硬件,插件只提供功能接口,不处理业务
    sampeng
        46
    sampeng  
       271 天前
    .....为啥是开发完了才发现不对。

    友情提示。方案错了。就要按对的去改,不要为了硬头皮而硬头皮,尤其是跟硬件相关的,升级都非常不方便。
    但你这个项目其实好改。java 的在云端没毛病,暴露出 api 。
    然后 electron 封装 vue 。electron 里面又可以携带 golang/c++/nodejs 任意语言去和串口通信。工作量并不是特别大。只是把 java 实现的再用其他语言再实现一遍。别用 js 的串口库,不是不信任,是擅长的语言干擅长的事。你后面维护是个大坑,js 的人不好招。
    julyclyde
        47
    julyclyde  
       271 天前
    为啥是开发完了才发现?这团队可以全体开除了吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2529 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 15:37 · PVG 23:37 · LAX 07:37 · JFK 10:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.