Android Wifi使用相同的SSID通过AP漫游

时间:2016-06-21 10:19:13

标签: android wifi access-point roaming

我看到Android系统在Wifi漫游时表现不佳。 我们有一个Wifi集中式网络,有许多带有SSID信号的AP。 Adroid手机不会无缝漫游。 Android手机试图保持连接到AP,直到信号达到零,即使有其他AP(具有相同的SSID)信号良好! 当信号为零时,最终它与另一个AP(具有良好信号)进行协商。但是这种行为会导致手机失去所有TCP连接!

例如:

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

    • 执行WifiManager.startScan()
    • 获取结果WifiManager.getScanResults()
    • 在结果中找到最佳AP
    • 对最佳AP执行重新解析

    每30秒重复一次。

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

    有办法做到这一点吗?

    谢谢你, 齐射

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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");
            }
        }
    }
}
相关问题