2013-04-20 5 views
2

Я пытаюсь создать приложение, которое может создать список доступных точек доступа Wi-Fi. вот часть кода, который я использовал:duplicate SSID в результатах сканирования wifi

x = new BroadcastReceiver() 
     { 
      @Override 
      public void onReceive(Context c, Intent intent) 
      { 
       results = wifi.getScanResults(); 
       size = results.size(); 
       if (results != null) { 
        for (int i=0; i<size; i++){ 
         ScanResult scanresult = wifi.getScanResults().get(i); 
         String ssid = scanresult.SSID; 
         int rssi = scanresult.level; 
         String rssiString = String.valueOf(rssi); 
         textStatus.append(ssid + "," + rssiString); 
         textStatus.append("\n"); 
        } 
        unregisterReceiver(x); //stops the continuous scan 
        textState.setText("Scanning complete!"); 
       } else { 
        unregisterReceiver(x); 
        textState.setText("Nothing is found. Please make sure you are under any wifi coverage"); 
       } 
      } 
     }; 

как textStatus, так и textState - это TextView. Я могу заставить это работать, но иногда результат показывает дубликат SSID, но с разным уровнем сигнала, в одном сканировании. может быть 3-4 одинаковых SSID, но с разным уровнем сигнала.

действительно ли это разные SSID и что их отличает? может кто-нибудь объяснить?

+0

Для прохожих: изменение размера '= results.size(); if (results! = Null) {'to' if (results! = Null) { size = results.size(); ' –

ответ

3

Есть ли у вас несколько модемов для одной и той же сети? Например: компания имеет большую беспроводную сеть с несколькими модемами маршрутизаторов, установленными в нескольких местах, поэтому в каждой комнате есть Wi-Fi. Если вы выполните это сканирование, вы получите много результатов с теми же SSID, но с разными точками доступа и, следовательно, с другим уровнем сигнала.

EDIT: Согласно комментарию Уолта, вы также можете иметь несколько результатов, несмотря на наличие только одной точки доступа, если ваш модем является двухдиапазонным.

+0

что может сделать различие между этими AP? что-то вроде BSSID или канала или что-то еще? и как мне их получить? – randms26

+0

Да, BSSID имеет значение, если я правильно помню. Для получения этой проверки: [ScanResult API] (http://developer.android.com/reference/android/net/wifi/ScanResult.html). Или другими словами: String bssid = scanresult.BSSID, как вы это делали с «ssid» – DuKes0mE

+0

хорошо, я попробую снова как можно скорее и подтвержу результат – randms26

1

использования ниже коды для удаления дубликатов SSIDs с самым высоким уровнем сигнала

public void onReceive(Context c, Intent intent) { 
    ArrayList<ScanResult> mItems = new ArrayList<>(); 
    List<ScanResult> results = wifiManager.getScanResults(); 
    wifiListAdapter = new WifiListAdapter(ConnectToInternetActivity.this, mItems); 
    lv.setAdapter(wifiListAdapter); 
    int size = results.size(); 
    HashMap<String, Integer> signalStrength = new HashMap<String, Integer>(); 
    try { 
     for (int i = 0; i < size; i++) { 
      ScanResult result = results.get(i); 
      if (!result.SSID.isEmpty()) { 
       String key = result.SSID + " " 
         + result.capabilities; 
       if (!signalStrength.containsKey(key)) { 
        signalStrength.put(key, i); 
        mItems.add(result); 
        wifiListAdapter.notifyDataSetChanged(); 
       } else { 
        int position = signalStrength.get(key); 
        ScanResult updateItem = mItems.get(position); 
        if (calculateSignalStength(wifiManager, updateItem.level) > 
          calculateSignalStength(wifiManager, result.level)) { 
         mItems.set(position, updateItem); 
         wifiListAdapter.notifyDataSetChanged(); 
        } 
       } 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы