【问题标题】:duplicate SSID in scanning wifi result扫描 wifi 结果中的重复 SSID
【发布时间】:2013-04-13 18:05:31
【问题描述】:

我正在尝试制作一个可以创建可用 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 真的不同吗?它们有什么不同?谁能解释一下?

【问题讨论】:

  • 路人:将size = results.size(); if (results != null) {改为if (results != null) { size = results.size();

标签: wifi android-wifi ssid


【解决方案1】:

您是否有多个路由器调制解调器用于同一网络?例如:一家公司有一个大型无线网络,在多个地方安装了多个路由器调制解调器,因此每个房间都有 Wifi。如果您进行该扫描,您将获得许多具有相同 SSID 但访问点不同的结果,因此信号级别也不同。

编辑: 根据 Walt 的评论,如果您的调制解调器是双频的,即使只有一个接入点,您也可以获得多个结果。

【讨论】:

  • 这些 AP 之间的区别是什么?像 BSSID 或频道或其他东西?以及如何获得它们?
  • 是的,如果我没记错的话,BSSID 会有所作为。获得这些支票:ScanResult API。或者换句话说: String bssid = scanresult.BSSID 就像你对“ssid”所做的那样
  • 好的,它有不同的bssid,你的回答被接受了,谢谢:)。再有一个困惑,我应该将它们视为 1 个相同的 AP 还是不同? (所有 AP 具有相同的 ssid 但不同的 bssid)
  • 如果您的应用只扫描可用的 wifi 网络,您可以将所有接入点视为同一个网络。您可以执行类似 HashMap 的操作。对于每次扫描,您可以将 SSID 插入到 key 字段中,并将其信号级别插入到此 hashmap 的 value 字段中。如果 SSID 已经在 HashMap 中,则比较信号级别并将其替换为更好的值。因此,使用此哈希图,您可以仅使用一个 SSID 和所有这些多个接入点中的最佳信号级别获得结果
  • 当无线接入点是双频时,情况似乎也是如此。我在我的家用路由器上看到它,并且只有一个接入点。
【解决方案2】:

使用以下代码删除具有最高信号强度的重复 ssid

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

【讨论】:

  • 算法在ScanResult updateItem = mItems.get(position); 似乎有点缺陷,因为除非您执行mItems.add(result, position);,否则无法保证项目位于该位置
【解决方案3】:

这是我的简单解决方案,它对我有用

private void scanWifiListNew() {
    wifiManager.startScan();
    List<ScanResult>  wifiList = wifiManager.getScanResults();
    mWiFiList = new ArrayList<>();

    for(ScanResult result: wifiList){
       checkItemExists(mWiFiList, result);
    }

    setAdapter(mWiFiList);
}


private void printList(List<ScanResult> list){
    for(ScanResult result: list){
        int level = WifiManager.calculateSignalLevel(result.level, 100);
        System.out.println(result.SSID + " Level is " + level + " out of 100");
    }
}

private void checkItemExists(List<ScanResult> newWiFiList, ScanResult resultNew){
    int indexToRemove = -1;

    if(newWiFiList.size() > 0) {
        for (int i = 0; i < newWiFiList.size(); i++) {
            ScanResult resultCurrent = newWiFiList.get(i);

            if (resultCurrent.SSID.equals(resultNew.SSID)) {
                int levelCurrent = WifiManager.calculateSignalLevel(resultCurrent.level, 100);
                int levelNew = WifiManager.calculateSignalLevel(resultNew.level, 100);
                if (levelNew > levelCurrent) {
                    indexToRemove = i;
                    break;
                }else indexToRemove = -2;
            }
        }
        if(indexToRemove > -1){
            newWiFiList.remove(indexToRemove);
            newWiFiList.add(indexToRemove,resultNew);
        }else  if(indexToRemove == -1)newWiFiList.add(resultNew);
    } else newWiFiList.add(resultNew);
}

private void setAdapter(List<ScanResult> list) {
    listAdapter = new WifiListAdapter(getActivity().getApplicationContext(), list);
    wifiListView.setAdapter(listAdapter);

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-03
    • 2018-12-19
    • 2015-09-28
    • 2015-06-10
    • 1970-01-01
    相关资源
    最近更新 更多