用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()
相关推荐
hikktn11 分钟前
Java 兼容读取WPS和Office图片,结合EasyExcel读取单元格信息
java·开发语言·wps
小青柑-1 小时前
Go语言中的接收器(Receiver)详解
开发语言·后端·golang
豪宇刘1 小时前
JavaScript 延迟加载的方法
开发语言·javascript
张声录11 小时前
【Prometheus】【Blackbox Exporter】深入解析 ProbeTCP 函数:如何实现 Go 中的 TCP/SSL 协议探测
tcp/ip·golang·prometheus
摇光932 小时前
js迭代器模式
开发语言·javascript·迭代器模式
美丽的欣情2 小时前
Qt实现海康OSD拖动Demo
开发语言·qt
C++小厨神3 小时前
Bash语言的计算机基础
开发语言·后端·golang
BinaryBardC3 小时前
Bash语言的软件工程
开发语言·后端·golang
飞yu流星3 小时前
C++ 函数 模板
开发语言·c++·算法
没有名字的鬼3 小时前
C_字符数组存储汉字字符串及其索引
c语言·开发语言·数据结构