Android的 - 如何扫描接入点,并选择最强的信号?
-
26-09-2019 - |
题
我目前试图写在Android上的类,将扫描接入点,计算哪些接入点具有最佳信号,然后连接到该接入点。
所以,应用程序将能够扫描在移动和附加到新的接入点在旅途中。
我有最好的信号的工作的扫描和计算。
但是,当涉及到连接到我有麻烦的最佳接入点。
看来,enableNetwork(网络标识符号,othersTrueFalse)是用于连接到接入点的唯一方法,但是从我的扫描结果我没能获得具有最强信号的接入点的ID,这会导致问题。
这是我的代码:
public void doWifiScan(){
scanTask = new TimerTask() {
public void run() {
handler.post(new Runnable() {
public void run() {
sResults = wifiManager.scan(getBaseContext());
if(sResults!=null)
Log.d("TIMER", "sResults count" + sResults.size());
ScanResult scan = wifiManager.calculateBestAP(sResults);
wifiManager.addNewAccessPoint(scan);
}
});
}};
t.schedule(scanTask, 3000, 30000);
}
public ScanResult calculateBestAP(List<ScanResult> sResults){
ScanResult bestSignal = null;
for (ScanResult result : sResults) {
if (bestSignal == null
|| WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0)
bestSignal = result;
}
String message = String.format("%s networks found. %s is the strongest. %s is the bsid",
sResults.size(), bestSignal.SSID, bestSignal.BSSID);
Log.d("sResult", message);
return bestSignal;
}
public void addNewAccessPoint(ScanResult scanResult){
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = '\"' + scanResult.SSID + '\"';
//wc.preSharedKey = "\"password\"";
wc.hiddenSSID = true;
wc.status = WifiConfiguration.Status.ENABLED;
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = mainWifi.addNetwork(wc);
Log.d("WifiPreference", "add Network returned " + res );
boolean b = mainWifi.enableNetwork(res, false);
Log.d("WifiPreference", "enableNetwork returned " + b );
}
当我尝试使用addNewAccessPoint(ScanResult scanResult),它只是增加了一个AP中使用相同的名称作为一个具有最佳信号的设置应用程序的列表,所以我重复的负载结束,而不是实际安装到它们。
任何人都可以点我在一个更好的解决方案的方向是什么?
解决方案
简单地改变
boolean b = mainWifi.enableNetwork(res, false);
到
boolean b = mainWifi.enableNetwork(res, true);
其他提示
更多你的问题的地步。首先您要确定最好的信号强度的扫描结果。一旦你的,你也应该得到的WiFi配置列表已经在设备上,并确保信号最强的扫描结果尚未与设备配置。如果是这样,只需启用它,如果没有,创建一个新的你。这将帮助你避免重复CONFIGS。
private int findExistingNetworkConfig(String ssid) {
if (ssid != null && !ssid.isEmpty()) {
WifiManager wifiManager = (WifiManager) mContextRef.get()
.getSystemService(Context.WIFI_SERVICE);
for (WifiConfiguration wifiConfig : wifiManager
.getConfiguredNetworks()) {
if (ssid.equals(wifiConfig.SSID)) {
return wifiConfig.networkId;
}
}
}
// Didn't find a matching network ssid
return -1;
}
是的,务必使网络时使用的“真实”的参数。这将有助于确保您连接到你想让你的网络。
wifiManager.enableNetwork(mNetID, true);
不隶属于 StackOverflow