8

我目前正在尝试在 Android 中编写一个类,它将扫描接入点,计算哪个接入点具有最佳信号,然后连接到该接入点。

因此,该应用程序将能够在移动中进行扫描并在移动中连接到新的接入点。

我有最佳信号的扫描和计算工作。

但是当谈到连接到最佳接入点时,我遇到了麻烦。

似乎 enableNetwork(netid, othersTrueFalse) 是连接到接入点的唯一方法,但这会导致问题,因为从我的扫描结果中我无法获得信号最强的接入点的 ID。

这是我的代码:


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

}

当我尝试使用 addNewAccessPoint(ScanResult scanResult) 时,它只是将另一个 AP 添加到设置应用程序的列表中,其名称与具有最佳信号的 AP 同名,因此我最终得到了大量重复项,而实际上并没有附加到它们。

谁能指出我更好的解决方案的方向?

4

2 回答 2

3

简单地改变

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

boolean b = mainWifi.enableNetwork(res, true); 
于 2011-01-25T00:08:04.693 回答
0

更符合您的问题。首先,您要确定具有最佳信号强度的扫描结果。完成后,您还应该获取设备上已有的 wifi 配置列表,并确保设备尚未配置具有最强信号的扫描结果。如果是,只需启用它,如果不是,请照原样创建一个新的。这将帮助您避免重复配置。

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

是的,启用网络时请务必使用“true”参数。这将有助于确保您连接到您想要的网络。

wifiManager.enableNetwork(mNetID, true);
于 2014-02-27T19:03:23.630 回答