سؤال

أحاول حاليًا كتابة فئة في Android التي ستقوم بمسح نقاط الوصول ، وحساب أي نقطة الوصول التي لديها أفضل إشارة ثم الاتصال بنقطة الوصول هذه.

لذلك سيكون التطبيق قادرًا على مسح أثناء التحرك والإرفاق بنقاط وصول جديدة أثناء التنقل.

لدي المسح وحساب أفضل إشارة العمل.

ولكن عندما يتعلق الأمر بالتوصيل بأفضل نقطة وصول ، أواجه مشكلة.

يبدو أن EnablEnetwork (NetID ، otherstruefalse) هي الطريقة الوحيدة للربط بنقطة وصول ، لكن هذا يسبب مشاكل في نتائج المسح الخاصة بي ، لست قادرًا على الحصول على معرف نقطة الوصول مع أقوى إشارة.

هذا هو الكود الخاص بي:


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 آخر إلى القائمة في تطبيق الإعدادات بنفس الاسم الذي يحتوي على أفضل إشارة ، لذلك انتهى بي الأمر مع الكثير من التكرارات وعدم إرفاقها فعليًا.

هل يمكن لأي شخص أن يوجهني في اتجاه حل أفضل؟

هل كانت مفيدة؟

المحلول

ببساطة التغيير

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

ل

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

نصائح أخرى

أكثر لدرجة سؤالك. أولاً ، تحدد نتيجة المسح الضوئي بأفضل قوة إشارة. بمجرد حصولك على ذلك ، يجب عليك أيضًا الحصول على قائمة تكوينات 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;
}

ونعم ، تأكد من استخدام المعلمة "الحقيقية" عند تمكين الشبكات. سيساعد هذا في ضمان الاتصال بالشبكة التي تنوي.

wifiManager.enableNetwork(mNetID, true);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top