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. 建议定期导出配置备份
相关推荐
Wyz201210242 小时前
宝塔面板安装后显示无法连接数据库_检查MySQL服务状态
jvm·数据库·python
2301_777599372 小时前
Redis如何优化大量对象存储_利用Hash结构减少内存碎片占用
jvm·数据库·python
2301_777599372 小时前
Python怎么解压tar.gz_tarfile模块提取打包文件操作
jvm·数据库·python
2301_815279522 小时前
HTML怎么标注密钥权限范围_HTML “仅读取用户信息”说明【操作】
jvm·数据库·python
m0_678485452 小时前
Go语言怎么用Jaeger_Go语言Jaeger链路追踪教程【实用】
jvm·数据库·python
NotFound4862 小时前
c++如何通过解析二进制PE文件头检测程序是否开启了DEP保护机制【进阶】
jvm·数据库·python
fly spider2 小时前
MySQL之优化
数据库·mysql·oracle
zhangchaoxies2 小时前
PHP源码能否在NAS设备上运行_NAS部署PHP源码可行性【教程】
jvm·数据库·python
2301_764150562 小时前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务 + 子服务)
jvm·数据库·python