Android WiFi与同一SSID通过AP漫游



我看到Android系统在WiFi漫游时的行为不良。我们拥有一个带有许多AP的WiFi集中式网络,并带有SSID。Adroid手机不会无缝漫游。Android手机试图保持与AP连接,直到信号达到零,即使有其他AP(带有相同的SSID)具有良好的信号!当信号为零时,最终将对另一个AP进行调查(具有良好的信号)。但是通过这种行为,手机失去了所有TCP连接!

例如:

  1. 手机在WiFi中连接到AP1
  2. 手机在建筑物中移动,现在听到AP1和AP2的两个信号。
  3. 当信号表格AP2比AP1的信号更强时,我希望手机做 reassosiation (而不是求解)对AP2。

这个想法是:

  • 执行WifiManager.startScan()
  • 获取结果WifiManager.getScanResults()
  • 在结果中找到最好的AP
  • 执行 reassosiation 到最佳AP

每30秒重复一次。

我谈论 reasosiation ,因为我不希望手机失去TCP连接。

有办法做到这一点?

谢谢,Salvo

您不能如描述的那样执行此操作。客户端无法自己确定TCP连接的状态。您的网络还必须将通信渠道从一个AP移动到另一个AP。这可以使用正确的网络控制器来完成。

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

添加以下权限;

<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"));

使用下层类更改realsociation;

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");
            }
        }
    }
}

相关内容

  • 没有找到相关文章

最新更新