Android - Como digitalizar pontos de acesso e selecionar sinal mais forte?
-
26-09-2019 - |
Pergunta
Atualmente, estou tentando escrever uma classe no Android que digitalizará pontos de acesso, calcule qual ponto de acesso tem o melhor sinal e depois conectar -se a esse ponto de acesso.
Portanto, o aplicativo poderá digitalizar em movimento e anexar a novos pontos de acesso em movimento.
Eu tenho a varredura e o cálculo do melhor sinal de funcionamento.
Mas quando se trata de anexar ao melhor ponto de acesso, estou tendo problemas.
Parece que o EnableNetwork (netID, outros reta) é o único método para anexar a um ponto de acesso, mas isso causa problemas, pois nos resultados da minha verificação, não consigo obter o ID do ponto de acesso com o sinal mais forte.
Este é o meu 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 );
}
Quando tento usar o AddNewAccessPoint (scanResult scanResult), ele apenas adiciona outro AP à lista no aplicativo Configurações com o mesmo nome que o melhor sinal, então acabo com muitas duplicatas e não me apego a eles.
Alguém pode me apontar na direção de uma solução melhor?
Solução
Simplesmente mude
boolean b = mainWifi.enableNetwork(res, false);
para
boolean b = mainWifi.enableNetwork(res, true);
Outras dicas
Mais ao ponto da sua pergunta. Primeiro, você está determinando o resultado da varredura com a melhor força de sinal. Depois de ter isso, você também deve obter a lista de configurações Wi -Fi já no dispositivo e garantir que o resultado da verificação com o sinal mais forte ainda não esteja configurado com o dispositivo. Se for, basta ativá -lo, se não, crie um novo como você é. Isso ajudará você a evitar configurações duplicadas.
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;
}
E sim, use o parâmetro 'verdadeiro' ao ativar redes. Isso ajudará a garantir que você se conecte à rede que você pretende.
wifiManager.enableNetwork(mNetID, true);