Android中的平滑WiFi切换

时间:2013-07-29 15:53:41

标签: java android wireless

我们正在开发一款适用于Android的小应用程序,以便在同一网络中的两个不同无线接入点(相同的SSID和相同的网络配置,但物理位置不同)之间平滑切换,目标是在执行切换后不丢弃现有连接。我一直在阅读几篇文章,解释如何以编程方式控制wifi,现在我们有一个半工作的解决方案。

我们实施它的方式是,服务扫描符合我们标准的AP和最佳信号,如果它与系统当前连接的不同,它将切换到新的AP。代码的相关部分:

...
// Some initializations and bestOne is the ScanResult with the best signal
conf.BSSID = bestOne.BSSID;
actualNid = mWifiManager.updateNetwork(conf);
mWifiManager.enableNetwork(actualNid, false);
mWifiManager.saveConfiguration();
conf = getWifiConfiguration(mWifiManager, conf);
if(conf == null) {
    return;
}
if(!mWifiManager.enableNetwork(conf.networkId, true)) {
    return;
}
if (mWifiManager.reconnect()) {
    // Great
} else {
    // Error
}

问题是所有执行都经过了预期的代码路径。但是,切换并未真正执行,日志显示为执行重新连接,并返回true。此外,没有从SUPPLICANT_CONNECTION_CHANGE_ACTION或SUPPLICANT_STATE_CHANGED_ACTION收到任何事件,因此似乎甚至没有触发切换。

另一个事实是,如果我们在启用网络之前插入 mWifiManager.disconnect(),则实际执行切换。然而,这不是一个选项,因为正在运行的应用程序失去连接,从而丢弃了会话,这正是我们想要避免的。

任何建议都非常受欢迎。

1 个答案:

答案 0 :(得分:1)

这可能不仅仅是与软件相关的问题。通常,网络适配器(wifi)负责跟踪信号电平并决定何时漫游以及在哪里漫游。这些算法是特定于供应商的,可能没有办法影响它们。通过从客户端发送802.11重新关联帧(请求)来完成漫游,漫游过程在L2级别(在您的场景中)完成。但这个过程可能不那么简单。两个AP都应该知道客户端是否漫游,并且向这些AP发送帧的交换机应该在其CAM表中具有该更新。客户端漫游的AP可能会缓冲发往客户端的所有帧,并在客户端重新关联时将其发送到新的AP,从而导致数据丢失。由于802.11标准不需要这样做,漫游可能会导致数据丢失,并且明显重新连接到信号较强的AP会导致连接中断,因为它不仅仅是漫游而是完全断开并重新连接到网络。

这可能无法帮助您解决问题,但我试图指出,这确实应该在较低级别(物理,数据链接或传输)上完成,而不是在应用程序级别上。漫游的天气几乎是无缝的,取决于所使用的大量硬件(两侧)和网络的配置,并且您无法做多少改变。唯一要记住的是发送802.11探测请求,以便客户端知道其他可能具有更强信号的AP,您已经在代码中进行了这些操作,并决定漫游到网络适配器。