gpt4 book ai didi

java - Android 中的平滑 WiFi 切换

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:16:18 32 4
gpt4 key购买 nike

我们正在开发一个适用于 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(),实际上会执行切换。然而,这不是一个选项,因为正在运行的应用程序会失去连接,从而导致 session 中断,而这正是我们想要避免的。

我们非常欢迎任何建议。

最佳答案

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

这可能无法帮助您解决问题,但我试图指出这确实应该在较低级别(物理、数据链路或传输)而不是应用程序级别完成。漫游的天气几乎是无缝的,这在很大程度上取决于(双方)使用的硬件和网络配置,您无法改变这一点。唯一想到的是发送 802.11 探测请求,以便客户端知道其他 AP 可能具有更强的信号,您已经在代码中这样做了,并将漫游的决定留给网络适配器。

关于java - Android 中的平滑 WiFi 切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17928570/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com