最近家里打游戏的时候往往因为延迟波动过大,游戏体验极差,甚至有时无法上线服务器。浏览网页的时候加载时长也令人难以忍受。遂决定在ai辅助下写了个py,结合网络上的帖子解决了一下(代码放最后)

1. 问题表现特征类型

1. ping 路由器延迟高/波动大

2. 靠近路由器时状况显著改善

3. 有线连接OK

4. 局域网内没有大流量设备,不存在堵塞

2. 解决方式

1. 2.4GHz频段拥堵与干扰

网络连接在 2.4GHz​ 频段,2.4GHz频段虽然覆盖范围广,但只有3个不重叠的信道(1, 6, 11),非常容易拥堵。

蓝牙设备、微波炉、无线鼠标/键盘、婴儿监视器以及邻居的Wi-Fi信号都会对2.4GHz频段造成严重干扰,导致数据包需要频繁重传,从而增加延迟。

可以设备连接到路由器的5GHz Wi-Fi。5GHz频段信道更多,干扰极少,延迟会好很多

2. 路由器本身性能或负载过高

路由器本身处理数据包的速度很慢,博主的wifi很久没关机了,这里重启一次后表现好了很多

重启前

重启后

平均延迟与波动都小了很多

到这里博主的问题就解决了,问题大致也能归结于路由器负载过高。不过博主其他设备并没有出现延迟/波动过大的问题,令人匪夷所思

import subprocess
import time
import re
import sys
from datetime import datetime

def ping_router(router_ip="192.168.3.1", count=1, timeout=2):
    """
    Ping路由器检测延迟
    返回: 延迟信息字符串
    """
    try:
        # 执行ping命令
        if sys.platform == "win32":
            # Windows系统
            result = subprocess.run(
                ['ping', '-n', str(count), '-w', str(timeout*1000), router_ip],
                capture_output=True, text=True, encoding='gbk'
            )
        else:
            # Linux/Mac系统
            result = subprocess.run(
                ['ping', '-c', str(count), '-W', str(timeout), router_ip],
                capture_output=True, text=True
            )
        
        if result.returncode == 0:
            # 解析ping结果提取延迟
            output = result.stdout
            if sys.platform == "win32":
                # Windows ping输出格式: 时间=1ms
                delay_match = re.search(r'时间[=<>](\d+)ms', output)
                if not delay_match:
                    delay_match = re.search(r'时间[=<>](\d+)(?=\s*ms)', output)
                if not delay_match:
                    # 尝试英文系统
                    delay_match = re.search(r'[Tt]ime[=<>](\d+)ms', output)
            else:
                # Linux ping输出格式: time=1.23 ms
                delay_match = re.search(r'time[=<>](\d+\.?\d*)\s*ms', output)
            
            if delay_match:
                delay = delay_match.group(1)
                return f"路由器延迟: {delay}ms"
            else:
                return "路由器延迟: 连接正常(无法解析延迟)"
        else:
            return "路由器延迟: 请求超时或无法连接"
            
    except Exception as e:
        return f"路由器延迟检测错误: {str(e)}"

def get_wifi_band():
    """
    获取当前Wi-Fi连接的频段信息
    返回: 频段信息字符串 或 None(如果未连接Wi-Fi)
    """
    try:
        # 执行命令获取Wi-Fi接口信息
        result = subprocess.run(['netsh', 'wlan', 'show', 'interfaces'], 
                              capture_output=True, text=True, encoding='gbk')
        
        if result.returncode != 0:
            return "错误: 无法获取Wi-Fi信息"
        
        output = result.stdout
        
        # 检查是否已连接Wi-Fi
        if "已连接" not in output and "Connected" not in output:
            return "未连接Wi-Fi"
        
        # 提取信道信息
        channel_match = re.search(r'信道\s*:\s*(\d+)', output)
        if not channel_match:
            # 尝试英文系统
            channel_match = re.search(r'Channel\s*:\s*(\d+)', output)
        
        # 提取SSID
        ssid_match = re.search(r'SSID\s*:\s*(.+)', output)
        if not ssid_match:
            ssid_match = re.search(r'配置文件\s*:\s*(.+)', output)  # 中文系统
        
        ssid = ssid_match.group(1).strip() if ssid_match else "未知网络"
        
        if channel_match:
            channel = int(channel_match.group(1))
            # 根据信道判断频段
            if 1 <= channel <= 13:
                band = "2.4GHz"
            elif 36 <= channel <= 165:
                band = "5GHz"
            elif 242 <= channel <= 248:  # 6GHz频段(Wi-Fi 6E)
                band = "6GHz"
            else:
                band = f"未知频段(信道{channel})"
            
            return f"网络: {ssid} | 频段: {band} | 信道: {channel}"
        else:
            # 如果无法提取信道,尝试直接查找频段信息
            band_match = re.search(r'频段\s*:\s*([25]\.[4-5]GHz|[6]GHz)', output, re.IGNORECASE)
            if not band_match:
                band_match = re.search(r'Band\s*:\s*([25]\.[4-5]GHz|[6]GHz)', output, re.IGNORECASE)
            
            if band_match:
                band = band_match.group(1)
                return f"网络: {ssid} | 频段: {band}"
            else:
                return f"网络: {ssid} | 频段: 无法确定"
                
    except Exception as e:
        return f"错误: {str(e)}"

def get_detailed_wifi_info():
    """
    获取详细的Wi-Fi信息
    """
    try:
        result = subprocess.run(['netsh', 'wlan', 'show', 'interfaces'], 
                              capture_output=True, text=True, encoding='gbk')
        return result.stdout if result.returncode == 0 else "获取详细信息失败"
    except Exception as e:
        return f"错误: {str(e)}"

def main():
    """
    主函数 - 循环查询Wi-Fi频段和路由器延迟
    """
    print("Wi-Fi频段和路由器延迟监控程序")
    print("=" * 60)
    print("路由器IP: 192.168.3.1")
    print("按 Ctrl+C 停止程序")
    print("=" * 60)
    
    # 查询间隔(秒)
    interval = 0.2
    query_count = 0
    
    # 延迟统计
    delay_history = []
    max_history_size = 10  # 保存最近10次延迟记录
    
    try:
        while True:
            query_count += 1
            current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f")[:-3]  # 精确到毫秒
            
            # 获取频段信息
            band_info = get_wifi_band()
            
            # 获取路由器延迟
            ping_result = ping_router("192.168.3.1")
            
            # 提取延迟数值用于统计
            delay_match = re.search(r'(\d+\.?\d*)ms', ping_result)
            if delay_match:
                delay_value = float(delay_match.group(1))
                delay_history.append(delay_value)
                if len(delay_history) > max_history_size:
                    delay_history.pop(0)
                
                # 计算平均延迟
                avg_delay = sum(delay_history) / len(delay_history)
                ping_result += f" | 平均延迟: {avg_delay:.1f}ms"
            
            # 显示结果
            print(f"[{current_time}] 查询#{query_count}")
            print("-" * 40)
            print(band_info)
            print(ping_result)
            print("-" * 40)
            
         
            print("\n详细Wi-Fi信息:")
            print("-" * 40)
            detailed_info = get_detailed_wifi_info()
            print(detailed_info)
            print("=" * 60)
            
            time.sleep(interval)
            
    except KeyboardInterrupt:
        print(f"\n\n程序已停止。共进行了 {query_count} 次查询。")
        
        # 显示延迟统计摘要
        if delay_history:
            min_delay = min(delay_history)
            max_delay = max(delay_history)
            avg_delay = sum(delay_history) / len(delay_history)
            print(f"延迟统计: 最小{min_delay:.1f}ms, 最大{max_delay:.1f}ms, 平均{avg_delay:.1f}ms")
        
        sys.exit(0)

if __name__ == "__main__":
    # 检查是否以管理员权限运行(建议)
    try:
        # 尝试执行一个需要管理员权限的命令来检测
        subprocess.run(['netsh', 'wlan', 'show', 'interfaces'], 
                      capture_output=True, timeout=2)
    except (subprocess.TimeoutExpired, PermissionError):
        print("警告: 建议以管理员权限运行此程序以获得完整信息")
        print("请右键点击命令提示符或PowerShell,选择'以管理员身份运行'")
        print("然后在此窗口中运行此Python程序")
        print("等待5秒后继续...")
        time.sleep(5)
    
    main()