Android - zum Scannen von Access Points und wählen Sie das stärkste signal?
Ich bin derzeit beim schreiben einer Klasse in Android, wird nach access points Scannen, zu ermitteln, welche access-point hat den besten Empfang und dann eine Verbindung zu diesem access point.
So kann die Anwendung zum Scannen auf das verschieben und befestigen Sie diese neuen access points unterwegs.
Ich habe den scan und die Berechnung des besten signal zu arbeiten.
Aber wenn es um die Befestigung zu den besten access point, ich habe ein Problem.
Scheint es, dass enableNetwork(netid, othersTrueFalse) ist die einzige Methode für den Anbau an einen Access point, aber das verursacht Probleme, weil es aus meiner Scan-Ergebnisse, ich bin nicht in der Lage, um die id der access point mit dem stärksten signal.
Dies ist mein code:
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 );
}
Wenn ich versuche, mit addNewAccessPoint(ScanResult scanResult), es fügt nur ein anderer AP auf der Liste in der Anwendung " Einstellungen mit den gleichen Namen als die mit dem besten signal, so dass ich am Ende mit Unmengen von Dubletten und nicht wirklich anbringen zu Ihnen.
Kann jemand mich in Richtung eine bessere Lösung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach ändern
zu
Mehr auf den Punkt deiner Frage. Ersten Sie bei der Bestimmung der scan-Ergebnis mit dem besten Empfang. Sobald Sie dass haben, dann sollten Sie auch die Liste der wifi-Konfigurationen bereits auf dem Gerät, und sicherzustellen, dass das scan-Ergebnis mit dem stärksten signal ist bereits konfiguriert mit dem Gerät. Wenn es ist, aktivieren Sie es, wenn nicht, eine neue erstellen, wie Sie sind. Dies wird Ihnen helfen, vermeiden Sie doppelte configs.
Und ja, verwenden Sie den 'wahren' parameter bei der Aktivierung der Netzwerke. Dies wird helfen, sicherzustellen, dass Sie eine Verbindung zum Netzwerk herstellen, das Sie beabsichtigen.