web-dev-qa-db-ja.com

Wifiアクセスポイントの接続強度を取得するにはどうすればよいですか?

利用可能な各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();

ただし、2つの問題があります。

  1. デバッグでは、configsには1つの接続しか含まれていません。ただし、システムのWi-Fi設定で使用可能なAPがいくつかあることがわかります。つまりconfigsは不完全なリストです。

  2. WifiConfigurationで信号強度を取得する方法がわかりません。

ところで、私はHTCHeroとAndroid 1.5を使用しています。

13
Yin Zhu

Android APIドキュメント WifiManager.getConfiguredNetworks() によると、信号強度パラメーターは入力されません。このデータは、記憶されているアクセスポイントの設定のみを表し、表示されているものは表しません。

実際に表示されるネットワークを取得するには、 WifiManager.startScan() を呼び出してWiFi無線スキャンを開始し、しばらくして WifiManager.getScanResults() を呼び出してスキャン結果を取得する必要があります。

17

以下のコードは、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));
7
AJit
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は信号強度を示します。

3
Asad Rao
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
            }
        }
    }
1
Issac Balaji
    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.
1
arshad shaikh