树莓派进阶项目:WiFi 全网干扰可视化 + 实时最优信道推荐系统(详细教程)
左天都
编辑于 2026年04月28日 12:24
收录于文集
共29篇
树莓派开发板

一、项目简介

很多人家里 WiFi 卡顿、延迟高、网速不稳定,并不是宽带问题,而是信道干扰严重

普通手机、电脑只能看到自己连接的 WiFi 信号强度,无法看到周围所有邻居 WiFi 的信道占用、重叠干扰、信号叠加干扰

本项目基于树莓派 Python 实现:

  • ✅ 扫描周边所有 2.4G / 5G WiFi

  • ✅ 显示信号强度、信号质量、加密方式

  • 精准计算 2.4G 相邻信道重叠干扰(核心难点)

  • ✅ 按「信号强度权重」计算真实干扰总分

  • 动态实时推荐最优信道(不是固定推荐)

  • ✅ 彩色终端显示、自动刷新、过滤无效弱信号

  • ✅ 区分拥挤/空闲/严重干扰信道

二、关键科普:WiFi 干扰真正原理(必看)

1. 并不是“有 WiFi 就会干扰”

很多新手误区:只要附近有 WiFi 就会干扰我的网络。

正确原理:干扰由「信道重叠程度 + 对方信号强度」共同决定。

  • 同信道 = 严重干扰

  • 相邻重叠信道 = 轻微干扰

  • 完全不重叠信道 = 几乎无干扰

  • 对方信号越弱,干扰越小;信号越强,干扰权重越高

2. 2.4G 信道重叠严重(最大痛点)

2.4G 频段信道非常拥挤,信道之间大量重叠:

全网唯一互不干扰的三组黄金信道:1 / 6 / 11

其余所有信道都会互相重叠串频,导致延迟高、跳ping、网速波动。

3. 5G 几乎无重叠干扰

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

六、功能详细讲解

1. 真实干扰算法(本项目最大亮点)

市面上99%的WiFi扫描脚本只统计「信道WiFi数量」,非常不精准

本项目算法:

  • 自动识别 2.4G 所有相邻重叠信道

  • 根据对方信号强弱加权计算

  • 强信号邻居权重高、弱信号几乎不影响

  • 得出「真实干扰总分」,分数越低越稳定

2. 智能信道推荐逻辑

  • 优先选择 1/6/11 无重叠黄金信道

  • 黄金信道拥挤时自动切换全局最优信道

  • 5G 自动选择干扰最低信道

3. 彩色可视化

  • 极强信号:红色

  • 很强信号:绿色

  • 一般信号:黄色

  • 较弱信号:蓝色

  • 拥挤信道红标、空闲绿标

4. 数据过滤

自动过滤 -80dBm 以下无效弱信号,避免统计垃圾数据,让推荐更精准。

七、如何根据结果优化家里 WiFi

  1. 查看脚本标记 ★最优 的信道

  2. 登录路由器后台,手动固定该信道

  3. 2.4G 尽量锁定 1/6/11

  4. 5G 随意选择低分信道,延迟极低

  5. 不要开启“自动信道”(路由器自动算法很垃圾)

八、项目总结

这是一套专业级、可用于网络调试、智能家居调试、IoT 项目调试的 WiFi 干扰分析系统。

区别于普通扫描脚本:它真正理解了 WiFi 频率重叠原理、信号权重干扰机制,可以精准解决家庭网络卡顿、跳 ping、网速波动、延时高的问题。