3

我看到 Android 系统在 Wifi 漫游时表现不佳。我们有一个 Wifi 集中式网络,其中包含许多具有单一 SSID 的 AP。Adroid 手机不会无缝漫游。即使有其他 AP(具有相同 SSID)信号良好,Android 手机也会尝试与 AP 保持连接,直到信号变为零!当信号为零时,最后它会与另一个 AP(信号良好)进行关联。但是由于这种行为,手机会丢失所有的 TCP 连接!

例如:

  1. 手机通过WiFi连接到AP1
  2. 电话在大楼内移动,现在听到来自 AP1 和 AP2 的两个信号。
  3. 当来自 AP2 的信号强于来自 AP1 的信号时,我希望手机对 AP2 进行重新关联(而不是关联)。

这个想法是:

  • 执行一个WifiManager.startScan()
  • 获取结果WifiManager.getScanResults()
  • 在结果中找到最佳 AP
  • 与最佳 AP重新关联

每 30 秒重复一次。

我谈论重新关联是因为我不希望手机丢失 TCP 连接。

有办法做到这一点吗?

谢谢你,萨尔沃

4

2 回答 2

0

添加以下权限;

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

注册以下意图;

private WifiBroadcastReceiver wifiBroadcastReceiver = new WifiBroadcastReceiver();

然后在常规;

registerReceiver(wifiBroadcastReceiver, new IntentFilter("android.net.wifi.SCAN_RESULTS"));

使用下面的类来改变重新关联;

public class WifiBroadcastReceiver extends BroadcastReceiver {

    private WiFiManager manager = null;//set the value in constructor
    private WifiConfiguration connectedConfiguration = null;//set the value in constructor
    private int connectedNetId;

    private void updateConnectedConfiguration(String ssid) {
        configs = manager.getConfiguredNetworks();
        int nid = 0;
        for (WifiConfiguration cnf : configs) {
            if (cnf.SSID.substring(1, cnf.SSID.length() - 1).equals(ssid)) {
                connectedConfiguration = cnf;
                connectedNetId = nid;
            }
            nid++;
        }
    }


    public void onReceive(Context c, Intent intent) {
        List<ScanResult> results = manager.getScanResults();
        WifiInfo info = manager.getConnectionInfo();
        ScanResult stronger = null;
        for (ScanResult scanResult : results) {
            try {
                if (scanResult.SSID.equals(info.getSSID())) {
                    if (stronger == null) {
                        if (WifiManager.compareSignalLevel(info.getRssi() + 5, scanResult.level) < 0) {
                            stronger = scanResult;
                        }
                    } else if (WifiManager.compareSignalLevel(stronger.level, scanResult.level) < 0) {
                        stronger = scanResult;
                    }
                }
            } catch (Exception e) {
            }
        }
        if (stronger != null && !stronger.BSSID.equals(info.getBSSID())) {
            updateConnectedConfiguration(info.getSSID());
            if (connectedConfiguration != null) {
                connectedConfiguration.BSSID = stronger.BSSID;
                manager.updateNetwork(connectedConfiguration);
                manager.saveConfiguration();
                manager.enableNetwork(connectedNetId, true);
                manager.reassociate();
                info = manager.getConnectionInfo();
                //showNotification("\nConnecting " + stronger.SSID, stronger.BSSID + " " + stronger.level + "dBm");
            }
        }
    }
}
于 2019-07-23T10:07:11.567 回答
0

你不能像你描述的那样做。客户端无法自行确定 TCP 连接的状态。您的网络还必须将通信通道从一个 AP 移动到另一个 AP。这可以通过正确的网络控制器来完成。

此外,您应该查看 IEEE 802.11k - https://en.wikipedia.org/wiki/IEEE_802.11k-2008

于 2017-05-15T17:01:36.310 回答