导语:AirTag 为什么能"被陌生人的 iPhone 帮忙在全球范围内定位"?答案不在 GATT,而在一类特殊的 BLE 广播里。本文拆解 Find My 离线查找(Offline Finding)的广播结构、公钥旋转与 MAC 绑定机制、端到端加密的隐私模型,以及如果你想自己做一个兼容信标,技术上加什么、现实里要注意什么。
关键认知:Find My 离线查找不是 GATT Service,它纯粹靠"不可连接的 BLE 广播"工作。你在 nRF Connect 的 GATT 列表里看不到它。
Find My 网络的核心思路:
所以你看到的广播包,里面没有 GPS、没有设备名,只有一段会定期变化 的公钥材料。
Find My 离线查找广播也走 Manufacturer Specific Data,Company ID 同样是 Apple 0x004C,但子类型是 0x12(Offline Finding / registered device):
1E FF 4C 00 12 19 [status] [22B key] [2bit hint] 00
| 偏移 | 字节 | 含义 |
|---|---|---|
| 0 | 1E |
AD 结构长度(30 字节) |
| 1 | FF |
AD Type:Manufacturer Specific Data |
| 2–3 | 4C 00 |
Company ID:Apple(0x004C),小端 |
| 4 | 12 |
子类型:Offline Finding |
| 5 | 19 |
载荷长度(0x19 = 25 字节) |
| 6 | 1 字节 | 状态字节(含电量等级) |
| 7–28 | 22 字节 | 广播公钥(advertising key)的剩余片段 |
| 29 | 1 字节 | 公钥最高 2 位(hint),用于还原完整公钥 |
| 30 | 00 |
Hint 常量(固定 0x00) |
状态字节的电量编码(开源实现 go-haystack 整理):
| 值 | 含义 |
|---|---|
0x10 |
电量满 |
0x40 |
电量中等 |
0x80 |
电量低 |
0xC0 |
电量极低 |
这是 Find My 协议最巧妙也最容易忽略的点:广播公钥被拆成了两部分——
接收方(iPhone)解析时:先从广播包拿到 MAC 地址,反序作为 key 的前 6 字节,再拼上 payload 里的 22 字节和 hint,还原出完整的 28 字节 advertising key。只有持有原始私钥的主人才能解密由此 key 加密的位置报告。
这意味着:MAC 地址本身就是公钥的一部分,并且随公钥一起轮换。所以 Find My 设备没有固定 MAC,天然抗长期追踪。
开源项目 OpenHaystack、go-haystack 已经逆向并实现了这套广播,让你用 ESP32 / nRF 等普通芯片"伪装"成可被 Find My 网络识别的信标。要点:
ADV_NONCONN_IND 或等价配置);1E FF 4C 00 12 19 ... 格式构造,任何字节偏差 iPhone 都不认;| 0xC0)。一个 ESP32 风格的构造片段(示意):
static uint8_t adv_data[31] = {
0x1E, /* Length = 30 */
0xFF, /* Manufacturer Specific Data */
0x4C, 0x00, /* Company ID: Apple */
0x12, 0x19, /* Offline Finding type + length */
/* status + 22-byte key + 2-bit hint + 0x00 由密钥派生填充 */
};
提醒:DIY 信标依赖 Apple 未公开的私有协议,格式可能随 iOS 升级变化;OpenHaystack 早年还需借助 macOS 插件拿认证令牌才能拉位置报告——这是研究 / 学习用途,落地产品请走正规 MFi 认证通道。
| 维度 | iBeacon | Find My 离线查找 |
|---|---|---|
| 用途 | 固定位置标识 / proximity | 移动设备全球寻物 |
| 标识 | 固定 UUID+Major+Minor | 轮换的公钥片段 |
| 是否含位置 | 否(只有 Tx Power 供测距) | 否(位置由路人手机加密上传) |
| MAC 地址 | 通常固定 | 随公钥轮换(抗追踪) |
| 是否 GATT | 否(纯广播) | 否(纯广播) |
| 加密 | 无 | 端到端(P-224) |
| 谁识别 | 你的 App | Apple 全球设备网络 |