我必须计算任何ble设备(不仅仅是信标)的距离。我正在使用devloper 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类中记录的。
您无法从扫描记录中获得RSSI,因为该记录是由信标计算的,信标显然不知道您将以何种强度提前接收传输。幸运的是,rssi
参数提供了RSSI。
这个对相关问题的回答解释了如何获得发射功率,但请注意,并非所有设备都会提供发射功率。我链接的答案解释说,iBeacons特别使用非标准的制造商数据来提供它,而大多数通用BLE外围设备根本不包括它,因为它除了测距之外没有任何用处。你在日志中显示的是一个不提供发射功率的设备的例子:在这种情况下,mTxPowerLevel
显示为最负的int
。
如果你的外设没有在广告中包含其发射功率,你只需要根据RSSI进行计算,并为外设进行校准。也就是说,你必须在实验室中测量你在1时得到的RSSI;m使用该型号的外围设备,并在您的应用程序中包含您希望使用的所有外围设备的信息。
最后,值得注意的是,使用这种方法不会得到非常准确的范围。RSSI随无线电环境变化很大。以不同的方式握持手机,或者将身体夹在手机和外围设备之间,都会影响RSSI。站在手机和外围设备之间通常具有与5–10;m的距离。