Profile 实战

BLE Profile 实战:Apple Find My 离线查找广播(私有的全球寻物网络)

发布于 2026-07-23 · 来自「嵌入式江湖」技术专栏

导语:AirTag 为什么能"被陌生人的 iPhone 帮忙在全球范围内定位"?答案不在 GATT,而在一类特殊的 BLE 广播里。本文拆解 Find My 离线查找(Offline Finding)的广播结构、公钥旋转与 MAC 绑定机制、端到端加密的隐私模型,以及如果你想自己做一个兼容信标,技术上加什么、现实里要注意什么。

关键认知:Find My 离线查找不是 GATT Service,它纯粹靠"不可连接的 BLE 广播"工作。你在 nRF Connect 的 GATT 列表里看不到它。

一、离线查找的本质

Find My 网络的核心思路:

  1. 丢失设备(AirTag、AirPods、第三方 MFi 配件)持续广播一段含公钥片段 的不可连接广播;
  2. 附近任何人的 iPhone 扫到后,用自己的 GPS 位置 + 这段公钥加密,把"位置密文"匿名上传到 Apple 服务器;
  3. 主人用自己设备上的私钥 从 Apple 拉取并解密,得到丢失设备的坐标;
  4. Apple 全程看不到明文位置——这是端到端加密(E2E)。

所以你看到的广播包,里面没有 GPS、没有设备名,只有一段会定期变化 的公钥材料。

二、Find My 广播包结构

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 电量极低

三、公钥与 MAC 地址的绑定

这是 Find My 协议最巧妙也最容易忽略的点:广播公钥被拆成了两部分——

  • 前 6 字节 → 直接用作设备的 BLE MAC 地址(并把首字节最高两位置 1,构造成 Random Static Address);
  • 剩余 22 字节 + 首字节的最高 2 位(hint)→ 放进广播 payload。

接收方(iPhone)解析时:先从广播包拿到 MAC 地址,反序作为 key 的前 6 字节,再拼上 payload 里的 22 字节和 hint,还原出完整的 28 字节 advertising key。只有持有原始私钥的主人才能解密由此 key 加密的位置报告。

这意味着:MAC 地址本身就是公钥的一部分,并且随公钥一起轮换。所以 Find My 设备没有固定 MAC,天然抗长期追踪。

四、隐私模型(为什么 Apple 也看不到位置)

  • 密钥体系基于 P-224(SECP224R1)椭圆曲线。配件生成公私钥对,公钥(或其派生 advertising key)公开广播,私钥只留在主人设备。
  • 路人 iPhone 用广播里的公钥,把自己的 GPS 位置加密成密文上传;没有私钥解不开。
  • Apple 服务器只存密文,无法关联到具体用户,也无法定位设备。
  • 公钥定期轮换(AirTag 约每天 04:00 换一次;advertising 每 ~15 分钟变末字节,每 2 秒一次广播),进一步降低被跟踪风险。

五、自己做一个 Find My 信标(DIY)

开源项目 OpenHaystack、go-haystack 已经逆向并实现了这套广播,让你用 ESP32 / nRF 等普通芯片"伪装"成可被 Find My 网络识别的信标。要点:

  • 广播类型必须是 不可连接ADV_NONCONN_IND 或等价配置);
  • 广播间隔典型 2000ms(AirTag 离开主人后约每 2 秒一包);
  • 必须精确按 1E FF 4C 00 12 19 ... 格式构造,任何字节偏差 iPhone 都不认;
  • MAC 地址要设成 key 前 6 字节(首字节 | 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 认证通道。

六、Find My vs iBeacon:本质区别

维度 iBeacon Find My 离线查找
用途 固定位置标识 / proximity 移动设备全球寻物
标识 固定 UUID+Major+Minor 轮换的公钥片段
是否含位置 否(只有 Tx Power 供测距) 否(位置由路人手机加密上传)
MAC 地址 通常固定 随公钥轮换(抗追踪)
是否 GATT 否(纯广播) 否(纯广播)
加密 端到端(P-224)
谁识别 你的 App Apple 全球设备网络

七、现实约束与坑

  1. MFi 认证:量产销售 Find My 配件必须通过 Apple MFi 计划,逆向实现仅限研究。
  2. 反跟踪机制:iOS 会检测"陌生 AirTag 长时间跟随你"并弹警告、让 AirTag 发声。DIY 信标若不当使用有合规与伦理风险。
  3. iOS 26 更严格:对广播字节序、Flags、结构长度校验更严,老实现要及时跟。
  4. 密钥管理是核心:私钥丢了就永远找不到设备;静态密钥便于调试但隐私弱,动态轮换更安全。
  5. 功耗:每 2 秒广播 + 偶尔加速度计采样,纽扣电池寿命以年计(AirTag 标称约 1 年)。
  6. 广播间隔权衡:太快更易被附近手机抓到(定位更密),但更费电。
  7. 不可连接是铁律:一旦变成可连接,iPhone 可能尝试配对、破坏离线查找语义。
  8. 位置报告有时延:路人手机上报有批次 / 网络延迟,实时性不是秒级。
更多 BLE / 鸿蒙星闪 / 芯片选型 / MCU 实战,持续更新