最近家里打游戏的时候往往因为延迟波动过大,游戏体验极差,甚至有时无法上线服务器。浏览网页的时候加载时长也令人难以忍受。遂决定在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()