WifiManager startScan () работает только в первый раз - PullRequest
0 голосов
/ 18 сентября 2018

Мой вопрос довольно прост. Используя 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 () работал ??

1 Ответ

0 голосов
/ 18 сентября 2018

Я нашел способ исправить проблему, но я чувствую, что может быть лучше.В итоге я отменил регистрацию получателя в своем методе receive ().Затем прямо перед вызовом startScan () я снова зарегистрировал получателя.

Если у кого-то есть лучшее решение, пожалуйста, дайте мне знать.Я не совсем уверен, в чем проблема.

...