Wi-Fi 与蓝牙共存干扰优化
干扰机理
Wi-Fi 2.4GHz 和蓝牙工作在相同的 ISM 频段(2.4-2.4835GHz),存在天然的频谱竞争。
频谱重叠分析
Wi-Fi 2.4GHz 信道(20MHz 带宽):
信道 1:2412MHz(2402-2422MHz)
信道 6:2437MHz(2427-2447MHz)
信道 11:2462MHz(2452-2472MHz)
蓝牙频道(1MHz 间隔,79个频道):
2402MHz ~ 2480MHz
重叠情况:
Wi-Fi 信道 1 与 BT 频道 0-22 重叠
Wi-Fi 信道 6 与 BT 频道 25-47 重叠
Wi-Fi 信道 11 与 BT 频道 57-79 重叠
→ Wi-Fi 和 BT 同时工作时必然产生干扰干扰影响
Wi-Fi 对 BT 的影响:
BT 数据包丢失率增加
BT 音频出现卡顿、杂音
BLE 连接不稳定
BT 对 Wi-Fi 的影响:
Wi-Fi 吞吐量下降(最多 50%)
Wi-Fi 时延增加
Wi-Fi 连接不稳定硬件共存方案
天线隔离
天线设计要求:
Wi-Fi 天线与 BT 天线物理隔离
隔离度要求:≥ 20dB
实现方法:
1. 天线间距:≥ λ/4(2.4GHz 约 31mm)
2. 天线方向:正交放置(水平 vs 垂直)
3. 金属隔板:在两天线之间加金属屏蔽
4. 共用天线:通过开关切换(牺牲同时工作能力)硬件共存信号(COEX)
MT7921 硬件共存机制:
内部 COEX 仲裁器协调 Wi-Fi 和 BT 的信道使用
信号类型:
BT_PRIORITY:BT 请求高优先级
WLAN_ACTIVE:Wi-Fi 正在发送
BT_ACTIVE:BT 正在发送
仲裁规则:
1. BT 语音(SCO/eSCO):最高优先级(不能中断)
2. BT A2DP:高优先级
3. Wi-Fi 数据:中优先级
4. BLE 广播:低优先级软件优化策略
Wi-Fi 信道选择
python
def select_wifi_channel_avoid_bt():
"""
选择与蓝牙干扰最小的 Wi-Fi 信道
策略:
- 如果 BT 活跃,优先使用 5GHz(无干扰)
- 如果必须用 2.4GHz,选择信道 1 或 11
(信道 6 与 BT 跳频重叠最多)
"""
import subprocess
# 检查 BT 是否活跃
bt_active = check_bt_active()
if bt_active:
# 切换到 5GHz
subprocess.run(["iw", "dev", "wlan0", "set", "freq", "5180"])
print("BT 活跃,切换到 5GHz 信道 36")
else:
# 使用 2.4GHz 信道 1
subprocess.run(["iw", "dev", "wlan0", "set", "freq", "2412"])
print("使用 2.4GHz 信道 1")
def check_bt_active():
"""检查蓝牙是否有活跃连接"""
result = subprocess.run(
["hcitool", "con"],
capture_output=True, text=True
)
return "ACL" in result.stdout or "SCO" in result.stdoutBT 自适应跳频(AFH)
AFH(Adaptive Frequency Hopping):
BT 检测到某些频道被 Wi-Fi 占用
自动避开这些频道进行跳频
效果:
- 减少 BT 与 Wi-Fi 的碰撞
- BT 音频质量改善
配置(Linux):
hciconfig hci0 afh # 查看 AFH 状态
注意:AFH 需要 BT 主设备支持,
大多数现代 BT 芯片默认启用实测性能数据
共存场景测试结果
| 场景 | Wi-Fi 吞吐量 | BT 音频质量 |
|---|---|---|
| 仅 Wi-Fi | 300 Mbps | N/A |
| 仅 BT A2DP | N/A | 优秀 |
| Wi-Fi + BT A2DP(无共存) | 150 Mbps(-50%) | 偶有卡顿 |
| Wi-Fi + BT A2DP(硬件共存) | 220 Mbps(-27%) | 良好 |
| Wi-Fi 5GHz + BT 2.4GHz | 300 Mbps(无损) | 优秀 |
结论:使用 5GHz Wi-Fi 是解决共存干扰的最佳方案。