BLE Legacy 广播【TX Power功率】

📅 2026/6/26 4:06:45 ✍️ 编辑团队 👁️ 阅读次数
BLE Legacy 广播【TX Power功率】
在学习 BLE Legacy 广播时很多人会关注广播内容、广播间隔、广播类型、扫描响应数据等字段但容易忽略一个很重要的概念TX Power。TX Power 可以理解为蓝牙设备在发送无线包时使用的“发射功率”。它和 RSSI 经常一起出现但二者不是一回事。简单来说TX Power 是发送端的概念表示设备发出无线包时用了多大的发射功率。RSSI 是接收端的概念表示扫描设备收到无线包时测到的信号强度。所以研究 BLE 广播时不能把 TX Power、TX_Power_Level、RSSI 混在一起理解。本文主要通过 HCI Command 中的LE Read Advertising Physical Channel Tx Power command来理解 BLE Legacy 广播中的 TX Power 概念。一、这个 Command 是什么该 Command 的完整名称是HCI_LE_Read_Advertising_Channel_Tx_Power对应章节是7.8.6 LE Read Advertising Physical Channel Tx Power command它的作用是Host 读取 Controller 当前用于 LE advertising physical channel packets 的发射功率等级。也就是说Host 可以通过这个命令询问 Controller你当前用于 LE 广播物理信道包的发射功率是多少这个命令属于 BLE Legacy 广播体系中的一个辅助命令。它不是用来开启广播的也不是用来配置广播数据的而是用来读取当前广播物理信道使用的 TX Power。二、Command 基本信息该命令的表格信息如下Command: HCI_LE_Read_Advertising_Channel_Tx_Power OCF: 0x0007 Command Parameters: none Return Parameters: Status TX_Power_Level它没有 Command Parameters。也就是说Host 发送这个命令时不需要额外携带参数。Controller 执行完成后会通过HCI_Command_Complete event返回执行结果。返回参数包括Status TX_Power_Level三、Description 解读规范中的描述是This command is used by the Host to read the transmit power level used for LE advertising physical channel packets.翻译过来就是该命令由 Host 使用用于读取 LE 广播物理信道数据包所使用的发射功率等级。这里有几个关键词需要注意。第一个关键词是 Host。这个命令是 Host 发给 Controller 的命令。第二个关键词是 transmit power level。它表示发送端发包时使用的发射功率等级。第三个关键词是 LE advertising physical channel packets。也就是说这里读取的是 LE 广播物理信道包使用的发射功率。对于 BLE Legacy 广播来说可以理解为广播设备在 advertising channel 上发送广播包时使用的发射功率。Legacy 广播主要涉及这些空口广播 PDUADV_IND ADV_DIRECT_IND ADV_SCAN_IND ADV_NONCONN_IND SCAN_RSP这些包是在 primary advertising channels 上发送的也就是Channel 37 Channel 38 Channel 39所以这个命令读取的是本机 Controller 在发送 LE 广播物理信道包时使用的 TX Power。四、Return ParameterStatus第一个返回参数是Status大小是1 octet取值含义如下0x00 表示 HCI_LE_Read_Advertising_Physical_Channel_Tx_Power command 执行成功。 0x01 to 0xFF 表示命令执行失败具体错误码需要参考 HCI Error Code。也就是说如果返回Status 0x00说明 Controller 成功执行了这个命令。如果返回不是 0x00就说明命令失败需要根据具体错误码进一步分析原因。五、Return ParameterTX_Power_Level第二个返回参数是TX_Power_Level大小是1 octet规范中给出的范围是Range: -127 to 20 Units: dBm Accuracy: ±4 dB也就是说TX_Power_Level 表示一个以 dBm 为单位的发射功率等级。例如TX_Power_Level 0 dBm表示当前广播物理信道发送功率大约是 0 dBm。TX_Power_Level -10 dBm表示当前广播物理信道发送功率大约是 -10 dBm。TX_Power_Level 4 dBm表示当前广播物理信道发送功率大约是 4 dBm。这里要注意TX_Power_Level 虽然是 1 个 octet但它不是普通无符号整数而应该按照 signed 8-bit 有符号数理解。例如0x00 0 dBm 0x14 20 dBm 0xF6 -10 dBm 0xEC -20 dBm如果把 0xF6 当成无符号整数解析就会得到 246这显然是不对的。六、TX Power 到底表示什么TX Power 表示的是发送端发出无线包时使用的发射功率。可以把它类比成一个人说话时的音量。TX Power 越高就像说话声音越大TX Power 越低就像说话声音越小。对于 BLE 广播设备来说TX Power 高 广播覆盖范围倾向更远但功耗更高。 TX Power 低 广播覆盖范围倾向更近但功耗更低。但是要注意TX Power 不是距离。它只是发送端发包时使用的功率等级。一个设备用 4 dBm 发广播并不能直接说明它离扫描设备有多远。同样一个设备用 -20 dBm 发广播也不能直接说明它一定很近。距离还会受到很多因素影响例如天线设计 手机型号 模块摆放方向 人体遮挡 墙体遮挡 金属反射 2.4GHz 环境干扰 不同广播信道的传播差异 接收设备的射频性能所以 TX Power 只能说明发送端的发射功率不能直接等价于距离。七、TX Power 和 RSSI 的区别TX Power 和 RSSI 很容易被混淆但二者完全不是同一个概念。TX Power 是发送端的发射功率。RSSI 是接收端接收到信号时测到的信号强度。可以这样理解TX Power 设备发出去时的强度。 RSSI 手机收到时测到的强度。例如广播设备 TX Power 0 dBm 手机收到时 RSSI -60 dBm这表示广播设备以 0 dBm 的功率发出广播包 信号经过空气传播、距离衰减、遮挡、反射等影响 手机最终收到时测得 RSSI 是 -60 dBm。所以TX Power 是发送侧概念。 RSSI 是接收侧概念。不能把 RSSI 当成 TX Power也不能把 TX Power 当成 RSSI。八、为什么不能只通过 RSSI 判断远近很多 App 会根据 RSSI 排序甚至有人会直接根据 RSSI 强弱判断设备远近。比如设备 ARSSI -50 dBm 设备 BRSSI -70 dBm直觉上会觉得设备 A 比设备 B 更近。但这个判断不一定可靠。因为 RSSI 不仅受距离影响还受 TX Power 影响。例如设备 A TX Power -20 dBm RSSI -60 dBm 设备 B TX Power 4 dBm RSSI -60 dBm如果只看 RSSI两者都是 -60 dBm好像距离差不多。但是结合 TX Power 后就不一样了。设备 A 发射功率本来就很低手机还能收到 -60 dBm说明它可能离得比较近。设备 B 发射功率较高但手机收到仍然是 -60 dBm说明中间路径损耗更大它可能距离更远或者中间有遮挡、干扰、反射等影响。所以直接用 RSSI 强弱判断远近是非常不严谨的。更合理的方式是结合TX Power RSSI粗略判断路径损耗。九、Path LossTX Power 和 RSSI 的关系如果已知 TX Power 和 RSSI可以粗略计算路径损耗Path Loss ≈ TX Power - RSSI例如TX Power 0 dBm RSSI -60 dBm那么Path Loss ≈ 0 - (-60) 60 dB表示从发送端到接收端之间大约产生了 60 dB 的路径损耗。再看另一个例子设备 A TX Power -20 dBm RSSI -60 dBm Path Loss ≈ -20 - (-60) 40 dB设备 B TX Power 4 dBm RSSI -60 dBm Path Loss ≈ 4 - (-60) 64 dB虽然两个设备 RSSI 都是 -60 dBm但设备 B 的路径损耗更大。所以从粗略角度看设备 B 可能更远或者中间环境损耗更严重。但是Path Loss 也只能用于粗略判断不能用于精确测距。因为 BLE RSSI 本身波动很大同一设备不动时RSSI 也可能因为人体遮挡、手机握持方向、反射、多径、信道差异而上下跳动。十、这个 Command 读到的 TX_Power_Level 会自动出现在广播包里吗不会。这是一个很容易误解的地方。HCI_LE_Read_Advertising_Channel_Tx_Power读到的是本机 Controller 当前用于 LE 广播物理信道包的发射功率。但是这个值不会因为你读取了它就自动出现在广播数据中。如果你希望扫描方能从广播包中解析到 Tx Power Level需要你在 Advertising Data 或 Scan Response Data 中主动放入AD Type 0x0A Tx Power Level例如02 0A 00表示Length 0x02 AD Type 0x0A Tx Power Level 0 dBm又例如02 0A F6表示Length 0x02 AD Type 0x0A Tx Power Level -10 dBm也就是说HCI_LE_Read_Advertising_Channel_Tx_Power 读取的是实际广播发射功率 AD Type 0x0A 是放进广播数据里、声明给扫描方看的 Tx Power Level。两者不是自动绑定的。比较规范的做法是先读取或确认当前实际广播 TX Power 然后把一致的 TX Power Level 放进 Advertising Data 或 Scan Response Data。这样扫描方解析广播数据时才能得到相对可信的 Tx Power Level。十一、AD Type 0x0A 和 HCI Command 的区别需要特别区分这两个概念HCI_LE_Read_Advertising_Channel_Tx_Power和AD Type 0x0A Tx Power Level它们都和 TX Power 有关但层级完全不同。前者是 HCI Command。它是 Host 向本机 Controller 读取本机广播物理信道发射功率。后者是 Advertising Data 中的一个 AD Structure。它是广播设备主动放进广播包里给扫描方看的字段。可以这样对比HCI_LE_Read_Advertising_Channel_Tx_Power - 属于 HCI Command - Host 读取本机 Controller - 不在广播包中 - 扫描方不能直接看到 - 返回 TX_Power_Level AD Type 0x0A Tx Power Level - 属于 Advertising Data - 在广播包 Data 中 - 扫描方可以解析 - Android 中可能对应 ScanRecord.getTxPowerLevel() - 是否存在取决于广播数据是否配置了该字段所以如果 Android 扫描回调里出现txPowerLevel -2147483648通常说明 ScanRecord 中没有解析到 AD Type 0x0A。也就是说广播数据里没有携带 Tx Power Level。十二、Android 扫描回调里的 txPower 和 txPowerLevelAndroid 扫描回调中常见两个字段ScanResult.getTxPower() ScanRecord.getTxPowerLevel()这两个也要区分。对于 Legacy 广播来说ScanRecord.getTxPowerLevel()通常来自 Advertising Data 或 Scan Response Data 中的AD Type 0x0A如果广播数据中没有这个 AD StructureAndroid 通常会返回不可用值。而ScanResult.getTxPower()在 Extended Advertising 场景中可能来自 Extended Advertising Report event 中的独立 Tx_Power 字段。但在 Legacy 广播中LE Advertising Report event 本身没有独立的 Tx_Power 字段所以 Android 里这个值经常是不可用值。例如txPower 127这通常不表示发射功率是 127 dBm而是表示 Tx Power 不可用。所以当你看到RSSI -52 dBm txPower 127 txPowerLevel -2147483648更合理的解释是RSSI 是有效的接收信号强度 txPower 不可用 txPowerLevel 没有从广播数据中解析到。这时不能严肃地根据 RSSI 判断距离。十三、这个 Command 在 Legacy 广播流程中的位置如果只看 BLE Legacy 广播主流程核心命令通常是HCI_LE_Set_Advertising_Parameters HCI_LE_Set_Advertising_Data HCI_LE_Set_Scan_Response_Data HCI_LE_Set_Advertising_Enable而HCI_LE_Read_Advertising_Channel_Tx_Power属于辅助理解命令。它不是开启广播的必要步骤但它可以帮助 Host 获取当前广播物理信道的 TX Power。一个比较规范的广播配置思路可以是1. 设置广播参数 HCI_LE_Set_Advertising_Parameters 2. 读取当前广播物理信道发射功率 HCI_LE_Read_Advertising_Channel_Tx_Power 3. 根据读取到的 TX_Power_Level 组织 Advertising Data 例如加入 AD Type 0x0A 4. 设置广播数据 HCI_LE_Set_Advertising_Data 5. 设置扫描响应数据 HCI_LE_Set_Scan_Response_Data 6. 开启广播 HCI_LE_Set_Advertising_Enable当然在实际模块开发中很多厂商并不会让你直接操作这些 HCI Command而是通过 AT 指令、SDK API、配置工具或厂商私有命令完成配置。但从规范理解角度看这个 HCI Command 的意义就是读取本机 Legacy 广播物理信道当前使用的发射功率。十四、TX Power 由什么决定TX Power 不是随便填一个数就一定能生效的。它通常由以下因素决定。第一芯片硬件能力。不同蓝牙芯片支持的发射功率范围不同。有的芯片可能支持-20 dBm 到 4 dBm有的芯片可能支持-40 dBm 到 8 dBm规范中 TX_Power_Level 的表达范围是-127 到 20 dBm但这只是字段表达范围并不代表每颗芯片都支持完整范围。第二Controller 当前配置。有些芯片可以通过厂商 SDK、AT 指令、私有 HCI Command 配置发射功率。例如模块可能提供类似设置 BLE TX Power 设置 RF Power 设置广播功率这样的功能。这些配置可能会影响实际广播发射功率。第三产品功耗策略。TX Power 越高覆盖距离倾向越远但功耗也越高。TX Power 越低功耗越低但覆盖范围通常也会变小。所以低功耗设备不会无脑使用最高发射功率。第四法规限制。2.4GHz 无线设备的发射功率会受到不同国家和地区法规限制。即使芯片硬件支持较高功率实际产品中也可能因为认证和法规要求而限制功率。第五天线和整机设计。即使 Controller 设置的是某个发射功率实际到天线辐射出去的效果也会受到射频前端、天线匹配、PCB 设计、外壳结构等因素影响。所以 TX Power 是一个发送端的功率指标但实际无线传播效果还要看整机射频设计。十五、总结HCI_LE_Read_Advertising_Channel_Tx_Power是 BLE Legacy 广播中用于读取本机广播物理信道发射功率的 HCI Command。它返回的核心字段是TX_Power_Level含义是当前用于 LE advertising physical channel packets 的发射功率等级。需要记住几个关键点1. TX Power 是发送端概念RSSI 是接收端概念。 2. TX_Power_Level 表示本机 Controller 发广播包时使用的发射功率。 3. HCI_LE_Read_Advertising_Channel_Tx_Power 读取到的值不会自动出现在广播包里。 4. 如果希望扫描方解析到 Tx Power Level需要在 Advertising Data 或 Scan Response Data 中配置 AD Type 0x0A。 5. 只看 RSSI 判断远近是不严谨的。 6. 更合理的粗略方式是结合 TX Power 和 RSSI 估算路径损耗。 7. 即使结合 TX Power 和 RSSI也只能粗略判断远近趋势不能精确测距。一句话总结TX Power 说明设备发出去时用了多大功率 RSSI 说明手机收到时测到了多强信号 只看 RSSI 判断远近很容易误判。