什么是 Find My 网络?

2021年4月21日的苹果发布会发布了一款新的产品:AirTag。使用的是 BLE + UWB 的技术。BLE 和 Find My 网络为 AirTag 提供了 GPS 定位,UWB 进一步提供了厘米级别的定位精度 。二者相互补充,实为用户提供极致的物品防丢体验。AirTag 外观如下图所示:

Find My 是苹果公司发布的一项应用技术。这项技术比较神奇的一点是,支持这项技术的外设产品(如 AirTag),即使本身没有 GPS 模块,也能利用它周围的苹果设备(iPhone,iPad,AirPods,AirTag等)来帮助其定位。

其实三星早在21年1月份就发布了类似的产品(SmartTags),但三星的生态没有苹果的强大,使用体验上有所欠缺(无法全球定位)所以发布了之后不愠不火。

使用 iPhone 打开 Find My APP,就可以从地图上看到我所拥有的、所有被 Find My 网络侦测到的设备。APP 界面如下图:

让外设加入 Find My 网络

入网要求

非苹果生产的外设能否并入查我网络呢?答案是可以的:

苹果为其它想并入查我网络的外设生产商提供了技术规格,规格书如下:

Find_My_Network_Accessory_Specification__Developer_Preview_R3.pdf

从规格书中,我们可以详细了解到查我网络的原理、工作流程以及和外设相关技术标准。

github 资源

有一点比较麻烦的是,想并入Find My的设备的生产厂商,必须过 MFi 认证。github 上有人通过一些反向工程的方法,成功从苹果的服务器上拿到了自己的 BLE 外设的定位数据,链接如下:

https://github.com/seemoo-lab/openhaystack#how-to-track-other-bluetooth-devices

但这个的实用意义并不大。简单来说,它的工作流程是这样的:

  1. 作者在它的苹果电脑上生成了一对密钥对。把其中的 public key 通过有线的方式给到 BLE 外设
  2. BLE 外设按照 Find My 规格中关于 beacon 数据的格式,把 public key 不断的向周围广播出去
  3. 周围的苹果设备把这个 public key 结合自身的定位数据,发送到苹果服务器
  4. 作者的苹果电脑、通过一个 mail 插件,把服务器上的定位数据拿下来,显示在地图上。

可见,作者并不是从苹果的 Find My APP 上显示的设备定位,而是通过自己的 mail 插件来显示,并且需要一系列的部署来绕过苹果的门禁机制,实用意义不大。

第三方 Find My 外设

目前,已经有几家第三方公司的产品支持了 Find My 网络,包括:

贝尔金耳机

VANMOOF S3电动自行车

防丢器

开发 Find My 外设

想开发 Find My 外设的厂商、必须先拿到 MFi 认证。

具体的说,过了 MFi 认证的厂商,才能进一步拿到以下文档:

  • Works with Apple Find My Identity Guidelines
  • Software Authentication Server Specification
  • Unified Accessory Restore Protocol

在过 MFi 认证之前,苹果也发布了一份规格书,阐述了 Find My 的一些原理和流程,并且详细描述了构建一个 FindMy 外设所需的 BLE 服务。但也仅限于此,其中关于如何标识、加密、验证、OTA 的相关流程,需要过了 MFi 认证之后,拿到上述几个文档才能进一步了解。

这份文档目前(2021/04/20)貌似找不到了。幸亏我下手快,备份了下来:

Find_My_Network_Accessory_Specification__Developer_Preview_R3.pdf

Find My 网络核心概念

本章节提及的概念,不包含整个完整的 Find My 网络的技术范围,仅限定在 Find My 网络外设相关的技术范围内。

Find My app

即用户使用 Find My 网络这个功能的软件。iOS 13 之后,是一个默认的应用。可在 iPad 或 iPhone 上直接打开。打开后的界面如文章开头所示。

这个 app 包含以下功能:

  • 和朋友、家人分享你的定位
  • 在地图上显示你的、可被查找的设备
  • 让特定设备播放声音、格式化等
  • 添加新的设备

Transport

传输方式。Find My 网络外设使用 BLE 作为首要的传输技术、和苹果设备进行交互

Operation

工作流程。如下:

  1. 使用 Find My app 和一个 Find My 外设连接之后,他们之间就协商出了一对秘钥对。Find My app 保存着私钥和公钥;外设保存着公钥。
  2. 外设作为 BLE beacon,不断广播一个变化的秘钥(由公钥衍生而得)
  3. 周围的苹果设备(iPad,iPhone 等,可以是其他人的设备)检测到这个广播后,会把里面的秘钥结合自身的定位数据,打包上传苹果服务器
  4. Find My app 从服务器上拿到这些定位报告,将相关的定位数据解析出来

其中,和定位相关的数据是端对端加、解密的,苹果服务器无法得知。我的理解是,由周围的苹果设备加密(定位数据 + 公钥),再由 app 解密(定位数据 + 私钥)。苹果服务器只负责存储、传输。

Roles

角色。包含以下几种:

Owner device

拥有者设备。你的苹果设备,自然是用你的 Apple ID 进行激活、登录的,把外设和你的苹果设备连接过后(通过 Find My app),这个外设便被绑上了你的 Apple ID。成为 Find My network 的“拥有者设备”角色。当外设通过 Find My app 和某个苹果设备进行连接配对之后,外设便和 Apple ID 进行了关联。具有相同 Apple ID 的苹果设备、外设,便叫。

Accessory

实现了 Find My network 协议的外设。

Find My network

当你带着一个支持 Find My 协议的防丢器上街,你所处的环境里,周围人的 iPad、iPhone 等苹果设备(使能了 Find My 功能)构成了一张网络。你的防丢器本身不带 GPS 无法定位,但这张网络中的设备可以提供自己的 GPS 数据、和你的防丢器的 Apple ID 进行关联后,上传到苹果的服务器。

网络中具备扫描广播功能的苹果设备,称为发现者(finder),发现者越多,外设的定位越精准。

有一点需要注意的是,别人的苹果设备也能连上你的防丢器,用于给你的防丢器发送一个警告等功能。

Apple server

苹果服务器。负责接收加密过的定位相关数据并保存。

总结一下,结合 Roles 和 Operation 这两个概念的内容,外设的 Find My network 的工作流程描述如下:

  1. 设备拥有者(owner)通过 Find My app 把 外设(accessory )设为拥有者设备(owner device)
  2. 外设透过 Find My Network 网络、借助网络的定位功能,把自身的大概位置上传苹果服务器(Apple Server)。
  3. 设备拥有者通过 Find My app 可以在世界任何地方看到自己的设备

四个角色的关系如下图所示:

Features

包含以下几个特性:

Unwanted tracking detection

不必要跟踪监测,简称 UT。我的理解是有这样的应用场景:可以让用户发现不法者放在自己身边的跟踪器。

Lost mode

设备的拥有者可以把外设设置为丢失状态。

Play sound

拥有者的,或者非有拥有者的手机都可以控制外设发出声音。

前者通过连接后的 BLE Play sound—owner control point 特征来控制

后者通过连接后的 BLE Play sound—non-owner control point 特征来控制,只能控制 UT

States

外设的工作流程可以用一个状态机来描述,如下图:

Unpaired

未配对状态。外设第一次启动或者设置完成之前必须处于该状态。

在该状态下,外设必须把 Find My Network 服务作为 primary service 以可连接的广播类型发出来。

我的理解:

发出可连接广播,目的在于让拥有者发现、连上该外设,以便对其进行一些初始配置。

后面应该会讲到在配置完成后,发出不可连接的广播(beacon),这个广播就携带了相关配置信息,可以对设备进行定位。

Connected

连接状态。有以下特点:

  1. 配对流程完成之后,外设必须进入连接状态(是废话吗?还不清楚)
  2. 外设配对完成之后,拥有者可能会断开连接(外设多了之后,拥有者没办法对所有设备都保持连接,所以断开?)
  3. 已配对的外设,不再接受另一个苹果设备的配对;除非外设已经走完解配对流程(注意,没说不能连接)
  4. 外设需要能同时支持两个苹果设备同时连接(需要属于同一个 iCloud ID 的苹果设备,为啥要同时支持多个?)
  5. 动作检查和 UT 协议在连接状态下失效(因为没必要)
  6. 配对过的外设,如果在 10s 内不能完成对链路的加密,则应主动断开连接。

我的理解:

连接状态似乎不是外设所处的一个主要的状态。其目的只是为了给外设做一些初始化处理。

Nearby

附近状态。另外还有以下特点:

  • 外设断开连接之后,必须马上进入该状态,并且应该保持 TNEARBY
  • 动作检测和 UT 协议失效(这两玩意儿是 Separated 状态专属的)
  • 广播包带 nearby key

我的理解:

这个状态应该也属于一个过渡的状态。这个状态的目的是为了能够再次连接上?不清楚。

关于外设的状态机,以目前我的理解,Separated 状态才是一个正常应用的外设长期所处的状态。其它状态都是过渡

Separated

分离状态。满足以下条件的外设必须进入该状态:

  1. 外设已经配对。并且经历了初始化流程而启动(例如,复位)
  2. 处于 nearby 状态且已经 TNEARBY 超时

该状态有两个功能:动作检查和 UT 协议

我的理解:

这个状态是正常使用的外设长期处于的状态。

一个刚开箱的外设经过连接、配对之后,就会处于该状态,不断向外发出带有密钥信息的特定广播信号。

要求

前面对 Find My network 外设协议的一些核心概念做了阐述,这个章节会说明一些要求,包括:

  • 硬件要求
  • 加密
  • 软件鉴权
  • 苹果服务器公钥
  • 重启
  • 固件升级

本文只挑一些主要进行说明,具体需要见规格书

硬件要求

蓝牙

蓝牙控制器必须满足以下特性:

  • LE 2M uncoded PHY。
  • Data packet length extension

蓝牙发送功率应该固定在大于等于 +4dBm 的水平,且满足 EIPR(Effective Isotropically Radiated Power ),即天线射频的方向性也要好

更大的发射功率让外设更容易被发现且能获得更频繁的位置更新;相反的,发射功率低则定位更加精确。

低功耗蓝牙外设应该支持:

  • LE advertising extensions 以支持其它服务和载荷信息的发送
  • Random resolvable address 且这些地址可周期性轮转变化

产品规格要求

在 separated 状态下,应该支持“动作触发”的 UT 声音警告:

  • 使用加速度传感器实现“动作触发”
  • 使用喇叭等发声器件实现 UT 警告声的播放

所谓 UT(Unwanted Tracking Detection ),主要目的在于给用户一个声音警告,告知其正携带着一个不是自己的外设。

Find My 标识

每个支持 Find My 的外设都应该在产品上戴有一个用户可见的标识

查找序列号

产品的序列号应该通过一些方式(NRF 或 BLE 连接)可读

Find My network 可禁用

产品应该实现一个机制来禁用 Find My network 功能,如按按键

Find My network 配对模式

产品应该实现一个机制让其进入配对模式,如长按按键 3 秒等

复位

产品应该有个机制来实现恢复出厂设置。恢复出厂设置的产品应该清除掉以下内容之外的所有信息:

• Accessory information service

• Firmware version

• Serial number

• Software authentication token

• Software authentication UUID

• Apple server public keys

- Signature verification key (Q_A)

- Encryption key (Q_E)

时钟精度

苹果设备期望外设达到 200PPM 的计时精度,即每天 17.28s 的误差。

加密

实现外设和拥有者设备的配对和密钥的派生功能,需要以下条件:

  • A cryptographically secure DRBG
  • Modular reduction and addition of big integers
  • An implementation of the SHA-256 cryptographic hash function
  • An implementation of the ANSI x9.63 KDF (see SEC1, 3.6.1 ANSI X9.63 Key Derivation Function)
  • Computations on the NIST P-224 elliptic curve (see FIPS 186-4, D.1.2.2. Curve P-224):
  • ECDSA/ECDH over the NIST P-256 elliptic curve (see FIPS 186-4, D.1.2.3. Curve P-256 and Pairing for more details).
  • AES-128-GCM encryption and decryption

软件鉴权

定义、作用理解中。。。

苹果服务器公钥

定义、作用理解中。。。

断电重启

设备断电重启后应该进入 separated 状态等一些要求

固件升级

外设必须能支持固件升级功能,且包含以下要求:

  • 有一个机制来确保固件的完整性
  • 待升级固件在发布前需要完成 MFi 认证的要求
  • 固件的版本不可以降级

浅析 Find My 原理的更多相关文章

  1. [转帖]浅析Servlet执行原理

    浅析Servlet执行原理 原贴地址: https://www.cnblogs.com/wangjiming/p/10360327.html 原作者画的图挺好. 自己之前看过iis的一些配置文档 但是 ...

  2. 浅析Servlet执行原理

    在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础.无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效 ...

  3. 浅析HTTP代理原理--转

    代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用. 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识. 本文主要介绍代理的事例,分析一个真实的案例来 ...

  4. 浅析JAVA Runtime原理与过各大厂商免杀webshell制作

    Author:Sevck Date:2017年6月24日 昨天在网络尖刀老年活动中心群里,忽然想到一个问题,就是JAVA在运行Runtime执行命令的时候会不会调用bash,因为php等语言会调用ba ...

  5. webpack系列--浅析webpack的原理

    一.前言 现在随着前端开发的复杂度和规模越来越大,鹰不能抛开工程化来独立开发,比如:react的jsx代码必须编译后才能在浏览器中使用,比如sass和less代码浏览器是不支持的.如果摒弃这些开发框架 ...

  6. 浅析HTTP代理原理

    代理服务器是HTTP协议中一个重要的组件,发挥着重要的作用. 关于HTTP代理的文章有很多,本文不再赘述,如果不清楚的可以看一下 HTTP代理的基础知识. 本文主要介绍代理的事例,分析一个真实的案例来 ...

  7. Cordova 浅析架构的原理

    因为项目使用了Cordova,也使用了很长时间.至于有很多hybride框架,为什么我们使用Cordova,这里不做过多的叙述,我们也是根据项目需求来选定的,需要及时更新.还要输出别人SDK等.没有最 ...

  8. 浅析ReDoS的原理与实践

    转载于http://www.freebuf.com/articles/network/124422.html ReDoS(Regular expression Denial of Service) 正 ...

  9. 浅析SSH核心原理(二)

    Hibernate是一个开放源代码的ORM(对象-关系映射)框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任 ...

随机推荐

  1. Mysql通过binlog恢复误update的数据

    事件: 在生产库执行update时只添加了STATUS(状态)条件,将所有状态为'E'的数据全部改为了'D' 思路: 操作步骤主要参考自文章:https://blog.csdn.net/weixin_ ...

  2. R语言barplot ,掌握本篇的内容,基本的条形图都可以画了

    本篇主要想复现文章中的一张图,原图来源(Antibiotic resistome and its association with bacterial communities during sewag ...

  3. pytorch中多个loss回传的参数影响示例

    写了一段代码如下: import torch import torch.nn as nn import torch.nn.functional as F class Test(nn.Module): ...

  4. 11. webpack配置Vue

    一. 在webpack中配置vue 了解了webpack的原理和用法以后, 我们来引入Vue webpack原理和用法详解链接: cnblogs.com/ITPower/p/14467745.html ...

  5. 盘点Excel中的那些有趣的“bug”

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. Excel 1.0早在1985年正式进入市场,距今已经有36年了,虽然在推出 ...

  6. MyBatis(四):自定义持久层框架优化

    本文所有代码已上传至码云:https://gitee.com/rangers-sun/mybatis 修改IUserDao.UserMapper.xml package com.rangers; im ...

  7. .NET初探源代码生成(Source Generators)

    前言 Source Generators顾名思义代码生成器,可进行创建编译时代码,也就是所谓的编译时元编程,这可让一些运行时映射的代码改为编译时,同样也加快了速度,我们可避免那种昂贵的开销,这是有价值 ...

  8. Shuffle Card HDU - 6707

    题目链接:https://vjudge.net/problem/HDU-6707 题意:给你一个数组a[ ](a[1]=1,a[2]=2.....a[n]=n),然后m次操作,每次把那个数拿到最前面去 ...

  9. Blind Super-Resolution Kernel Estimation using an Internal-GAN 论文解读

    背景与思路来源 目前 SR 模型中合成 LR 使用的模糊核问题 目前大多数 SR 的 model 都是用的合成下采样图片来进行训练的,而这些合成的图片常常使用的是 MATLAB 里面的 imresiz ...

  10. 对控制器类型“StudentController”的操作“Edit”的当前请求在下列操作方法之间不明确:

    "/"应用程序中的服务器错误. 对控制器类型"StudentController"的操作"Edit"的当前请求在下列操作方法之间不明确:类型 ...