本文按当前代码阐述,不写账号、口令、令牌、现场目录和具体地址。早期方案里的「单文件数据库、以网络唤醒为主」已不再是现状。
1. 出发点
展厅要在一块触控屏上完成三件事:开灯和设备回路、触发已有视频中控上的播放按钮、让若干展厅电脑先软关机再断电。配置不能写死在界面里,现场要能改串口、设备和命令。
约束大致是:
- 灯控走中控机上的串口,协议由照明模块厂商规定,不经过视频中控。
- 视频文件和播放器不在本系统里。本系统只按「视频名 → 播放/暂停/停止命令」去触发外部中控按钮。
- 电脑关机和断电是两条链路:软关用目标机上的小程序或系统远程关机;断电用串口继电器。通电后是否开机,靠机器自身的来电自启,不由本系统发开机包作为主路径。
- 操作屏和管理员可能不是同一台机器。触控端是安装包,管理端是浏览器。
- 部署环境是 Windows。希望一个目录解开就能跑,服务能开机自启,出问题能看当天日志。
因此不做「大平台」:一个进程同时提供页面、控制接口和管理接口;配置进数据库;现场协议变化时改帧生成,而不是让操作员手写每一条 HEX。
2. 总体形态
触控安装包 ──HTTP──┐
浏览器控制页 ──────┼──► 中控进程(页面 + 控制 API + 管理 API)
浏览器管理页 ──────┘ │
├── MariaDB(设备、命令、串口、账号、日志)
├── 串口 ── 照明模块(灯 / 设备电源)
├── HTTP ── 视频中控(按钮,可关闭)
└── HTTP 或远程关机命令 ── 展厅电脑上的关机程序
同一套前端有三条路由:
| 入口 | 谁用 | 做什么 |
|---|---|---|
| 控制页 | 讲解员、触控屏 | 大按钮:展区、照明、设备、关机 |
| 管理页 | 实施与运维 | 串口、设备、命令、关机名单、账号、日志、安装包下载 |
| 桌面壳 | 操作屏常驻 | 内嵌同一套页面;生产环境自行配置中控地址 |
桌面壳不另写业务。浏览器打开中控地址时,接口用相对路径。安装包里的页面没有「当前站点」,所以只在桌面生产环境把接口指到配置好的主机和端口。
3. 进程里有什么
启动后工作目录固定到程序所在文件夹,便于 static/、配置和日志相对路径生效。随后:
- 读配置:监听地址、数据库、串口默认参数、视频中控开关、关机方式。
- 连接数据库,补齐表结构;若还没有串口记录,写入一条默认串口(已有记录不覆盖)。
- 按需写入初始设备和开/关命令;已有账号时不覆盖口令。
- 打开默认串口档案;视频中控客户端按配置启用或停用。
- 同一 HTTP 服务注册控制接口、管理接口,并托管前端静态文件。
控制与管理共用登录。令牌带过期时间(当前 12 小时)。探活和版本接口公开,执行命令、改配置需要登录。
数据模型的核心是四张业务关系,而不是一张「按钮表」:
- 串口:COM、波特率、数据位、校验、停止位。设备只保存串口编号,不把 COM 和波特率抄进每台设备。
- 设备:灯、用电设备、视频中控按钮、电源等类型。灯和用电设备另有点位、说明、区域,便于和点表对照。
- 命令:挂在设备上。串口命令存 HEX;视频中控命令存按钮参数;关机相关命令走关机名单,不和灯命令混用。同一设备、同一类型、同一名称不重复插入。
- 关机目标:每台电脑一种方式(小程序或系统远程关机),以及是否参与「一键关机」。
操作日志记来源、动作、详情和成败,管理端分页查看。
4. 三条控制链路
灯和设备电源
点表同步按名称和点位生成设备,再按模块地址和回路生成两条命令(开、关)。回路号只进帧,不作为设备列长期保存。当前帧按照明模块协议:写多个寄存器,帧尾为真实校验;串口在无校验时使用 2 个停止位。下发时进程内串口加锁,避免两条指令叠在同一条 485 总线上。
整模块「全开 / 全关」仍保留给旧的模块型设备;日常灯控以单回路为准。
视频
控制页不保存片源。管理端把某段视频映射到外部中控的播放、暂停、停止。运行时由本系统登录外部中控(若启用)并调用其控制接口。外部中控关闭或接口不可用时,视频区应视为不可用,灯控不依赖它。
电脑关机与通电
「关机」在产品上是组合动作:先按名单软关全部目标电脑,等待一段时间,再通过串口关掉对应电源回路。「通电」只做回路上电,开机靠来电自启。
软关有两种实现,按机器预选,而不是每次在触控屏上选:
- 目标机运行关机小程序,本系统带约定请求头调用其关机接口。
- 或不装小程序,改由中控机发起系统远程关机(依赖对方防火墙和管理权限,现场更脆)。
5. 为什么做成这样
一个进程托管页面和接口。 现场机器少,少一个反向代理就少一处端口和证书问题。缺点是页面和接口必须一起发布,不能只热更新前端而不替换程序(静态文件可以覆盖,但习惯上整包升级)。
配置进数据库,连接参数进配置文件。 串口、设备、命令每天可能改;数据库地址和关机端口不该让讲解员改。首次启动可以把配置文件里的串口和初始管理员写入库,之后以库为准,升级不覆盖已有配置文件。
控制页和管理页共用账号与令牌。 少一套用户系统。代价是权限目前是「登录即可操作」,没有只读讲解账号和只改配置的管理员之分。记住口令只存在当前这一种程序里(桌面壳或某一个浏览器),不会在机器之间同步。
命令是数据,不是代码里的开关表。 点表变更时重新同步命令即可。代价是协议一变,库里的旧 HEX 不会自动重算,必须再同步一次。
关机与断电拆开。 软关失败时仍可按策略断电,但等待时间是固定配置,不是探测操作系统是否已经关机。过短会断电过早,过长则现场干等。
6. 优点
- 触控、浏览器、管理端同一套界面,按钮和配置不会各写一份。
- 中控机只需串口、数据库和本进程;灯控不依赖视频中控是否在线。
- 发布物是目录:程序、页面、配置、服务外壳。安装目录不固定,服务用外壳拉起普通程序并写日志。
- 协议和点表变化集中在帧生成与同步,操作页仍是「按名字点开/关」。
- 日志按天落在安装目录,排查下发内容不必先连数据库。
7. 缺点与边界
- 单进程、单串口活动档案。 同一时刻一条总线顺序发送。多块模块若挂在不同 COM 上,需要切换默认串口或扩展为按设备选择已打开的口;当前运行时以默认串口为准。
- 无细粒度权限。 能登录就能测命令、能关机。适合封闭展厅,不适合把管理页暴露到不可信网络。
- 令牌过期只有固定时长,没有滑动续期。展厅若连续开放超过该时长,要靠自动登录重新鉴权,而自动登录依赖本机曾保存口令。
- 桌面端必须配置服务器地址。 装错网段或端口时,界面仍能打开,但所有接口失败。浏览器没有这个问题。
- 数据库是外部服务。 比单文件库多一个安装和备份步骤;中控机磁盘坏了也不能只拷一个文件恢复全部配置。
- 视频能力受外部中控接口开通情况限制。 本系统映射再完整,对方不接受控制也播不了。
- 远程关机两条路都有现场条件。 小程序要装到每台电脑且请求头一致;系统远程关机要通防火墙和管理权限。通电开机不在本系统内保证。
- 早期架构说明已过时。 以本文和代码为准:数据库为 MariaDB;灯控为照明模块寄存器协议;服务注册依赖服务外壳,而不是把普通程序直接注册成系统服务。