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)

默认配置:

python 复制代码
{
    "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连接到矩阵设备
  • 发送切换指令
  • 发送查询指令
  • 支持指令重试机制

核心方法:

python 复制代码
# 连接矩阵
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) -> str

2.3 核心控制引擎 (core)

MatrixController 类实现核心的矩阵控制逻辑,包括路由状态管理和预设部分调用。

主要功能:

  • 维护40x40路由状态缓存
  • 实现预设部分调用逻辑
  • 自动同步矩阵状态

核心方法:

python 复制代码
# 切换路由
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

部分调用算法:

python 复制代码
def apply_preset(self, preset_id):
    mappings = self.database.load_preset(preset_id)
  
    for output_id in sorted(mappings.keys()):
        input_id = mappings[output_id]
      
        # 检查当前是否已是此路由
        current_input = self.get_current_input(output_id)
      
        if current_input != input_id:
            # 发送切换指令
            self.switch(input_id, output_id)
  
    # 未在预设中出现的输出端口保持不变

2.4 数据存储 (storage)

Database 类负责SQLite数据库操作,存储预设和端口标签。

主要功能:

  • 预设的增删改查
  • 输入/输出端口标签管理
  • 配置导入/导出

数据库表结构:

sql 复制代码
-- 预设表
CREATE TABLE presets (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    mappings TEXT NOT NULL,      -- JSON格式: {"1": 2, "3": 4}
    created_time TEXT NOT NULL,
    updated_time TEXT NOT NULL
);

-- 输入标签表
CREATE TABLE input_labels (
    input_id INTEGER PRIMARY KEY,
    label TEXT NOT NULL
);

-- 输出标签表
CREATE TABLE output_labels (
    output_id INTEGER PRIMARY KEY,
    label TEXT NOT NULL
);

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 运行程序

bash 复制代码
python main.py

4.2 连接矩阵

  1. 在IP输入框中输入矩阵的IP地址
  2. 在端口输入框中输入端口号(默认23)
  3. 点击"连接矩阵"按钮
  4. 连接成功后状态显示为"已连接"

4.3 手动切换

  1. 从"输入"下拉框选择输入源
  2. 从"输出"下拉框选择目标输出
  3. 点击"切换"按钮
  4. 确认弹出的对话框

4.4 预设管理

调用预设:

  • 点击方案按钮直接调用预设

保存预设:

  1. 先设置好当前路由
  2. 点击"保存当前"按钮
  3. 输入方案编号

查看预设:

  • 点击"查看预设"按钮,可查看所有预设详情

4.5 端口标签

  1. 点击菜单"工具" → "编辑输入标签"或"编辑输出标签"
  2. 为每个端口设置自定义名称
  3. 点击"确定"保存

4.6 配置导入/导出

  1. 点击菜单"文件" → "导出配置"
  2. 选择保存路径(JSON格式)
  3. 导入时选择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 中的协议格式:

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. 注意事项

  1. 确保矩阵设备与控制电脑网络互通
  2. 确认矩阵设备的TCP端口已开放
  3. 部分调用功能不会影响未在预设中定义的输出端口
  4. 建议定期导出配置备份
相关推荐
oradh1 小时前
Oracle 执行计划的阅读方法(二叉树结构来理解和阅读)
数据库·oracle·执行计划的阅读方法
imDwAaY1 小时前
Java中垃圾回收器 G1 和 CMS 有什么区别?
jvm·后端
xiaoqiMikko1 小时前
JVM 线上排查实战(五):升 JDK 17 后进程起不来,十几个老 GC 参数挨个实测(完结)
java·jvm
Flynt1 小时前
Java 27 悄悄改了 3 个默认值,我在 1 核小机器上逐个验证了一遍
java·jvm·性能优化
xiaoqiMikko2 小时前
JVM 线上排查实战(三):grep BLOCKED 找不到的死锁,和 jstack 根本不报的死锁
java·jvm
此时不提桶,更待何时5 天前
01-06-A-JVM排查实战详解
java·jvm
wuminyu6 天前
HotSpot的轻量锁与膨胀后的ObjectMonitor状态重建原理
java·linux·c语言·jvm·c++
lbb 小魔仙6 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
需要8266 天前
JVM 内存区域与对象创建:一次 GC 从哪来
java·jvm·spring boot·spring·servlet·tomcat
凤山老林6 天前
Spring Boot 应用 JVM 性能调优实战:GC 日志分析、堆内存规划与容器环境避坑
jvm·spring boot·gc·堆内存