Мой вопрос довольно прост. Используя wifiManager, я сканирую сеть, получаю результаты в широковещательном приемнике SCAN_RESULTS_AVAILABLE_ACTION и подключаюсь к сети, к которой я хочу подключиться, на странице выбора устройства с этой информацией. В настоящее время я подключаюсь к WAP на Raspberry Pi и пингую веб-сервер на нем.
Проблема, которую я имею, сканирует снова. У меня есть кнопка, которую я нажимаю, чтобы обновить устройства в той области, к которой я могу подключиться. Во второй раз я не получаю трансляцию вообще.
Вот мой приемник:
public class WifiScanReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context c, Intent intent) {
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
devicesInRange.clear();
Log.i("WifiRunner", "Scan received!");
List<ScanResult> scanResults = wifiManager.getScanResults();
for(ScanResult s : scanResults){
Log.i("WifiRunner", s.toString());
if(s.BSSID != null && s.BSSID.startsWith("b8:27:eb")){
devicesInRange.add(new Device(s.BSSID, s.SSID, ""));
Log.i("WifiRunner", "Adding RaspberryPi mac: " + s.BSSID + " with hostName: " + s.SSID);
}
}
needsScan = false;
isScanning = false;
}
}
}
И здесь я подключаюсь к wifiConnection с учетом результатов:
/**
* Connect to a specific network
*/
private void connectToWifi(){
if(lastDevice == null){
Log.i("WifiRunner", "LastDevice is null");
connectStatus = ConnectStatus.WAITING_FOR_USER;
sendIntent("status");
return;
}
String networkSSID = lastDevice.getHostName();
String networkPass = lastDevice.getPassWord();
String networkMac = lastDevice.getMacAddress();
Boolean exists = false;
Log.i("WifiRunner", "connectToWifi: hostName: " + networkSSID + ", password: " + networkPass + ", macAddress: " + networkMac);
WifiInfo info = wifiManager.getConnectionInfo();
Log.i("WifiRunner", "connectToWifi: myCurrentHostName: " + info.getSSID() + ", myBSSID: " + info.getBSSID() + ", myMACADDY: " + info.getMacAddress());
if(info.getBSSID().equals(networkMac) && info.getSSID().split("\"")[1].equals(networkSSID)){
Log.i("WifiRunner", "Already connected to device!");
return;
}
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
if(i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) {
Log.i("WifiRunner", "In configured networks!! " + i.SSID);
wifiManager.disconnect();
wifiManager.enableNetwork(i.networkId, true);
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
exists = true;
break;
}
}
if(!exists) {
WifiConfiguration wc = new WifiConfiguration();
wc.SSID = "\"" + networkSSID + "\"";
wc.preSharedKey = "\"" + networkPass + "\"";
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.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
wc.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
wc.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
int res = wifiManager.addNetwork(wc);
wifiManager.disconnect();
Log.i("WifiRunner", "add Network returned " + res);
boolean b = wifiManager.enableNetwork(res, true);
Log.i("WifiRunner", "enableNetwork returned " + b);
try {
Thread.sleep(5000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
В настоящее время у меня есть конечный автомат, который будет вызывать их во время определенного состояния. Так что в этом случае мое состояние ПОИСК, и это будет работать:
if (connectStatus == ConnectStatus.SEARCHING) {
Log.i("WifiRunner", "SEARCHING!");
if(needsScan && !isScanning) {
if(!wifiManager.isWifiEnabled()){
Log.i("WifiRunner", "Enabling wifi for searching");
wifiManager.setWifiEnabled(true);
}
Log.i("WifiRunner", "Starting Scan!");
Log.i("WifiRunner", "Scan result: " + wifiManager.startScan());
isScanning = true;
} else if(!isScanning && !needsScan){
if (firstConnect) {
Log.i("WifiRunner", "CONNECT_TO_LAST");
connectStatus = ConnectStatus.CONNECT_TO_LAST;
sendIntent("status");
} else {
connectStatus = ConnectStatus.WAITING_FOR_USER;
sendIntent("data");
sendIntent("status");
}
}
}
Но он застревает в ПОИСКЕ, ожидая ответа от вызова startScan (). Есть ли что-то, что я должен сделать, чтобы второй startScan () работал ??