它“看起来像固定的”,这正是很多人困惑的根源。
下面我分 规范层 → 工程现实 → 你该如何对待 三层说清楚。
一、规范层结论(标准答案)
TxPower 不是固定值。
在 iBeacon 规范中:
TxPower = 1 米处的 RSSI
单位:dBm
类型:int8(-128 ~ +127)
每一个 Beacon 都可以不同
协议 没有规定必须是 -59(C5)。
二、那为什么你几乎总看到 C5?
1️⃣ 厂商默认值(最主要原因)
绝大多数 Beacon 厂商:
出厂直接写死一个“经验值”
最常见的就是:
TxPower = -59 dBm → 0xC5
原因很现实:
Apple 官方示例用的是 -59
对“看起来能用”的 accuracy 最友好
不用做标定,成本最低
2️⃣ 真正标定太麻烦(工程原因)
要得到真实 TxPower,必须:
固定 Beacon
手机放在 1 米
多设备采样
多环境平均
这在量产和部署中 几乎不可行。
3️⃣ 即使标定了,也不稳定
即便你认真测了:
天线方向变了
安装高度变了
外壳换了
电池电压下降了
TxPower 也会“漂”。
三、所以工程界的真实态度是?
TxPower 是“参考值”,不是“物理常量”。
这就是为什么:
SDK 经常不暴露它
accuracy 经常不准
商用系统绕开它
四、不同 TxPower 的现实范围(参考)
五、你在工程上应该如何对待 TxPower(重点)
✅ 正确用法
用于:
RSSI → 距离的大致尺度
UI 展示
或作为:
权重计算的一个参数
❌ 错误用法
当成“真实物理距离”
用它做硬阈值判断
跨设备比较距离
六、如果你想“让它不再看起来固定”
方案 1:自己标定(仅限可控环境)
Beacon 固定
手机 1 米
采样 100 次
取中位数
存成:
txPowerMap[minor] = -63;
方案 2:直接放弃 txPower(更推荐)
用 RSSI 排序
用相对强度
用时间稳定
七、一句话工程总结
TxPower 在规范上是“可变的”,在现实中是“被写死的”。
真正靠谱的系统:
理解它
不依赖它