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. 建议定期导出配置备份
相关推荐
南境十里·墨染春水11 小时前
C++日志 2——实现单线程日志系统
java·jvm·c++
im_AMBER12 小时前
手撕hot100之矩阵!看完这篇就AC~
javascript·数据结构·线性代数·算法·leetcode·矩阵
愿^O^~12 小时前
JVM GC 入门 → 进阶
jvm
Wadli13 小时前
hot100|矩阵
线性代数·矩阵
zxrhhm15 小时前
PostgreSQL 中的层级查询 Oracle CONNECT BY 替代方案
数据库·postgresql·oracle
身如柳絮随风扬16 小时前
Java对象在计算机中的执行原理:从JVM内存模型到对象创建全过程
java·开发语言·jvm
呃呃本18 小时前
算法题(矩阵)
线性代数·算法·矩阵
呃呃本18 小时前
算法题(普通数组、矩阵)
线性代数·算法·矩阵
江湖有缘19 小时前
保姆级教程:Docker 部署 Portracker 端口监控工具
jvm·docker·容器
湖南天硕国产SSD19 小时前
【无标题】
jvm·ssd·固态硬盘·工业存储·高可靠ssd·天硕存储