Android BLE:ScanResult.getTxPower()与ScanRecord.getTxPowerLevel()的区别
Android BLE中ScanResult.getTxPower()与ScanRecord.getTxPowerLevel()的区别
核心区别与含义
ScanRecord.getTxPowerLevel()
这个是从BLE广播包的**Tx Power AD字段(类型0x0A)**中读取的校准值,是厂商预设的固定值,表示设备在1米距离处的发射功率(单位dBm),比如常见的-20、0、12dBm等。这个值和收发距离无关,只要设备广播包含该字段,每次扫描到的数值都一致。如果设备没广播这个字段,会返回Integer.MIN_VALUE。ScanResult.getTxPower()
这个方法的设计目标是读取当前接收到的BLE包的发射功率指示,但实际上它的返回值依赖于设备是否在扫描响应包中携带了Tx Power字段。大部分BLE设备只会在广播主包中携带Tx Power,不会在扫描响应里重复发送,所以你测试时经常拿到127(TX_POWER_NOT_PRESENT)是正常情况。如果设备确实在扫描响应里包含了该字段,它返回的也是和ScanRecord同样的厂商校准值,不是实时测量的RSSI。补充:这两个方法并非同义词,只是读取的是广播包不同部分的同一类型字段——但绝大多数场景下,只有ScanRecord能拿到有效数值。
与其他系统BLE库的对应关系
- Windows:对应
BluetoothLEAdvertisementReceivedEventArgs.TxPower属性,读取的是广播包中的Tx Power校准值。 - macOS/iOS:对应
CBAdvertisementDataTxPowerLevelKey键值,同样是厂商预设的1米处发射功率。
测试注意点
你遇到的ScanResult.getTxPower()始终返回127的情况,是因为绝大多数BLE外设不会在扫描响应中额外携带Tx Power字段,只在主广播包中包含。所以如果要获取发射功率校准值,优先用ScanRecord.getTxPowerLevel()即可。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

