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_2GHZBAND_5GHZBAND_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 需要雷达检测,启动慢,可能被雷达信号打断
我曾经踩过的坑: 有一次在办公室测试,我选了信道 52(DFS 信道),结果热点启动后一直处于 "正在开启" 状态,等了快两分钟才连上。后来才发现是 DFS 信道在检测雷达信号。从那以后,我生产环境一律用非 DFS 信道。

为什么会这样?因为 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 热点创建核心流程 startSoftAp() SoftApConfiguration.Builder setSsid() | setPassphrase() | setBand() | setChannel() 频段选择(关键决策点) BAND_5GHZ → 需检测硬件支持 | BAND_2GHZ → 兼容性最好 | BAND_ANY → 系统自动选择 信道选择(避坑重点) 非DFS信道(36-48, 149-165)→ 启动快 | DFS信道(52-140)→ 需雷达检测 兼容性检查:硬件支持 | 地区法规 | 客户端兼容 | 功耗

实战:检测 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?我一般用两种方法:

  1. 代码检测:通过 WifiManager.getSoftApInfo() 获取热点信息,查看 getFrequency() 是否在 5GHz 范围内(5170-5825 MHz)
  2. 工具验证:用 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