我看到Android系统在WiFi漫游时的行为不良。我们拥有一个带有许多AP的WiFi集中式网络,并带有SSID。Adroid手机不会无缝漫游。Android手机试图保持与AP连接,直到信号达到零,即使有其他AP(带有相同的SSID)具有良好的信号!当信号为零时,最终将对另一个AP进行调查(具有良好的信号)。但是通过这种行为,手机失去了所有TCP连接!
例如:
- 手机在WiFi中连接到AP1
- 手机在建筑物中移动,现在听到AP1和AP2的两个信号。
- 当信号表格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");
}
}
}
}