展厅中控总体架构

本文按当前代码阐述,不写账号、口令、令牌、现场目录和具体地址。早期方案里的「单文件数据库、以网络唤醒为主」已不再是现状。

1. 出发点

展厅要在一块触控屏上完成三件事:开灯和设备回路、触发已有视频中控上的播放按钮、让若干展厅电脑先软关机再断电。配置不能写死在界面里,现场要能改串口、设备和命令。

约束大致是:

  • 灯控走中控机上的串口,协议由照明模块厂商规定,不经过视频中控。
  • 视频文件和播放器不在本系统里。本系统只按「视频名 → 播放/暂停/停止命令」去触发外部中控按钮。
  • 电脑关机和断电是两条链路:软关用目标机上的小程序或系统远程关机;断电用串口继电器。通电后是否开机,靠机器自身的来电自启,不由本系统发开机包作为主路径。
  • 操作屏和管理员可能不是同一台机器。触控端是安装包,管理端是浏览器。
  • 部署环境是 Windows。希望一个目录解开就能跑,服务能开机自启,出问题能看当天日志。

因此不做「大平台」:一个进程同时提供页面、控制接口和管理接口;配置进数据库;现场协议变化时改帧生成,而不是让操作员手写每一条 HEX。

2. 总体形态

复制代码
触控安装包 ──HTTP──┐
浏览器控制页 ──────┼──► 中控进程(页面 + 控制 API + 管理 API)
浏览器管理页 ──────┘         │
                             ├── MariaDB(设备、命令、串口、账号、日志)
                             ├── 串口 ── 照明模块(灯 / 设备电源)
                             ├── HTTP ── 视频中控(按钮,可关闭)
                             └── HTTP 或远程关机命令 ── 展厅电脑上的关机程序

同一套前端有三条路由:

入口 谁用 做什么
控制页 讲解员、触控屏 大按钮:展区、照明、设备、关机
管理页 实施与运维 串口、设备、命令、关机名单、账号、日志、安装包下载
桌面壳 操作屏常驻 内嵌同一套页面;生产环境自行配置中控地址

桌面壳不另写业务。浏览器打开中控地址时,接口用相对路径。安装包里的页面没有「当前站点」,所以只在桌面生产环境把接口指到配置好的主机和端口。

3. 进程里有什么

启动后工作目录固定到程序所在文件夹,便于 static/、配置和日志相对路径生效。随后:

  1. 读配置:监听地址、数据库、串口默认参数、视频中控开关、关机方式。
  2. 连接数据库,补齐表结构;若还没有串口记录,写入一条默认串口(已有记录不覆盖)。
  3. 按需写入初始设备和开/关命令;已有账号时不覆盖口令。
  4. 打开默认串口档案;视频中控客户端按配置启用或停用。
  5. 同一 HTTP 服务注册控制接口、管理接口,并托管前端静态文件。

控制与管理共用登录。令牌带过期时间(当前 12 小时)。探活和版本接口公开,执行命令、改配置需要登录。

数据模型的核心是四张业务关系,而不是一张「按钮表」:

  • 串口:COM、波特率、数据位、校验、停止位。设备只保存串口编号,不把 COM 和波特率抄进每台设备。
  • 设备:灯、用电设备、视频中控按钮、电源等类型。灯和用电设备另有点位、说明、区域,便于和点表对照。
  • 命令:挂在设备上。串口命令存 HEX;视频中控命令存按钮参数;关机相关命令走关机名单,不和灯命令混用。同一设备、同一类型、同一名称不重复插入。
  • 关机目标:每台电脑一种方式(小程序或系统远程关机),以及是否参与「一键关机」。

操作日志记来源、动作、详情和成败,管理端分页查看。

4. 三条控制链路

灯和设备电源

点表同步按名称和点位生成设备,再按模块地址和回路生成两条命令(开、关)。回路号只进帧,不作为设备列长期保存。当前帧按照明模块协议:写多个寄存器,帧尾为真实校验;串口在无校验时使用 2 个停止位。下发时进程内串口加锁,避免两条指令叠在同一条 485 总线上。

整模块「全开 / 全关」仍保留给旧的模块型设备;日常灯控以单回路为准。

视频

控制页不保存片源。管理端把某段视频映射到外部中控的播放、暂停、停止。运行时由本系统登录外部中控(若启用)并调用其控制接口。外部中控关闭或接口不可用时,视频区应视为不可用,灯控不依赖它。

电脑关机与通电

「关机」在产品上是组合动作:先按名单软关全部目标电脑,等待一段时间,再通过串口关掉对应电源回路。「通电」只做回路上电,开机靠来电自启。

软关有两种实现,按机器预选,而不是每次在触控屏上选:

  • 目标机运行关机小程序,本系统带约定请求头调用其关机接口。
  • 或不装小程序,改由中控机发起系统远程关机(依赖对方防火墙和管理权限,现场更脆)。

5. 为什么做成这样

一个进程托管页面和接口。 现场机器少,少一个反向代理就少一处端口和证书问题。缺点是页面和接口必须一起发布,不能只热更新前端而不替换程序(静态文件可以覆盖,但习惯上整包升级)。

配置进数据库,连接参数进配置文件。 串口、设备、命令每天可能改;数据库地址和关机端口不该让讲解员改。首次启动可以把配置文件里的串口和初始管理员写入库,之后以库为准,升级不覆盖已有配置文件。

控制页和管理页共用账号与令牌。 少一套用户系统。代价是权限目前是「登录即可操作」,没有只读讲解账号和只改配置的管理员之分。记住口令只存在当前这一种程序里(桌面壳或某一个浏览器),不会在机器之间同步。

命令是数据,不是代码里的开关表。 点表变更时重新同步命令即可。代价是协议一变,库里的旧 HEX 不会自动重算,必须再同步一次。

关机与断电拆开。 软关失败时仍可按策略断电,但等待时间是固定配置,不是探测操作系统是否已经关机。过短会断电过早,过长则现场干等。

6. 优点

  • 触控、浏览器、管理端同一套界面,按钮和配置不会各写一份。
  • 中控机只需串口、数据库和本进程;灯控不依赖视频中控是否在线。
  • 发布物是目录:程序、页面、配置、服务外壳。安装目录不固定,服务用外壳拉起普通程序并写日志。
  • 协议和点表变化集中在帧生成与同步,操作页仍是「按名字点开/关」。
  • 日志按天落在安装目录,排查下发内容不必先连数据库。

7. 缺点与边界

  • 单进程、单串口活动档案。 同一时刻一条总线顺序发送。多块模块若挂在不同 COM 上,需要切换默认串口或扩展为按设备选择已打开的口;当前运行时以默认串口为准。
  • 无细粒度权限。 能登录就能测命令、能关机。适合封闭展厅,不适合把管理页暴露到不可信网络。
  • 令牌过期只有固定时长,没有滑动续期。展厅若连续开放超过该时长,要靠自动登录重新鉴权,而自动登录依赖本机曾保存口令。
  • 桌面端必须配置服务器地址。 装错网段或端口时,界面仍能打开,但所有接口失败。浏览器没有这个问题。
  • 数据库是外部服务。 比单文件库多一个安装和备份步骤;中控机磁盘坏了也不能只拷一个文件恢复全部配置。
  • 视频能力受外部中控接口开通情况限制。 本系统映射再完整,对方不接受控制也播不了。
  • 远程关机两条路都有现场条件。 小程序要装到每台电脑且请求头一致;系统远程关机要通防火墙和管理权限。通电开机不在本系统内保证。
  • 早期架构说明已过时。 以本文和代码为准:数据库为 MariaDB;灯控为照明模块寄存器协议;服务注册依赖服务外壳,而不是把普通程序直接注册成系统服务。
相关推荐
茉莉玫瑰花茶5 小时前
GO [ 条件/循环控制 ]
go
茉莉玫瑰花茶5 小时前
GO [ 数据类型 ]
go
sunoo-2291 天前
【嵌入式裸机开发Day04】i.MX6ULL 蜂鸣器驱动详解:从引脚地址查找到代码实现全流程
arm开发·单片机·嵌入式硬件·学习·串口·裸机
云浪1 天前
Go Context 到底是什么?
后端·go
newerp1 天前
系统调用与 M/P 解绑
后端·程序员·go
newerp1 天前
抢占式调度实现细节
后端·程序员·go
小小龙学IT1 天前
Go 语言 net/http 网络编程深度解析:从 Handler 到生产级 HTTP 服务
go
名字还没想好☜1 天前
Go 实现指数退避重试:context 取消、抖动 jitter 与什么时候别重试
后端·golang·go
我不会起名字3221 天前
一天一道力扣Hot100(37):深度优先算法--括号生成
java·数据结构·c++·后端·python·算法·go