3

Android用のWifiDirectデモを見ていて、接続された2つのデバイス間でRSSIまたは信号強度として何かを取得できるかどうかを知りたいと思いました。

質問が意味をなさない場合は申し訳ありませんが、アクセスポイントからRSSIを取得できることは知っていますが、知りたいのは、このRSSIの概念がWifiDirectのデバイス間のp2p接続に存在するかどうかです。

お時間をいただきありがとうございます。

4

1 に答える 1

9

:この回答はAPIレベル14に当てはまりましたが、最新のAndroidバージョンにまだ適用されるかどうかはわかりません。

WifiP2pPeerという名前の文書化されていないファイルがAndroidコードソースに存在します。いくつかの「興味深い」行が含まれています。

RSSI値がハードコーディングされていることがわかります(mRssi = 60; //TODO: fix)。そのため、この機能はまだ実装されていない可能性があります...(WifiP2pに関するAndroid 14の他の人と同様)。

public class WifiP2pPeer extends Preference {

    private static final int[] STATE_SECURED = {R.attr.state_encrypted};
    public WifiP2pDevice device;

    private int mRssi;
    private ImageView mSignal;

    private static final int SIGNAL_LEVELS = 4;

    public WifiP2pPeer(Context context, WifiP2pDevice dev) {
        super(context);
        device = dev;
        setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
        mRssi = 60; //TODO: fix
    }

    @Override
    protected void onBindView(View view) {
        if (TextUtils.isEmpty(device.deviceName)) {
            setTitle(device.deviceAddress);
        } else {
            setTitle(device.deviceName);
        }
        mSignal = (ImageView) view.findViewById(R.id.signal);
        if (mRssi == Integer.MAX_VALUE) {
            mSignal.setImageDrawable(null);
        } else {
            mSignal.setImageResource(R.drawable.wifi_signal);
            mSignal.setImageState(STATE_SECURED,  true);
        }
        refresh();
        super.onBindView(view);
    }

    @Override
    public int compareTo(Preference preference) {
        if (!(preference instanceof WifiP2pPeer)) {
            return 1;
        }
        WifiP2pPeer other = (WifiP2pPeer) preference;

        // devices go in the order of the status
        if (device.status != other.device.status) {
            return device.status < other.device.status ? -1 : 1;
        }

        // Sort by name/address
        if (device.deviceName != null) {
            return device.deviceName.compareToIgnoreCase(other.device.deviceName);
        }

        return device.deviceAddress.compareToIgnoreCase(other.device.deviceAddress);
    }

    int getLevel() {
        if (mRssi == Integer.MAX_VALUE) {
            return -1;
        }
        return WifiManager.calculateSignalLevel(mRssi, SIGNAL_LEVELS);
    }

    private void refresh() {
        if (mSignal == null) {
            return;
        }
        Context context = getContext();
        mSignal.setImageLevel(getLevel());
        String[] statusArray = context.getResources().getStringArray(R.array.wifi_p2p_status);
        setSummary(statusArray[device.status]);
    }
}
于 2012-05-15T15:31:03.823 に答える