我对蓝牙 LE 的“传输功率”有点困惑,尤其是在使用 android.bluetooth.le 包时。
有两种不同的方法来获取有关发射功率的数据:
ScanResult.getTxPower()
ScanRecord.getTxPowerLevel()
developer.android.com 上对它们的解释不是很清楚。
我还查找了其他 BLE 库,感觉“传输功率”和“传输功率级别”有时可以互换使用,例如有些使用称为
getTxPower
的方法来确实接收传输功率级别。
但是,我的理解是,在 Android BLE 中,
ScanRecord.getTxPowerLevel()
返回发送设备上设置的 BLE 传输功率级别。因此,该值本身不依赖于发送和接收设备的距离。 IE。当我扫描时,该值对于同一设备将是恒定的,并且通常设备使用一些“典型”值,例如大约 12 (dBm)
但是
ScanResult.getTxPower()
返回什么?在一些参考文献中,这被定义为 1 m 距离处的 RSSI(有时也称为“校准传输功率”)。这对于给定设备来说也是一个恒定值吗?是厂家设置的吗?或者这是在扫描过程中以某种方式测量的值?
或者这两种方法只是“同义词”并且期望返回相同的值?
我问这个问题是因为我正在使用 Android BLE,但我从未见过在扫描过程中
ScanRecord.getTxPower()
返回除 127 (TX_POWER_NOT_PRESENT
) 之外的值的设备,而至少有一些设备宣传 TxPowerLevel。我想知道 Android 蓝牙 LE 包的哪个属性对应于其他系统的 BLE 库的哪个属性,例如Windows 或 Mac。
区别在于这些对象/数据包的使用方向。
如果您的应用程序执行蓝牙 LE 扫描,您将收到找到的设备的 ScanRecord,其中可能包含 TxPowerLevel 元素(如果发射器也发送了该元素)。
您使用 ScanResult 对象来指定您的设备通告哪些数据,例如TxPower 元素。
这是我对这些值的理解(也是我们的生产应用程序到目前为止没有出现问题的情况):
ScanResult.getTxPower()
这提供了“相对”发送信号强度(以 dBm 为单位)。值 0
表示:默认强度,
4
:更多电量,-18
:更少电量(但电池寿命更长)。该值通常由制造商设置为 0
,但对于大多数设备,用户可以更改该值以使 BLE 设备适应不同的用例。当测距作为 rssi(传入信号强度)的上下文时,也可以使用它,至少可以比较多个设备。ScanRecord.getTxPowerLevel()
rssi
为 -60 的 BLE 广告帧,您可以假设它在 1 米外。实际上,存在相当大的变化:/ 该值由制造商设置,并且
应该针对每个设备单独校准。实际上,对于同一型号的所有设备,它大多设置为相同的值。 另外:我们找不到
txPower
如何影响
txPowerLevel
的标准。有些设备似乎只是将用户设置的 txPower
添加到 txPowerLevel
,因此当您将 txPower
设置为 -4 时,txPowerLevel
会变为 -64 - 而其他设备始终提供相同的 txPowerLevel
,无论发生什么变化txPower
。