很多人家里 WiFi 卡顿、延迟高、网速不稳定,并不是宽带问题,而是信道干扰严重。
普通手机、电脑只能看到自己连接的 WiFi 信号强度,无法看到周围所有邻居 WiFi 的信道占用、重叠干扰、信号叠加干扰。
本项目基于树莓派 Python 实现:
✅ 扫描周边所有 2.4G / 5G WiFi
✅ 显示信号强度、信号质量、加密方式
✅ 精准计算 2.4G 相邻信道重叠干扰(核心难点)
✅ 按「信号强度权重」计算真实干扰总分
✅ 动态实时推荐最优信道(不是固定推荐)
✅ 彩色终端显示、自动刷新、过滤无效弱信号
✅ 区分拥挤/空闲/严重干扰信道
很多新手误区:只要附近有 WiFi 就会干扰我的网络。
正确原理:干扰由「信道重叠程度 + 对方信号强度」共同决定。
同信道 = 严重干扰
相邻重叠信道 = 轻微干扰
完全不重叠信道 = 几乎无干扰
对方信号越弱,干扰越小;信号越强,干扰权重越高
2.4G 频段信道非常拥挤,信道之间大量重叠:
全网唯一互不干扰的三组黄金信道:1 / 6 / 11
其余所有信道都会互相重叠串频,导致延迟高、跳ping、网速波动。
5GHz 信道基本互不重叠,只存在同信道干扰,所以 5G 更稳定、延迟更低。
树莓派终端执行:
bash sudo apt update sudo apt install -y iw wireless-tools
文件名:wifi_analyze.py
python # ============================================== # 树莓派 WiFi 全网干扰分析 + 智能信道推荐系统 # 功能:扫描周边WiFi、计算重叠干扰、动态推荐最优信道 # 作者:开源分享 # ============================================== # 导入系统库 import subprocess # 调用系统扫描命令 import re # 正则解析扫描结果 import time # 自动刷新延时 from collections import defaultdict, Counter # 统计数据 # ============================================== # 【用户可自由修改的配置区】 # ============================================== WLAN_IFACE = "wlan0" # 树莓派WiFi网卡名称(默认wlan0) REFRESH_SEC = 8 # 界面自动刷新秒数 SIGNAL_FILTER = -80 # 过滤-80dBm以下极弱信号(避免干扰统计) # ============================================== # 【2.4G 信道重叠对照表:核心干扰算法】 # 记录每个信道会和哪些信道产生频率重叠 # ============================================== CHANNEL_OVERLAP = { 1: [1,2,3,4,5], 2: [1,2,3,4,5,6], 3: [1,2,3,4,5,6,7], 4: [2,3,4,5,6,7,8], 5: [3,4,5,6,7,8,9], 6: [4,5,6,7,8,9,10], 7: [5,6,7,8,9,10,11], 8: [6,7,8,9,10,11,12], 9: [7,8,9,10,11,12,13], 10: [8,9,10,11,12,13], 11: [9,10,11,12,13], 12: [10,11,12,13], 13: [11,12,13], } # 2.4G 无重叠黄金信道(行业标准) GOLDEN_24G = {1, 6, 11} # ============================================== # 【终端彩色打印配置】 # 提升界面美观度,区分不同信号、不同拥挤度 # ============================================== C_RESET = "\033[0m" C_RED = "\033[91m" C_GREEN = "\033[92m" C_YELLOW = "\033[93m" C_BLUE = "\033[94m" C_CYAN = "\033[96m" C_WHITE = "\033[97m" # ============================================== # 函数:根据信号强度返回等级 + 对应颜色 # 极强、很强、一般、较弱、微弱 # ============================================== def signal_color(dbm): if dbm >= -50: return C_RED, "极强" elif dbm >= -60: return C_GREEN, "很强" elif dbm >= -70: return C_YELLOW, "一般" elif dbm >= -80: return C_BLUE, "较弱" else: return C_RESET, "微弱" # ============================================== # 函数:扫描周边所有 WiFi # 调用系统 iwlist 扫描命令,并解析所有字段 # 过滤无效弱信号 # ============================================== def scan_wifi(): try: # 执行系统WiFi扫描命令 out = subprocess.check_output( ["sudo", "iwlist", WLAN_IFACE, "scan"], text=True, stderr=subprocess.STDOUT ) except Exception: # 扫描失败返回空列表 return [] # 分割每个WiFi单元格 cells = out.split("Cell ") wifi_list = [] # 遍历解析每一个WiFi for cell in cells[1:]: ssid = "Hidden" # 默认隐藏WiFi名称 ch = 0 # 信道 sig = -100 # 信号强度dBm encrypt = "开放" # 加密方式 band = "2.4GHz" # 默认频段 # 解析WiFi名称SSID s_ssid = re.search(r'SSID[:=]"(.*?)"', cell) if s_ssid: ssid = s_ssid.group(1) # 解析信道号 s_ch = re.search(r'Channel\s+(\d+)', cell) if s_ch: ch = int(s_ch.group(1)) # 解析信号强度(适配树莓派所有版本) s_sig = re.search(r'Signal level[:=]\s*(-\d+)', cell) if s_sig: sig = int(s_sig.group(1)) # 解析加密方式 if "WPA2" in cell: encrypt = "WPA2" elif "WPA" in cell: encrypt = "WPA" elif "WEP" in cell: encrypt = "WEP" # 判断 2.4G / 5G 频段 if 1 <= ch <= 14: band = "2.4GHz" else: band = "5GHz" # 过滤掉信号极弱的无效WiFi if sig < SIGNAL_FILTER: continue # 存入列表 wifi_list.append({ "ssid":ssid,"ch":ch,"sig":sig,"encrypt":encrypt,"band":band }) # 按信号强度从强到弱排序 wifi_list.sort(key=lambda x:x["sig"], reverse=True) return wifi_list # ============================================== # 核心算法:计算【真实干扰总分】 # 原理: # 1. 2.4G 叠加所有相邻重叠信道的干扰 # 2. 信号越强,干扰权重越高 # 3. 5G 无邻频干扰,只计算同信道干扰 # 分数越高 = 干扰越严重 # ============================================== def calc_interference(wifi_list): # 按信道分组,存储每个信道的所有信号强度 ch_raw = defaultdict(list) for w in wifi_list: ch_raw[w["ch"]].append(w["sig"]) interfere = dict() all_ch = set(ch_raw.keys()) for ch in all_ch: score = 0 # 2.4G 复杂重叠干扰计算 if 1 <= ch <= 14: overlap_chs = CHANNEL_OVERLAP.get(ch, [ch]) # 叠加所有重叠信道的干扰权重 for oc in overlap_chs: if oc in ch_raw: for s in ch_raw[oc]: # 信号越强,干扰分越高(-10dBm 远大于 -70dBm 干扰) weight = 100 + s score += weight # 5G 仅同信道干扰 else: if ch in ch_raw: for s in ch_raw[ch]: weight = 100 + s score += weight interfere[ch] = round(score, 1) return interfere # ============================================== # 智能推荐算法:动态选出当前最优信道 # 优先级: # 1. 优先从 1/6/11 无重叠黄金信道选择 # 2. 黄金信道拥挤时,自动选全局干扰最低信道 # ============================================== def get_best_channel(wifi_list, interfere): ch_24g = {c:s for c,s in interfere.items() if 1<=c<=14} ch_5g = {c:s for c,s in interfere.items() if c>14} best_24 = None best_5g = None # 优先黄金信道 gold_pool = {c:s for c,s in ch_24g.items() if c in GOLDEN_24G} if gold_pool: best_24 = min(gold_pool, key=gold_pool.get) elif ch_24g: best_24 = min(ch_24g, key=ch_24g.get) if ch_5g: best_5g = min(ch_5g, key=ch_5g.get) return best_24, best_5g # ============================================== # 拥挤度颜色判断 # ============================================== def crowd_color(num): if num >= 4: return C_RED, "🔴严重拥挤" elif num >= 2: return C_YELLOW, "🟡中等拥挤" return C_GREEN, "🟢空闲" # ============================================== # 主程序循环:自动刷新界面 # ============================================== def main(): while True: # 清屏刷新 print("\033c", end="") print(C_CYAN+"="*100) print("📶树莓派WiFi扫描 | 重叠干扰计算 + 实时最优信道推荐") print("="*100+C_RESET) # 获取扫描数据 wifi = scan_wifi() if not wifi: print(C_RED+"未扫描到有效WiFi"+C_RESET) time.sleep(REFRESH_SEC) continue # 计算干扰分、最优信道 interfere = calc_interference(wifi) best24, best5 = get_best_channel(wifi, interfere) # 打印WiFi列表表头 print(f"{'频段':<10}{'信道':<6}{'信号dBm':<12}{'加密':<8}{'信号等级':<10}{'WiFi名称'}") print(C_WHITE+"-"*100+C_RESET) # 打印每一个WiFi详情 for w in wifi: c,lev = signal_color(w["sig"]) print(f"{w['band']:<10}{w['ch']:<6}{c}{w['sig']:<12}{C_RESET}{w['encrypt']:<8}{c}{lev:<10}{C_RESET}{w['ssid']}") # 打印信道干扰分析 print("\n"+C_CYAN+"="*70) print("📊 信道占用 & 重叠干扰总分(分数越低越干净)") print("-"*70+C_RESET) ch_cnt = Counter([w["ch"] for w in wifi]) for ch in sorted(interfere.keys()): cnt = ch_cnt.get(ch, 0) cc, txt = crowd_color(cnt) score = interfere[ch] mark = "" # 标记当前最优信道 if best24 == ch or best5 == ch: mark = C_GREEN+" ★最优"+C_RESET print(f"信道 {ch:>2} | 邻网:{cnt:>2} | 干扰分:{score:>4} | {cc}{txt}{C_RESET}{mark}") # 最终智能推荐结果 print("\n"+C_GREEN+"💡 实时最优信道推荐:") if best24: print(f" 2.4GHz 推荐 → 信道 {best24} (无重叠/干扰最低)") if best5: print(f" 5GHz 推荐 → 信道 {best5}") print(C_RESET+f"\n{C_BLUE}⏳ {REFRESH_SEC}秒刷新 | Ctrl+C 退出{C_RESET}") time.sleep(REFRESH_SEC) # 程序入口 if name == "__main__": try: main() except KeyboardInterrupt: print("\n\n"+C_CYAN+"扫描已退出"+C_RESET)
必须使用 sudo 权限(WiFi 扫描需要系统权限)
bash sudo python3 wifi_analyze.py
市面上99%的WiFi扫描脚本只统计「信道WiFi数量」,非常不精准。
本项目算法:
自动识别 2.4G 所有相邻重叠信道
根据对方信号强弱加权计算
强信号邻居权重高、弱信号几乎不影响
得出「真实干扰总分」,分数越低越稳定
优先选择 1/6/11 无重叠黄金信道
黄金信道拥挤时自动切换全局最优信道
5G 自动选择干扰最低信道
极强信号:红色
很强信号:绿色
一般信号:黄色
较弱信号:蓝色
拥挤信道红标、空闲绿标
自动过滤 -80dBm 以下无效弱信号,避免统计垃圾数据,让推荐更精准。
查看脚本标记 ★最优 的信道
登录路由器后台,手动固定该信道
2.4G 尽量锁定 1/6/11
5G 随意选择低分信道,延迟极低
不要开启“自动信道”(路由器自动算法很垃圾)
这是一套专业级、可用于网络调试、智能家居调试、IoT 项目调试的 WiFi 干扰分析系统。
区别于普通扫描脚本:它真正理解了 WiFi 频率重叠原理、信号权重干扰机制,可以精准解决家庭网络卡顿、跳 ping、网速波动、延时高的问题。