BLE Legacy 广播【TX_Power_Level Tx Power RSSI】注意:不要仅通过RSSI来判断远近
2026/6/26 6:03:45 网站建设 项目流程

TX_Power_Level、Tx Power、RSSI 很容易被混在一起,先给结论:

TX_Power / TX_Power_Level 表示“发射端发射这个无线包时使用的发射功率”,单位通常是 dBm。

RSSI 表示“接收端收到这个无线包时测到的信号强度”,单位也是 dBm。

Tx Power 是发送侧概念。
RSSI 是接收侧概念。


首先,TX_Power 和 TX_Power_Level 是不是一回事?

在很多上下文里,可以近似理解为一回事,但严格说有细微差别:

TX_Power_Level 更像“某个字段名”,表示发射功率等级。
TX_Power 更像“通用概念”或某些 HCI event/API 里的字段名。

所以,基本可以认为就是一个指向。


TX Power 是什么意思?

它表示:本机蓝牙芯片发 Legacy 广播包时,大概用了多大的发射功率。


dBm 是什么?

dBm是一个功率单位。可以暂时不用深入射频公式,只要知道:

dBm 越大,发射功率越强;
dBm 越小,发射功率越弱。

所以 Tx Power 可以理解为:

蓝牙模块“喊话”的音量。

RSSI 可以理解为:

手机“听到”的音量。

TX Power 由什么决定?

这个问题要分层看。

第一,由蓝牙芯片 / 射频硬件能力决定

不是所有芯片都能随便设置任意 Tx Power。

比如某些芯片可能支持:

-20 dBm 到 +4 dBm

另一些芯片可能支持:

-40 dBm 到 +8 dBm

还有一些芯片可能支持:

-127 dBm 到 +20 dBm

注意规范写的:

Range: -127 to +20 dBm Accuracy: ±4 dB

这是 HCI 参数表达范围,不代表每个芯片真的都支持从 -127 到 +20。

具体支持哪些档位,要看芯片厂商。


第二,由 Controller 当前配置决定

蓝牙 Controller 里面一般会有发射功率配置。

不同厂商的芯片可能通过不同方式配置:

厂商私有 HCI Command 芯片 SDK API AT 指令 配置工具 固件默认参数

比如你做蓝牙模块时,可能模块 AT 指令里会有类似:

设置广播发射功率 设置 BLE Tx Power 设置 RF Power

这些最终可能会影响 Controller 发送广播时的实际 Tx Power。


第三,由广播类型 / PHY / 信道策略决定

在 Legacy 广播里,主要是在 primary advertising channels 上发:

37 38 39

通常可以理解为使用同一个 advertising physical channel Tx Power。

但在更复杂的 BLE 体系里,不同 PHY、不同角色、不同链路状态可能有不同发射功率控制。

例如:

Advertising Tx Power Connection Tx Power LE 1M PHY Tx Power LE 2M PHY Tx Power LE Coded PHY Tx Power

这些不一定完全一样。


第四,由法规限制决定

2.4GHz 无线发射功率不是芯片想多大就多大。

不同国家/地区对无线发射功率有限制。

所以即使芯片硬件支持更高功率,实际产品固件里也可能限制在某个范围内。


第五,由功耗策略决定

BLE 设备尤其是电池设备,通常不会一直用最高功率。

因为:

Tx Power 越高,耗电越高。 Tx Power 越低,耗电越低。

所以厂商会根据产品定位选择功率。

例如:

Beacon:可能希望广播距离远一些 手环:可能希望功耗低一些 蓝牙模块调试工具:可能默认用较高功率方便发现 近距离配网设备:可能故意降低发射功率

区别于Advertising Data 里的 AD Type 0x0A Tx Power Level

这个是广播数据里主动携带的字段。

格式类似:

02 0A EC

含义是:

Length = 0x02 AD Type = 0x0A Value = 0xEC = -20 dBm

这个值会放进广播数据里。

扫描方可以从:

LE Advertising Report event -> Data[i]

里面解析出来。

Android 里通常对应:

ScanRecord.getTxPowerLevel()

注意:只有广播数据里真的带了 AD Type 0x0A,扫描方才能解析到。没带就拿不到。


TX_Power_Level 和 AD Type 0x0A 的关系

可以这样对应:

项目含义
HCI_LE_Read_Advertising_Channel_Tx_Power返回的TX_Power_LevelController 当前用于 LE 广播物理信道包的发射功率
Advertising Data 里的AD Type = 0x0A Tx Power Level广播包中声明给扫描方看的发射功率值
扫描方 AndroidScanRecord.getTxPowerLevel()Android 从广播数据AD Type 0x0A解析出来的值

所以理想情况下:

HCI 读出的 TX_Power_Level ↓ 填入广播数据 AD Type 0x0A ↓ 扫描方 ScanRecord.getTxPowerLevel() 解析出来

这三个值应该一致。

但是这两个值不一定天然自动同步

这是一个很重要的点。

HCI_LE_Read_Advertising_Channel_Tx_Power读到的是 Controller 当前广播物理信道发射功率。

AD Type 0x0A只是放进广播数据里的一个字节。

它们之间不是自动绑定的。

也就是说,如果你这样乱填:

实际广播发射功率:0 dBm 广播数据里写:02 0A EC

那么扫描方会解析出:

Tx Power Level = -20 dBm

但这只是广播数据里声明的值,不代表真实发射功率真的就是 -20 dBm。

所以比较规范的做法是:

广播数据里 AD Type 0x0A 的值,要和实际广播发射功率保持一致。

而读取LE Read Advertising Physical Channel Tx Power,就是一种保证一致性的方式。

比较规范、比较自洽的做法是:
如果你想在 Advertising Data / Scan Response Data 里放 AD Type 0x0A Tx Power Level,
那么这个值最好应该和 Controller 实际广播发射功率一致。

但是要注意,并不是所有的蓝牙模组都会按照这个规范来。


TX_Power 和 RSSI 的关系

这两个一定要分开。

假设模块发广播时:

Tx Power = 0 dBm

手机收到时:

RSSI = -52 dBm

可以理解为:

模块发出时是 0 dBm; 信号经过空气、距离、遮挡、天线损耗之后; 手机收到时测到 -52 dBm。

所以:

Tx Power:发送端发出去时的强度 RSSI:接收端收到时的强度

类比一下:

Tx Power = 一个人说话时的音量 RSSI = 你站在某个位置听到的音量

同一个人用同样音量说话,你离得近听起来大,离得远听起来小。

同一个 BLE 设备用同样 Tx Power 发广播,手机离得近 RSSI 高,离得远 RSSI 低。


为什么有时候 Tx Power 用来估算距离?

因为理论上:

已知发射功率 Tx Power 再测得接收强度 RSSI 就可以估算中间路径损耗

简单理解:

Path Loss ≈ Tx Power - RSSI

例如

Tx Power = 0 dBm RSSI = -60 dBm Path Loss ≈ 60 dB

损耗越大,通常距离越远。

但是这个估算非常粗糙,因为 RSSI 波动很大。

例如同一个设备不动:

手机方向变了,RSSI 会变 人体挡住了,RSSI 会变 附近有金属,RSSI 会变 换个手机,RSSI 会变 广播信道不同,RSSI 会变

所以 Tx Power + RSSI 可以辅助判断距离趋势,但不能精确测距。


但是如果仅仅通过RSSI来粗略判断远近,那就太“粗燥”了

1. 为什么不能只看 RSSI?

因为 RSSI 是接收端测到的值。

例如手机扫描到两个设备:

设备 A:RSSI = -50 dBm 设备 B:RSSI = -60 dBm

很多人会直接判断:

A 比 B 近

但这不一定对。

因为可能是:

设备 A 发射功率很低,但距离很近 设备 B 发射功率很高,但距离较远

也可能是:

设备 A 天线方向正对手机 设备 B 被人体/墙体/金属遮挡

所以 RSSI 强,不一定就是近;RSSI 弱,也不一定就是远。


2. 更合理的是看 Path Loss

更合理的粗略判断方式是看:

路径损耗 ≈ Tx Power - RSSI

例如:

设备 A: Tx Power = 0 dBm RSSI = -50 dBm Path Loss ≈ 50 dB 设备 B: Tx Power = +8 dBm RSSI = -50 dBm Path Loss ≈ 58 dB

虽然两个设备的 RSSI 都是-50 dBm,但是设备 B 发射功率更高,结果手机收到的还是-50 dBm,说明中间损耗更大。

所以从粗略角度看,设备 B 可能更远,或者中间遮挡/损耗更大。


但 Tx Power + RSSI 也只能“粗略估计”

即使用了 Tx Power 和 RSSI,也不能精确测距。

因为 RSSI 还会受很多因素影响:

手机型号 手机蓝牙天线位置 模块天线设计 人体遮挡 墙体遮挡 金属反射 2.4GHz 干扰 广播信道 37 / 38 / 39 差异 设备摆放方向 手机握持方式 环境多径反射

所以正确态度应该是:

RSSI 不能直接代表距离; Tx Power + RSSI 可以粗略反映路径损耗; 路径损耗可以辅助判断远近趋势; 但不能当成精确距离。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询