如何获取 Wifi 接入点的连接强度?

Posted

技术标签:

【中文标题】如何获取 Wifi 接入点的连接强度?【英文标题】:How to get the connection strength of Wifi access points? 【发布时间】: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();

但是,我有两个问题:

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

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

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

【问题讨论】:

【参考方案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 给出了信号强度。

【讨论】:

我认为 BSSID 或 SSID 都不能提供信号强度。 SSID 返回接入点名称,而 BSID 返回接入点的地址。 developer.android.com/reference/android/net/wifi/…【参考方案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.

【讨论】:

以上是关于如何获取 Wifi 接入点的连接强度?的主要内容,如果未能解决你的问题,请参考以下文章

Android连接指定Wifi的方法

如何使用 node.js 获取周围无线接入点的列表?

与 Wifi Direct 的 p2p 连接中的信号强度?

android里有获取周围所有wifi ap 的信号强度的方法么?

电脑连接WIFI热点为啥一直显示正在获取IP地址?

android中如何获取WIFI信号的强度?