Android如何查找任意BLE设备的距离?

3

我需要计算任何蓝牙设备(不仅仅是信标)的距离。我正在使用开发者Android网站提供的BluetoothLeGatt示例应用程序,链接如下http://developer.android.com/downloads/samples/BluetoothLeGatt.zip。我正在使用此方法打印日志:

// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
        new BluetoothAdapter.LeScanCallback() {

    @Override
    public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mLeDeviceListAdapter.addDevice(device);
                mLeDeviceListAdapter.notifyDataSetChanged();

                Log.e("scanrecord", Arrays.toString(scanRecord));
            }
        });
    }
};

这是我的日志

05-05 13:58:35.811 8034-8051/com.example.android.bluetoothlegatt D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=08:7C:BE:49:7D:9E, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=[0000fee8-0000-1000-8000-00805f9b34fb, 0000fff0-0000-1000-8000-00805f9b34fb], mManufacturerSpecificData={}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=Safety15HA006634], mRssi=-80, mTimestampNanos=2601215802991397}
05-05 13:58:35.816 8034-8034/com.example.android.bluetoothlegatt E/scanrecord: [2, 1, 6, 17, 8, 83, 97, 102, 101, 116, 121, 49, 53, 72, 65, 48, 48, 54, 54, 51, 52, 5, 3, -24, -2, -16, -1, 5, 18, 6, 0, -128, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]. 

在搜索后,我找到了这个链接 理解iBeacon距离计算公式 中计算距离的公式。我的问题是如何从 scanRecord 中获取传输功率。还有 mTxPowerLevel 是什么,我该如何获取它,因为它是从Android BLE类中记录的。

1个回答

3
你无法从扫描记录中获取RSSI,因为该记录是由信标计算的,显然它不知道你将接收到的传输强度。幸运的是,rssi参数可以给你RSSI。 这篇回答解释了如何获取发射功率,但请注意,并非所有设备都会提供其发射功率。我链接的答案解释了iBeacon特别使用非标准制造商数据来提供它,而大多数通用BLE外设根本不包括它,因为它除了测距之外没有任何用处。你在日志中显示的那个是一个不提供其发射功率的设备的例子:mTxPowerLevel在这种情况下显示为最负的int
如果你有一个不在广告中包含发射功率的外设,你只能基于RSSI进行计算,并针对该外设进行校准。也就是说,你必须在实验室中测量你在1米处得到的该型号外设的RSSI,并将该信息包含在你的应用程序中,以便它可以与所有你想要使用的外设一起工作。

最后值得注意的是,使用此方法无法获得非常准确的范围。 RSSI在无线电环境中变化很大。以不同的方式握住手机或者身体位于手机和外设之间,都会影响RSSI。站在手机和外设之间通常具有与5-10米距离相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接