22、WiFi多连接与多频段:同时连接2.4GHz与5GHz(MIMO)、多频段策略、应用层多连接管理

多连接和多频段,说白了就是让手机同时“抱”着两个WiFi不放。一个2.4GHz,一个5GHz。你可能会问,这有啥用?嗯,我刚开始也觉得是噱头。直到有一次在办公室,2.4GHz被蓝牙鼠标和微波炉干扰得惨不忍睹,5GHz又穿不过两堵墙……那时候我就想,要是能同时用两个频段,该多好。

后来Android从10开始,慢慢把这事做成了。今天我们就聊聊,系统层和应用层怎么玩转多连接。

22.1 多频段并行:2.4GHz + 5GHz 同时在线

先澄清一个概念:多频段并行,不等于MIMO。MIMO是多天线收发,属于物理层。而我们说的多频段并行,是让设备同时关联两个AP,一个2.4G,一个5G。这在Android里叫“Dual Band Simultaneous”,简称DBS。

我见过不少开发者以为只要硬件支持就行。其实不然。驱动、框架、甚至WiFi芯片的固件都得配合。举个例子,高通和联发科的方案,实现方式就完全不同。

核心要点:多频段并行的前提是硬件支持并发连接。通常需要两个独立的MAC实体,或者一个MAC但支持时分复用。

Android从哪个版本开始支持?我记得是Android 10引入了“多连接API”,但真正稳定是在Android 12。那时候我正好在做一个视频会议App,需要同时用2.4G传控制信令,5G传视频流。嗯,踩了不少坑。

22.2 多频段策略:系统怎么选?

系统不会傻傻地两个频段都用。它得有个策略。Android的策略大致分三种:

  • 首选5GHz:信号好时优先用5G,2.4G做备份。
  • 负载均衡:根据当前流量和信号质量动态切换。
  • 并发传输:两个频段同时收发数据,提升吞吐量。

你想想看,如果两个频段同时用,功耗肯定翻倍。所以系统默认是“首选5GHz”模式。只有在你主动请求高吞吐时,才会切到并发模式。

我曾经在项目中遇到一个问题:用户反馈手机连上双频后,视频通话反而卡顿。排查后发现,是2.4G链路的丢包率太高,导致TCP重传,拖累了整体性能。后来我们加了一个“链路质量监控”,一旦发现某个频段丢包率超过5%,就自动降级到单频段。

小技巧:在应用层可以通过 WifiManager.getConnectionInfo() 获取当前连接的频段信息。如果发现是2.4G,可以提示用户切换到5G。

22.3 应用层多连接管理:你能做什么?

应用层能做的其实不多,但关键点抓对了,效果很明显。Android提供了 WifiNetworkSpecifierWifiNetworkSuggestion 两个API,用来请求多连接。

举个例子,你想让App同时连接两个网络:

// 创建两个网络建议
WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder()
    .setSsid("MyNetwork_2G")
    .setWpa2Passphrase("password")
    .setPriority(1)
    .build();

WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder()
    .setSsid("MyNetwork_5G")
    .setWpa2Passphrase("password")
    .setPriority(2)
    .build();

// 提交给系统
WifiManager wifiManager = context.getSystemService(WifiManager.class);
wifiManager.addNetworkSuggestions(Arrays.asList(suggestion1, suggestion2));

注意,这里只是“建议”。系统会不会真的同时连接,取决于硬件和策略。我建议你在提交后,监听 WifiManager.NETWORK_STATE_CHANGED_ACTION 广播,确认实际连接状态。

避坑指南:我曾经在Android 11上测试,发现 addNetworkSuggestions 返回成功,但系统根本没连。后来查文档才知道,从Android 12开始,系统才真正支持多连接建议。所以,一定要做版本兼容。

22.4 多连接下的数据路由

两个频段都连上了,数据怎么走?默认情况下,系统会把所有流量都路由到优先级高的那个网络。如果你想指定某个Socket走特定网络,就得用 NetworkCallbackNetwork.bindSocket()

我整理了一个简单的流程图,帮你理解数据路由的逻辑:

应用层(App) 网络策略层(NetworkPolicy) 2.4GHz 链路 5GHz 链路 物理层(WiFi芯片)

从图里你能看到,应用层发起的请求,先经过网络策略层。策略层根据优先级、信号质量、流量类型,决定走哪条链路。如果两条链路都可用,还可以做负载均衡。

实际开发中,我建议你这样做:

  1. 先判断设备是否支持多连接:通过 WifiManager.isMultiConnectSupported()(Android 12+)。
  2. 注册 NetworkCallback,监听每个网络的可用性。
  3. 对于关键数据(比如视频流),用 Network.bindSocket() 绑定到5G链路。
  4. 对于控制信令,可以走2.4G,因为覆盖更广。

重要提醒:多连接不等于双倍速度。实际测试中,并发传输的增益通常在20%-50%之间,取决于环境。别被厂商宣传忽悠了。

22.5 实战:多连接下的Socket绑定

最后,给一个实际可用的代码片段。假设你已经有两个网络(network1是2.4G,network2是5G),想把视频流绑定到5G:

// 获取5G网络的Network对象
Network fiveGNetwork = getNetworkForBand(5); // 自定义方法

// 创建Socket并绑定
Socket videoSocket = new Socket();
fiveGNetwork.bindSocket(videoSocket);

// 连接服务器
videoSocket.connect(new InetSocketAddress("video.server.com", 8080));

// 之后所有通过videoSocket发送的数据,都会走5G链路

注意,bindSocket() 必须在 connect() 之前调用。否则绑定无效。我当初就犯过这个错,排查了半天。

经验之谈:多连接场景下,建议用 Network.getSocketFactory() 创建Socket,而不是手动bind。这样更安全,也更容易管理。

好了,多连接和多频段的内容就这些。核心就三点:硬件支持、系统策略、应用绑定。你只要把这三层理清楚,多连接就不是什么难事。


公众号:蓝海资料掘金营,微信deep3321