Actualmente estoy intentando escribir una clase en Android que buscará puntos de acceso, calculará qué punto de acceso tiene la mejor señal y luego me conectaré con ese punto de acceso.Android: cómo escanear los puntos de acceso y seleccionar la señal más potente?
Por lo tanto, la aplicación podrá realizar el escaneo en movimiento y conectarse a nuevos puntos de acceso sobre la marcha.
Tengo el escaneo y el cálculo de la mejor señal de trabajo.
Pero cuando se trata de unirme al mejor punto de acceso, tengo problemas.
Parece que enableNetwork (netid, othersTrueFalse) es el único método para adjuntar a un punto de acceso, pero esto causa problemas a partir de mis resultados de exploración. No puedo obtener la identificación del punto de acceso con la señal más fuerte.
Este es mi código:
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);
}
Cuando intento utilizar addNewAccessPoint (ScanResult scanResult) que sólo añade otro punto de acceso a la lista en la aplicación de configuración con el mismo nombre que la que tiene la mejor señal, así que termino con muchos duplicados y no me apego a ellos.
¿Alguien puede indicarme una mejor solución?