2010-05-13 24 views
7

Tôi hiện đang cố gắng viết một lớp trong Android sẽ Quét các điểm truy cập, tính điểm truy cập nào có tín hiệu tốt nhất và sau đó kết nối với điểm truy cập đó.Android - Cách quét Điểm Truy cập và chọn tín hiệu mạnh nhất?

Vì vậy, ứng dụng sẽ có thể quét khi di chuyển và đính kèm vào các điểm truy cập mới khi đang di chuyển.

Tôi có chức năng quét và tính toán tín hiệu tốt nhất đang hoạt động.

Nhưng khi nói đến việc gắn vào điểm truy cập tốt nhất tôi đang gặp sự cố. Có vẻ như enableNetwork (netid, othersTrueFalse) là phương pháp duy nhất để gắn vào một điểm truy cập nhưng điều này gây ra các vấn đề từ kết quả quét của tôi, tôi không thể lấy được id của điểm truy cập có tín hiệu mạnh nhất.

Đây là mã của tôi:


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); 

} 

Khi tôi cố gắng sử dụng addNewAccessPoint (ScanResult scanResult) nó chỉ thêm một AP để danh sách trong ứng dụng cài đặt có cùng tên với ứng dụng có tín hiệu tốt nhất, vì vậy tôi kết thúc với nhiều bản sao và không thực sự đính kèm với chúng.

Có ai có thể chỉ cho tôi theo hướng giải pháp tốt hơn không?

Trả lời

3

Đơn giản chỉ cần thay đổi

boolean b = mainWifi.enableNetwork(res, false); 

để

boolean b = mainWifi.enableNetwork(res, true); 
0

Thêm vào điểm của câu hỏi của bạn. Trước tiên, bạn xác định kết quả quét với cường độ tín hiệu tốt nhất. Một khi bạn đã có, bạn cũng sẽ nhận được danh sách các cấu hình wifi đã có trên thiết bị và đảm bảo rằng kết quả quét với tín hiệu mạnh nhất chưa được cấu hình với thiết bị. Nếu có, chỉ cần kích hoạt nó, nếu không, tạo một cái mới như bạn đang có. Điều này sẽ giúp bạn tránh các cấu hình trùng lặp.

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; 
} 

Và có, hãy đảm bảo sử dụng thông số 'true' khi bật mạng. Điều này sẽ giúp đảm bảo bạn kết nối với mạng bạn dự định.

wifiManager.enableNetwork(mNetID, true);