用python 进行雷电接口检测

雷电接口检测工具说明文档

功能概述

这个Python脚本用于检测系统的雷电(Thunderbolt)接口支持情况,包括:

  • 检测系统是否有雷电控制器
  • 检测Type-C/雷电端口
  • 识别雷电接口版本(Thunderbolt 1-5)
  • 显示理论传输速度
  • 列出已连接的雷电设备

代码结构

1. 基础支持检测函数

python 复制代码
def check_thunderbolt_support() -> Dict[str, bool]

这个函数通过Windows Management Instrumentation (WMI)命令检查系统的雷电支持情况,返回一个包含以下信息的字典:

  • has_controller: 是否存在雷电控制器
  • has_port: 是否有Type-C/雷电端口
  • is_active: 雷电接口是否处于激活状态

2. 版本检测函数

python 复制代码
def get_thunderbolt_version() -> Dict[str, str]

识别系统支持的雷电版本,返回版本号和对应的理论速度:

  • Thunderbolt 5: 80 Gbps (双向), 最高120 Gbps (单向)
  • Thunderbolt 4: 40 Gbps
  • Thunderbolt 3: 40 Gbps
  • Thunderbolt 2: 20 Gbps
  • Thunderbolt 1: 10 Gbps

3. 详细信息获取函数

python 复制代码
def get_detailed_thunderbolt_info() -> List[Dict[str, str]]

获取所有已连接雷电设备的详细信息,包括:

  • 设备名称
  • 制造商信息
  • 设备状态

4. 状态报告函数

python 复制代码
def print_thunderbolt_status()

生成完整的雷电接口支持状态报告,包括:

  • 主机雷电支持情况
  • 主机雷电版本信息
  • 已连接设备列表
  • 使用注意事项

使用方法

  1. 直接运行脚本:
bash 复制代码
python thunderbolt_check.py
  1. 作为模块导入:
python 复制代码
from thunderbolt_check import check_thunderbolt_support, get_thunderbolt_version

# 检查基本支持
support_info = check_thunderbolt_support()

# 获取版本信息
version_info = get_thunderbolt_version()

注意事项

  1. 实际传输速度取决于:

    • 主机支持的雷电版本
    • 连接设备支持的雷电版本
    • 实际会以两者中较低的速度运行
  2. 如果检测结果显示有雷电端口但未激活:

    • 检查BIOS设置中的雷电支持选项
    • 确保已安装最新的雷电驱动程序
  3. 版本速度对照表:

    版本 理论速度 备注
    Thunderbolt 5 80/120 Gbps 预计2024年底推出
    Thunderbolt 4 40 Gbps 要求更严格的认证
    Thunderbolt 3 40 Gbps 最广泛使用的版本
    Thunderbolt 2 20 Gbps 较老的版本
    Thunderbolt 1 10 Gbps 最早的版本

技术实现细节

  1. 使用subprocess模块执行WMI命令
  2. 通过正则表达式解析设备信息
  3. 支持中英文设备描述识别
  4. 异常处理确保程序稳定运行

可能的错误和解决方案

  1. "获取雷电版本信息时出错"

    • 确保以管理员权限运行
    • 检查WMI服务是否正常运行
  2. "未检测到已连接的雷电设备"

    • 确认设备是否正确连接
    • 检查设备驱动是否正确安装

代码:

python 复制代码
import subprocess
import re
from typing import Dict, List, Tuple

def check_thunderbolt_support() -> Dict[str, bool]:
    """
    检查系统是否支持雷电接口
    
    Returns:
        Dict[str, bool]: 包含雷电接口支持信息的字典
        {
            'has_controller': bool,  # 是否有雷电控制器
            'has_port': bool,        # 是否有雷电端口
            'is_active': bool        # 雷电接口是否激活
        }
    """
    result = {
        'has_controller': False,
        'has_port': False,
        'is_active': False
    }
    
    try:
        # 检查 USB 控制器中的 Type-C 和雷电支持
        usb_controllers = subprocess.check_output(
            ["wmic", "path", "Win32_USBController", "get", "name,manufacturer"], 
            encoding='gbk'
        ).strip()
        
        if "Type-C" in usb_controllers:
            result['has_port'] = True
        
        # 检查设备管理器中的雷电设备
        tb_devices = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where", 
             "caption like '%Thunderbolt%' OR caption like '%雷电%'", 
             "get", "caption,status"], 
            encoding='gbk'
        ).strip()
        
        if tb_devices and len(tb_devices.split('\n')) > 1:
            result['has_controller'] = True
            # 检查是否有正在工作的雷电设备
            if "OK" in tb_devices or "正常" in tb_devices:
                result['is_active'] = True
        
        # 额外检查 PCI 设备中的雷电控制器
        pci_devices = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where", 
             "deviceid like '%PCI%'", "get", "caption"],
            encoding='gbk'
        ).strip()
        
        if any(x in pci_devices.lower() for x in ['thunderbolt', '雷电']):
            result['has_controller'] = True
            
    except Exception as e:
        print(f"检查雷电支持时出错: {e}")
    
    return result

def get_detailed_thunderbolt_info() -> List[Dict[str, str]]:
    """
    获取详细的雷电接口信息
    
    Returns:
        List[Dict[str, str]]: 包含所有雷电设备信息的列表
    """
    devices = []
    try:
        # 获取所有可能的雷电相关设备
        cmd_output = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where",
             "caption like '%Thunderbolt%' OR caption like '%雷电%' OR caption like '%Type-C%'",
             "get", "caption,manufacturer,status,deviceid"],
            encoding='gbk'
        ).strip()
        
        # 解析输出
        lines = cmd_output.split('\n')
        if len(lines) > 1:  # 跳过标题行
            headers = [h.strip().lower() for h in lines[0].split('  ') if h.strip()]
            for line in lines[1:]:
                if line.strip():
                    # 使用多个空格分割并过滤空字符串
                    values = [v.strip() for v in re.split(r'\s{2,}', line) if v.strip()]
                    if len(values) >= len(headers):
                        device = dict(zip(headers, values))
                        devices.append(device)
    
    except Exception as e:
        print(f"获取详细雷电信息时出错: {e}")
    
    return devices

def get_thunderbolt_version() -> Dict[str, str]:
    """
    获取雷电接口版本和速度信息
    
    Returns:
        Dict[str, str]: 包含雷电版本和速度信息的字典
    """
    version_info = {
        'version': 'Unknown',
        'speed': 'Unknown'
    }
    
    try:
        # 检查设备管理器中的雷电设备描述
        tb_devices = subprocess.check_output(
            ["wmic", "path", "Win32_PnPEntity", "where",
             "caption like '%Thunderbolt%' or caption like '%雷电%'",
             "get", "caption,description"],
            encoding='gbk'
        ).strip()
        
        # 根据描述判断版本
        if 'Thunderbolt 5' in tb_devices or '雷电 5' in tb_devices:
            version_info['version'] = 'Thunderbolt 5'
            version_info['speed'] = '80 Gbps (双向), 最高120 Gbps (单向)'
        elif 'Thunderbolt 4' in tb_devices or '雷电 4' in tb_devices:
            version_info['version'] = 'Thunderbolt 4'
            version_info['speed'] = '40 Gbps'
        elif 'Thunderbolt 3' in tb_devices or '雷电 3' in tb_devices:
            version_info['version'] = 'Thunderbolt 3'
            version_info['speed'] = '40 Gbps'
        elif 'Thunderbolt 2' in tb_devices or '雷电 2' in tb_devices:
            version_info['version'] = 'Thunderbolt 2'
            version_info['speed'] = '20 Gbps'
        elif 'Thunderbolt' in tb_devices or '雷电' in tb_devices:
            version_info['version'] = 'Thunderbolt 1'
            version_info['speed'] = '10 Gbps'
            
    except Exception as e:
        print(f"获取雷电版本信息时出错: {e}")
    
    return version_info

def print_thunderbolt_status():
    """
    打印雷电接口支持状态报告
    """
    print("=" * 50)
    print("雷电接口支持状态检查报告")
    print("=" * 50)
    
    # 检查基本支持情况
    support_info = check_thunderbolt_support()
    print("\n主机雷电支持情况:")
    print(f"- 雷电控制器: {'✓ 已找到' if support_info['has_controller'] else '✗ 未找到'}")
    print(f"- Type-C/雷电端口: {'✓ 存在' if support_info['has_port'] else '✗ 不存在'}")
    print(f"- 雷电接口状态: {'✓ 已激活' if support_info['is_active'] else '✗ 未激活'}")
    
    # 获取并显示版本信息
    version_info = get_thunderbolt_version()
    print(f"\n主机雷电版本信息:")
    print(f"- 版本: {version_info['version']}")
    print(f"- 理论速度: {version_info['speed']}")
    
    # 获取详细信息
    detailed_info = get_detailed_thunderbolt_info()
    if detailed_info:
        print("\n已连接的雷电设备:")
        for idx, device in enumerate(detailed_info, 1):
            print(f"\n设备 {idx}:")
            if 'caption' in device:
                print(f"- 设备名称: {device['caption']}")
            if 'manufacturer' in device:
                print(f"- 制造商: {device['manufacturer']}")
            if 'status' in device:
                print(f"- 状态: {device['status']}")
    else:
        print("\n未检测到已连接的雷电设备")
    
    print("\n注意事项:")
    if not support_info['has_controller']:
        print("- 系统可能不支持雷电接口")
    if support_info['has_port'] and not support_info['is_active']:
        print("- 雷电接口存在但未激活,请检查BIOS设置")
    if support_info['has_controller'] and support_info['has_port']:
        print("- 系统支持雷电接口,如遇问题请更新驱动")
    print("- 实际传输速度取决于主机和设备支持的最低雷电版本")

if __name__ == "__main__":
    print_thunderbolt_status()
相关推荐
David爱编程10 分钟前
Java 守护线程 vs 用户线程:一文彻底讲透区别与应用
java·后端
小奏技术27 分钟前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
小研说技术1 小时前
Spring AI存储向量数据
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记1 小时前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
陈三一1 小时前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure1 小时前
万字详解JVM
java·jvm·后端
我崽不熬夜1 小时前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜2 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee
文火冰糖的硅基工坊2 小时前
[激光原理与应用-317]:光学设计 - Solidworks - 草图
开发语言·python·信息可视化·系统架构