我看到Android系统在Wifi漫游时表现不佳。 我们有一个Wifi集中式网络,有许多带有SSID信号的AP。 Adroid手机不会无缝漫游。 Android手机试图保持连接到AP,直到信号达到零,即使有其他AP(具有相同的SSID)信号良好! 当信号为零时,最终它与另一个AP(具有良好信号)进行协商。但是这种行为会导致手机失去所有TCP连接!
例如:
这个想法是:
WifiManager.startScan()
WifiManager.getScanResults()
每30秒重复一次。
我谈论重新关联,因为我不希望手机丢失TCP连接。
有办法做到这一点吗?
谢谢你, 齐射
答案 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");
}
}
}
}