40x40 矩阵控制系统
40x40 矩阵控制系统 - 技术文档
1. 项目概述
本系统是一个用于控制40x40音视频矩阵的桌面应用程序,通过以太网(TCP/IP)与矩阵设备通信,实现灵活的路由切换和预设管理功能。
1.1 技术栈
| 组件 | 技术 |
|---|---|
| 编程语言 | Python 3.12 |
| GUI框架 | tkinter (Python标准库) |
| 数据库 | SQLite |
| 通信协议 | TCP/IP Socket |
1.2 项目结构
juzhen/ ├── config/ # 配置管理模块 │ └── __init__.py # 配置类 ├── core/ # 核心控制引擎 │ └── __init__.py # 矩阵控制器 ├── protocol/ # 通信抽象层 │ └── __init__.py # 协议适配器 ├── storage/ # 数据持久化层 │ └── __init__.py # 数据库操作 ├── ui/ # GUI界面 │ └── __init__.py # 主窗口类 ├── data/ # 数据目录 │ └── matrix.db # SQLite数据库 ├── config/ # 配置目录 │ └── settings.json # 配置文件 ├── main.py # 程序入口 └── requirements.txt # 依赖清单2. 功能模块
2.1 配置管理 (config)
Config类负责应用程序配置的加载、保存和访问。
主要功能:
- 从JSON文件加载配置
- 保存配置到JSON文件
- 支持层级配置访问(如
protocol.switch_format)
默认配置:
{"matrix_ip":"192.168.1.100","matrix_port":23,"connection_timeout":5,"command_delay":0.05,"retry_count":2,"sync_interval":5,"protocol":{"switch_format":"{in_}V{out}\r","query_output_format":"Q{out}\r","query_all_format":"ALLSTATUS\r","response_delimiter":"\r"}}2.2 通信协议 (protocol)
ProtocolAdapter类负责与矩阵设备建立TCP连接并发送指令。
主要功能:
- TCP连接到矩阵设备
- 发送切换指令
- 发送查询指令
- 支持指令重试机制
核心方法:
# 连接矩阵connect(ip,port)->bool# 断开连接disconnect()# 发送指令send_command(command,wait_response=False,timeout=2)->response# 生成切换指令generate_switch_command(input_id,output_id)->str# 生成查询指令generate_query_command(output_id)->str2.3 核心控制引擎 (core)
MatrixController类实现核心的矩阵控制逻辑,包括路由状态管理和预设部分调用。
主要功能:
- 维护40x40路由状态缓存
- 实现预设部分调用逻辑
- 自动同步矩阵状态
核心方法:
# 切换路由switch(input_id,output_id)->bool# 应用预设(部分调用)apply_preset(preset_id)->bool# 查询单个输出路由query_route(output_id)->input_id# 查询全部路由query_all_routes()# 保存当前路由到预设save_current_to_preset(preset_id)->dict部分调用算法:
defapply_preset(self,preset_id):mappings=self.database.load_preset(preset_id)foroutput_idinsorted(mappings.keys()):input_id=mappings[output_id]# 检查当前是否已是此路由current_input=self.get_current_input(output_id)ifcurrent_input!=input_id:# 发送切换指令self.switch(input_id,output_id)# 未在预设中出现的输出端口保持不变2.4 数据存储 (storage)
Database类负责SQLite数据库操作,存储预设和端口标签。
主要功能:
- 预设的增删改查
- 输入/输出端口标签管理
- 配置导入/导出
数据库表结构:
-- 预设表CREATETABLEpresets(idINTEGERPRIMARYKEY,nameTEXTNOTNULL,mappingsTEXTNOTNULL,-- JSON格式: {"1": 2, "3": 4}created_timeTEXTNOTNULL,updated_timeTEXTNOTNULL);-- 输入标签表CREATETABLEinput_labels(input_idINTEGERPRIMARYKEY,labelTEXTNOTNULL);-- 输出标签表CREATETABLEoutput_labels(output_idINTEGERPRIMARYKEY,labelTEXTNOTNULL);2.5 用户界面 (ui)
MainWindow类使用tkinter实现完整的图形界面。
界面布局:
+-------------------------------------------------------------------+ | [连接矩阵] IP:192.168.1.100 端口:23 状态:已连接 [刷新状态] | +-------------------------------------------------------------------+ | 预设方案: | | [方案1] [方案2] [方案3] [方案4] [方案5] [保存当前] [查看预设] | | [方案6] [方案7] [方案8] [方案9] [方案10] | +-------------------------------------------------------------------+ | 手动切换: 输入: [摄像机1 ▼] → 输出: [投影机左 ▼] [切换] | +-------------------------------------------------------------------+ | 矩阵路由视图: | | +-------------------------+ +-------------------------+ | | | 输入端口 | | 输出端口 | | | | IN1 → OUT3 (投影机) | | OUT1 ← IN5 (摄像机2) | | | | IN2 → OUT4 | | OUT2 ← IN1 (摄像机1) | | | | ... | | ... | | | +-------------------------+ +-------------------------+ | | 提示: 点击端口可查看连接信息,选择后进行切换 | +-------------------------------------------------------------------+ | 状态: 已连接到 192.168.1.100:23 | +-------------------------------------------------------------------+菜单功能:
- 文件 → 导出配置 / 导入配置 / 退出
- 工具 → 编辑输入标签 / 编辑输出标签
3. 通信协议
3.1 默认指令格式
| 操作 | 指令格式 | 示例 |
|---|---|---|
| 切换 | {in}V{out}\r | 1V3\r(IN1→OUT3) |
| 查询单路 | Q{out}\r | Q3\r(查询OUT3) |
| 查询全部 | ALLSTATUS\r | ALLSTATUS\r |
3.2 响应解析
系统会自动解析矩阵返回的响应,提取当前输入源编号。
4. 使用说明
4.1 运行程序
python main.py4.2 连接矩阵
- 在IP输入框中输入矩阵的IP地址
- 在端口输入框中输入端口号(默认23)
- 点击"连接矩阵"按钮
- 连接成功后状态显示为"已连接"
4.3 手动切换
- 从"输入"下拉框选择输入源
- 从"输出"下拉框选择目标输出
- 点击"切换"按钮
- 确认弹出的对话框
4.4 预设管理
调用预设:
- 点击方案按钮直接调用预设
保存预设:
- 先设置好当前路由
- 点击"保存当前"按钮
- 输入方案编号
查看预设:
- 点击"查看预设"按钮,可查看所有预设详情
4.5 端口标签
- 点击菜单"工具" → “编辑输入标签"或"编辑输出标签”
- 为每个端口设置自定义名称
- 点击"确定"保存
4.6 配置导入/导出
- 点击菜单"文件" → “导出配置”
- 选择保存路径(JSON格式)
- 导入时选择JSON文件即可
5. 典型使用场景
场景:部分调用验证
初始状态: - 方案一 = {1→3, 2→4} - 方案二 = {1→4, 2→3} 操作步骤: 1. 调用方案一 → 路由变为:1-3, 2-4 2. 手动修改 5→8 → 路由:1-3, 2-4, 5-8 3. 调用方案二 → 仅执行 1→4, 2→3,5-8 保持不变 最终路由:1→4, 2→3, 5→8 ✅6. 配置说明
6.1 协议配置
如果矩阵设备的通信协议不同,可以修改config/settings.json中的协议格式:
{"protocol":{"switch_format":"{in_}V{out}\r","query_output_format":"Q{out}\r","query_all_format":"ALLSTATUS\r","response_delimiter":"\r"}}6.2 其他参数
| 参数 | 说明 | 默认值 |
|---|---|---|
| connection_timeout | 连接超时(秒) | 5 |
| command_delay | 指令间隔(秒) | 0.05 |
| retry_count | 重试次数 | 2 |
| sync_interval | 自动同步间隔(秒) | 5 |
7. 版本信息
| 版本 | 日期 | 说明 |
|---|---|---|
| 1.0 | 2025-03 | 初始版本 |
| 1.1 | 2025-04 | 优化界面,改为上下两表 |
8. 注意事项
- 确保矩阵设备与控制电脑网络互通
- 确认矩阵设备的TCP端口已开放
- 部分调用功能不会影响未在预设中定义的输出端口
- 建议定期导出配置备份
