在Android中获得BLE Beacon的Tx Power

时间:2015-04-22 07:40:44

标签: android bluetooth-lowenergy

我希望通过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)。

1 个答案:

答案 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