在 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

BLE Beacon专用芯片解决方案—巨微MG127

BLE Beacon专用芯片解决方案—巨微MG127

在 iOS 中读取 Beacon 制造数据的最佳方式

Android Beacon库-继续记录周期扫描作业ID和即时扫描作业ID

如何在 Android 中获取当前连接的 BLE 外围设备