在 Android 中获取 BLE Beacon 的 Tx Power
Posted
技术标签:
【中文标题】在 Android 中获取 BLE Beacon 的 Tx Power【英文标题】:Get Tx Power of BLE Beacon in Android 【发布时间】:2015-06-29 17:09:18 【问题描述】:我想通过 android 设备获得 BLE 信标的 Tx 功率。
我在这里定义了发射功率的分配编号。
public class AssignedNumbers
...
public static final byte TXPOWER = 0x0A;
...
然后我在这里做了一个函数来获取 Tx 功率。
public class AdvertisingData
...
public static Integer getTxPowerLevel(byte[] scanRecord)
// Check for BLE 4.0 TX power
int pos = findCodeInBuffer(scanRecord, AssignedNumbers.TXPOWER);
if (pos > 0)
return Integer.valueOf(scanRecord[pos]);
return null;
...
private static int findCodeInBuffer(byte[] buffer, byte code)
final int length = buffer.length;
int i = 0;
while (i < length - 2)
int len = buffer[i];
if (len < 0)
return -1;
if (i + len >= length)
return -1;
byte tcode = buffer[i + 1];
if (tcode == code)
return i + 2;
i += len + 1;
return -1;
...
最后,我放了一行代码来检查 Tx 功率。
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback()
...
System.out.println("TxPower: " + AdvertisingData.getTxPowerLevel(scanRecord));
...
;
但是,结果如下所示。
04-22 16:34:14.249: I/System.out(29133): TxPower: null
onScanResult()的日志是
04-22 16:34:14.247: D/BluetoothLeScanner(29133): onScanResult() - ScanResultmDevice=90:59:AF:0F:31:01, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=null, mManufacturerSpecificData=76=[2, 21, -43、117、98、71、87、-94、67、68、-111、93、-107、-103、73、121、64、-89、0、 0, 0, 0, -60], mServiceData=0000180a-0000-1000-8000-00805f9b34fb=[1, 49, 15, -81, 89, -112, -60, 0, 0, 0, 0], mTxPowerLevel=-2147483648, mDeviceName=pebBLE], mRssi=-79, mTimestampNanos=8204624857836
如何获得正确的 Tx 功率值?这些值应为 4、0 或 -23(dBm)。
【问题讨论】:
【参考方案1】:您在上面说信标-我认为您确实是在尝试获得 iBeacon 校准的传输功率,这与 GAP 0x0A 不同。 iBeacon TxPower 只是广告中制造数据的一部分。这里有广告包的完整细分 - What is the iBeacon Bluetooth Profile
您可以看到 scanRecord 中有两个可变大小的部分,并且 TxPower 是最后一个字节(前面没有 0A,就像 fitbit 在本示例中所做的那样 http://j2abro.blogspot.com/2014/06/analyzing-bluetooth-advertising-with.html)。
查看您的 onScanResult,我相信校准后的 TxPower 是 -60,这是 1 米处的 rssi 测量值。在这篇文章中有一个逆向工程 TxPower 以米为单位的示例 - Understanding ibeacon distancing
【讨论】:
以上是关于在 Android 中获取 BLE Beacon 的 Tx Power的主要内容,如果未能解决你的问题,请参考以下文章
Android BLE设备蓝牙通信框架BluetoothKit