【问题标题】:How to get the connection strength of Wifi access points?如何获取 Wifi 接入点的连接强度?
【发布时间】:2010-08-09 06:11:54
【问题描述】:

我正在构建一个应用程序来读取每个可用 Wifi 接入点的信号强度。

我写过这样的代码:

    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);

    // Get WiFi status
    WifiInfo info = wifi.getConnectionInfo();
    textStatus.append("\n\nWiFi Status: " + info.toString());

    // List available networks
    List<WifiConfiguration> configs = wifi.getConfiguredNetworks();

但是,我有两个问题:

  1. 在调试中,configs 只包含一个连接。但是,我可以看到系统的 wifi 设置中有几个可用的 AP。 IE。 configs 是一个不完整的列表。

  2. 不知道如何获取WifiConfiguration的信号强度。

顺便说一句,我使用的是 HTC Hero 和 Android 1.5。

【问题讨论】:

    标签: android wifi


    【解决方案1】:

    根据 Android API 文档WifiManager.getConfiguredNetworks() 没有填写信号强度参数。此数据仅代表记住的接入点设置,而不是可见的。

    要获得实际可见的网络,您必须调用 WifiManager.startScan() 启动 WiFi 无线电扫描,并在一段时间后调用 WifiManager.getScanResults() 以获得扫描结果。

    【讨论】:

    • 您所说的“一段时间”到底是指多长时间?这个 API 方法没有阻塞调用吗?
    • 通常是 2-10 秒(但实际上并没有暗示任何限制)。但请记住,如果扫描时间过短,您可能会错过一些可见的接入点。 Wi-Fi 接入点由定期发出的特殊广播数据包(所谓的“信标”)检测。扫描接入点实际上意味着监听信标并收集它们。 wi-fiplanet.com/tutorials/article.php/1492071
    • 整个过程没有同步功能。虽然您可能只是调用 getScanResults() 来获取系统执行的先前扫描的结果。也许结果对于您的目的来说已经足够新鲜了。但是,如果您有一个活动的 WiFi 连接,我不会指望它会很好 - 我认为当连接良好时,Android 系统组件不会运行扫描。没有理由这样做。
    • 感谢您的回复,我实际上正在编写一个简单的应用程序来记录站点周围的wifi感知。因此,用户只有一个按钮,当他/她按下按钮时,wifi 接入点的感知被记录到数据库中。有了这样的机制,用户在每次按下按钮时都应该静止几秒钟。
    • 调用同步函数无论如何都不是一个好的解决方案。如果您在 UI 线程中阻塞时间过长,Android 将为您的应用程序显示 ANR(应用程序无响应)警告。考虑在扫描过程中禁用按钮,这更适合基于事件的 UI 模型。
    【解决方案2】:

    下面的代码将有助于获得 wifi 条:

    registerReceiver(new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
                int state = wifi.getWifiState();
                if(state == WifiManager.WIFI_STATE_ENABLED) {
                    List<ScanResult> results = wifi.getScanResults();
    
                    for (ScanResult result : results) {
                        if(result.BSSID.equals(wifi.getConnectionInfo().getBSSID())) {
                            int level = WifiManager.calculateSignalLevel(wifi.getConnectionInfo().getRssi(),
                                    result.level);
                            int difference = level * 100 / result.level;
                            int signalStrangth= 0;
                            if(difference >= 100)
                                signalStrangth = 4;
                            else if(difference >= 75)
                                signalStrangth = 3;
                            else if(difference >= 50)
                                signalStrangth = 2;
                            else if(difference >= 25)
                                signalStrangth = 1;
                            tv.setText(tv.getText() + "\nDifference :" + difference + " signal state:" + signalStrangth);
    
                        }
    
                    }
                }
            }
        }, new IntentFilter(WifiManager.RSSI_CHANGED_ACTION));
    

    【讨论】:

      【解决方案3】:
      mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
      receiverWifi = new WifiReceiver();
          registerReceiver(receiverWifi, new IntentFilter(
                  WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
      class WifiReceiver extends BroadcastReceiver {
          public void onReceive(Context c, Intent intent) {
      
              List<ScanResult> wifiList = mainWifi.getScanResults();
              ArrayList<WifiConnectionBean> m4MessagesList = new ArrayList<WifiConnectionBean>();
              for (int i = 0; i < wifiList.size(); i++) {
                  ScanResult scanResult = wifiList.get(i);
                  WifiConnectionBean bean = new WifiConnectionBean();
                  bean.setConnectionName(scanResult.SSID); // + "--" +
                                                              // scanResult.frequency);
                  bean.setDescription(scanResult.capabilities);
                  bean.setId(scanResult.SSID);
                  bean.setLevel(String.valueOf(scanResult.level));
                  bean.setSignalStrength(String.valueOf(scanResult.BSSID));
                  m4MessagesList.add(bean);
              }
              if (m4MessagesList == null) {
                  Toast.makeText(WifiIdentificationActivity.this,
                          "WifiConnection not available", Toast.LENGTH_SHORT)
                          .show();
              } else {
                  String message = "Scanning complete. " + m4MessagesList.size()
                          + " connections found!";
              }
              pd.dismiss();
      
          }
      }
      

      其中 scanResult.SSID 给出了信号强度。

      【讨论】:

      【解决方案4】:
      private void checkNetworkStrengh() {
              ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
              NetworkInfo Info = cm.getActiveNetworkInfo();
              if (Info == null || !Info.isConnectedOrConnecting()) {
                  Log.i(TAG, "No connection");
              } else {
                  int netType = Info.getType();
                  int netSubtype = Info.getSubtype();
      
                  if (netType == ConnectivityManager.TYPE_WIFI) {
                      Log.i(TAG, "Wifi connection");
                      WifiManager wifiManager = (WifiManager) getApplication().getSystemService(Context.WIFI_SERVICE);
                      List<ScanResult> scanResult = wifiManager.getScanResults();
                      for (int i = 0; i < scanResult.size(); i++) {
                          Log.d("scanResult", "Speed of wifi"+scanResult.get(i).level);//The db level of signal 
                      }
      
      
                      // Need to get wifi strength
                  } else if (netType == ConnectivityManager.TYPE_MOBILE) {
                      Log.i(TAG, "GPRS/3G connection");
                      // Need to get differentiate between 3G/GPRS
                  }
              }
          }
      

      【讨论】:

        【解决方案5】:
            WifiManager wifiManager = (WifiManager)
            MonitorActivity.this.getSystemService(Context.WIFI_SERVICE);
        
            wifiManager.addNetwork(conf);
        
            int numberOfLevels = 5;
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();
            int level = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), numberOfLevels);
        
            Log.e("level", "" + level);
            // you will get the levels. Using these levels you can calculate strenghts.
        

        【讨论】:

          猜你喜欢
          • 2013-09-20
          • 1970-01-01
          • 2014-03-01
          • 2012-07-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-09
          • 1970-01-01
          相关资源
          最近更新 更多