2016-12-21 2 views
0

Я пишу приложение для Android. В моем приложении я хочу, чтобы он сканировал сеть WiFi, а затем подключился к выделенной точке доступа (AP), проверив SSID. Затем, после подключения к AP, установите TCP-соединение с ним.Android: как сканировать WiFi, подключиться к точке доступа, а затем установить TCP-соединение?

Выше я описал 3 задачи по порядку. Я знаю, как выполнять каждую задачу самостоятельно, но я не знаю, как правильно их закончить. Примеры приветствуются.

В настоящее время мой код, чтобы начать сканирование сети Wi-Fi, когда пользователь нажал кнопку на:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
if (wifiManager.isWifiEnabled() == false) { 
    wifiManager.setWifiEnabled(true); 
    Toast.makeText(MainActivity.this, "WiFi is enabled", Toast.LENGTH_SHORT).show(); 
} 
wifiManager.startScan(); 

Я использовал широковещательный приемник, чтобы проверить, когда сканирование закончится, а затем вызвать метод (ReconnectAP()) к подключите WiFi к AP. Я также использовал широковещательный приемник, чтобы проверить, когда он подключен к AP, а затем я хочу выполнить задачу Async для создания сети TCP. Тем не менее, по поиску googling, я узнаю, что плохая практика заключается в выполнении async-задачи в широковещательном приемнике, потому что асинхронная задача может быть убита Android, когда получатель закончил.

private String networkSSID = "The_AP_SSID"; 

// In onCreate of MainActivity, register the broadcast receiver: 
registerReceiver(WiFireceiver, new IntentFilter(
      WifiManager.NETWORK_STATE_CHANGED_ACTION)); 
registerReceiver(WiFireceiver, new IntentFilter(
      WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 

// Implement my broadcast receiver class: 
BroadcastReceiver WiFireceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) { 

      Log.d(TAG, "WiFiReceiver received broadcast, action is SCAN_RESULTS_AVAILABLE_ACTION"); 
      Log.d(TAG, "Start to check if need to reconnect to Charger AP"); 
      ReconnectAP(); 

     } 

     if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { 

      Log.d(TAG, "WiFiReceiver received broadcast, action is NETWORK_STATE_CHANGED_ACTION"); 

      NetworkInfo netInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO); 
      // If the connection type is WiFi... 
      if (netInfo != null && ConnectivityManager.TYPE_WIFI == netInfo.getType()) { 

       // If it is connected now.... 
       if (netInfo.isConnected()) { 

        Log.d(TAG, "WiFi connected"); 

        // Get WiFi connection information, eg SSID 
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
        WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
        String ssid = wifiInfo.getSSID(); 

        Log.d(TAG, "WiFi connected SSID is : " + ssid); 

        if(ssid.equals(networkSSID)) { 
         // Start async task to establish a TCP connection: 
         new ConnectTCPAsynTask().execute(); 

        } 
       } else { 
        Log.d(TAG, "WiFi disconnected"); 
       } 
      } 
     } 
    } 
}; 

int ReconnectAP() { 

    Log.d(TAG, "In ReconnectAP()"); 

    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    WifiInfo wifiInfo = wifiManager.getConnectionInfo(); 
    String ssid = wifiInfo.getSSID(); 

    Log.d(TAG, "Original connected AP SSID: " + ssid); 

    if (!ssid.equals(networkSSID)) { 

     Log.d(TAG, "It is not equal to the dedicated AP SSID, 
        we will disconnect the current WiFi connection, 
        and then connect to our dedicate AP"); 

     List<WifiConfiguration> list = wifiManager.getConfiguredNetworks(); 
     for (WifiConfiguration i : list) { 
      if (i.SSID != null && i.SSID.equals("\"" + networkSSID + "\"")) { 

       Log.d(TAG, "Start disconnect and reconnect to " + networkSSID); 
       wifiManager.disconnect(); 
       wifiManager.enableNetwork(i.networkId, true); 
       wifiManager.reconnect(); 

       return 1; 
      } 
     } 
     Log.d(TAG,"Reach here if cannot find the target SSID"); 
     return -1; 
    } 
    Log.d(TAG, "Reach here if we already connected to the dedicated AP"); 
    return 0; 

} 

ответ

0

Передайте флаг от приемника вещания обратно к основному действию и позвольте основному действию справиться с задачей.

 Смежные вопросы

  • Нет связанных вопросов^_^