我希望通过Android设备获得BLE信标的Tx功率。
我在这里定义了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() - ScanResult {mDevice = 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)。
答案 0 :(得分: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