12、WiFi热点创建(软AP 5GHz):Android 11+ 5GHz热点支持、配置信道与频段、兼容性注意事项
各位好,今天我们来聊聊 Android 11 之后的 5GHz 热点创建。
说实话,这个功能我盼了很久。早些年做热点开发,只能在 2.4GHz 上折腾,速度慢、干扰大。到了 Android 11,Google 终于把 5GHz 软 AP 的支持给放开了。嗯,这里要注意,不是所有手机都能用,后面我会详细说。
5GHz 热点的前世今生
在 Android 10 及之前,系统只允许在 2.4GHz 频段创建热点。为什么?说白了就是法规问题。5GHz 频段涉及 DFS(动态频率选择)和雷达避让,各国监管要求不同,Google 干脆一刀切,只开放 2.4GHz。
到了 Android 11,Google 引入了 WifiManager.SoftApConfiguration 类,允许开发者指定频段和信道。我记得当时看到这个 API 时还挺兴奋的——终于可以摆脱 2.4GHz 的拥堵了。
核心 API:SoftApConfiguration
先看代码,这是 Android 11+ 创建 5GHz 热点的标准写法:
// 获取 WifiManager
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 构建热点配置
SoftApConfiguration config = new SoftApConfiguration.Builder()
.setSsid("My5GhzHotspot")
.setPassphrase("password123", SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
.setBand(SoftApConfiguration.BAND_5GHZ) // 关键:指定5GHz频段
.setChannel(149) // 可选:指定信道
.build();
// 启动热点
wifiManager.startSoftAp(config);
这里有几个关键点:
- setBand():指定频段,可选
BAND_2GHZ、BAND_5GHZ或BAND_ANY(让系统自动选择) - setChannel():指定信道号,不传则系统自动选择
- SECURITY_TYPE_WPA2_PSK:Android 11 开始支持 WPA3,但兼容性考虑我建议先用 WPA2
BAND_5GHZ 让系统自动选信道。但生产环境我建议手动指定信道,避免系统选到 DFS 信道导致连接不稳定。
5GHz 信道选择与 DFS 问题
5GHz 频段信道分两类:非 DFS 信道和 DFS 信道。
| 信道类型 | 信道号 | 特点 |
|---|---|---|
| 非 DFS | 36, 40, 44, 48, 149, 153, 157, 161, 165 | 无需雷达检测,启动快,兼容性好 |
| DFS | 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140 | 需要雷达检测,启动慢,可能被雷达信号打断 |
为什么会这样?因为 DFS 信道需要监听雷达信号,如果检测到雷达,系统会强制切换信道甚至关闭热点。这个过程可能持续 1-2 分钟。你想想看,用户开个热点等两分钟,体验能好吗?
兼容性注意事项
这里我列几个实际项目中遇到过的坑:
- 硬件支持:不是所有手机的 WiFi 芯片都支持 5GHz 热点。低端机型可能只有 2.4GHz 的软 AP 能力。建议在代码中先检测:
wifiManager.is5GHzBandSupported() - 地区法规:不同国家/地区对 5GHz 频段的使用有不同限制。比如日本不允许使用 149-165 信道。我建议根据
TelephonyManager.getNetworkCountryIso()做信道适配 - 客户端兼容:有些老旧设备(比如 iPhone 6 之前的机型)不支持 5GHz 热点连接。如果目标用户群体偏老,可能需要保留 2.4GHz 选项
- 功耗问题:5GHz 信号穿透力弱,但功耗比 2.4GHz 高。做 IoT 设备热点时要注意电池续航
知识体系结构图
下面这张图梳理了 5GHz 热点创建的核心流程和注意事项:
实战:检测 5GHz 支持并动态选择信道
下面是我在实际项目中用过的代码片段,做了完整的兼容性处理:
public void start5GHzHotspot(WifiManager wifiManager, String ssid, String password) {
// 第一步:检测硬件是否支持5GHz热点
if (!wifiManager.is5GHzBandSupported()) {
Log.w("Hotspot", "设备不支持5GHz热点,回退到2.4GHz");
start2GHzHotspot(wifiManager, ssid, password);
return;
}
// 第二步:根据地区选择信道
int channel = getChannelForRegion();
// 第三步:构建配置
SoftApConfiguration config = new SoftApConfiguration.Builder()
.setSsid(ssid)
.setPassphrase(password, SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
.setBand(SoftApConfiguration.BAND_5GHZ)
.setChannel(channel)
.build();
// 第四步:启动热点
wifiManager.startSoftAp(config);
}
private int getChannelForRegion() {
String country = TelephonyManager.getNetworkCountryIso();
// 日本:使用36-48信道
if ("jp".equalsIgnoreCase(country)) {
return 36;
}
// 中国:149信道通常可用
if ("cn".equalsIgnoreCase(country)) {
return 149;
}
// 默认使用非DFS信道
return 149;
}
getChannelForRegion() 只是示例,实际项目中建议维护一个完整的信道映射表。不同国家/地区的法规差异很大,比如欧盟允许使用 36-64 和 100-140,但美国允许 36-48 和 149-165。我建议参考 WLAN 信道列表 做适配。
调试与验证
热点创建后,怎么确认它确实工作在 5GHz?我一般用两种方法:
- 代码检测:通过
WifiManager.getSoftApInfo()获取热点信息,查看getFrequency()是否在 5GHz 范围内(5170-5825 MHz) - 工具验证:用 WiFi 分析仪 App(比如 WiFi Analyzer)扫描热点,看信道号是否在 5GHz 频段
// 验证热点频段
SoftApInfo info = wifiManager.getSoftApInfo();
if (info != null) {
int freq = info.getFrequency();
boolean is5GHz = freq >= 5170 && freq <= 5825;
Log.d("Hotspot", "热点频率: " + freq + " MHz, 是否为5GHz: " + is5GHz);
}
嗯,到这里 5GHz 热点创建的核心内容就差不多了。最后说一句:如果你在项目中遇到热点启动慢或者连不上的问题,八成是 DFS 信道在作怪。优先用 149 信道,能省掉很多麻烦。
公众号:蓝海资料掘金营,微信deep3321