【问题标题】:Signal strength in p2p connection with Wifi Direct?与 Wifi Direct 的 p2p 连接中的信号强度?
【发布时间】:2012-05-23 02:48:04
【问题描述】:

我正在查看适用于 Android 的 WifiDirect 演示,并想知道是否有可能获得两个连接设备之间的 RSSI 或信号强度。

对不起,如果这个问题没有意义,我知道可以从接入点获取 RSSI,但我想知道的是,这种 RSSI 概念是否存在于 Wifi Direct 中设备之间的 p2p 连接中。

感谢您的宝贵时间。

【问题讨论】:

    标签: android rssi wifi-direct


    【解决方案1】:

    注意:这个答案适用于 API 级别 14,我不知道它是否仍然适用于最新的 Android 版本。

    Android 代码源中存在一个名为 WifiP2pPeer 的未记录文件。它包含一些“有趣”的行。

    我们可以看到 RSSI 值是硬编码的 (mRssi = 60; //TODO: fix),因此该功能可能尚未实现...(与 Android 14 中有关 WifiP2p 的其他功能一样)。

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

    【讨论】:

    • 谢谢 Fabien,这肯定很有用。我可以在某处在线浏览此文件吗?还是必须下载4.0的repo才能查看?
    • 这应该会有所帮助:http://stackoverflow.com/questions/449763/where-can-i-browse-android-source-code-on-line。但我更喜欢下载它...
    • 太好了,我会从 SDK 管理器下载它,看看。非常有用的发现 Fabien 再次感谢!
    • 仅供参考,最新的预览版(Android 5.L 预览版)尚未修复此问题。见this
    • 在 5.1.1 中仍然是硬编码的。 Link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 1970-01-01
    相关资源
    最近更新 更多