Fast Pair: 轻叩一下,无缝连接 Android 用户

Fast Pair: 轻叩一下,无缝连接 Android 用户
www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户

如果您是设备制造商,或是正在开发可与特定设备协同工作的应用 (例如可穿戴设备或 IoT 应用) 的开发者,当您和您的终端用户将设备与 Android 手机进行配对时,使用 Fast Pair (快速配对) 服务可以帮助您减少工作量。

  • Fast Pair (快速配对) 服务
    https://developers.google.cn/nearby/fast-pair/spec

事实上,您无需通过编码来启用 Fast Pairing,除非您希望在自己的配套应用中处理配对操作,而不是让 API 来帮您完成配对。

配对过程只有三个步骤:

  1. 确保您的外围设备符合所有的注册要求。
  2. 设备型号已在 Google 注册完毕。
  3. 当用户需要配对时,您的设备会呈现在他们的手机上。(如图 1 所示,步骤 1 中收集到的信息将会展示给用户)。
www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户

△ 图 1: Fast Pair 的连接通知

一旦用户将您的外围设备设置为配对模式,他们的 Android 手机界面底部会弹出一个对话框,显示设备名称、设备照片以及一个 Connect 按钮 (如图 1 所示)。

您的用户只需要点击该按钮即可实现设备配对,随后他们就可以享受愉快与轻松的体验了。

Fast Pair (快速配对) 服务也能够实现让用户通过他们的手机定位到放错位置的设备,甚至显示真无线立体声耳机 (TWS) 的电池电量。

  • Fast Pair (快速配对) 服务
    https://developers.google.cn/nearby/fast-pair/spec

最后,Fast Pair 可以提示用户安装任何可与设备配套使用的应用。

注册的前提条件

为确保您的设备能正确运行 Fast Pair,并提供更好的用户体验,需要满足如下条件:

个人隐私 & 低功耗蓝牙 (BLE)

为保护您用户的个人隐私并防止被跟踪,我们要求设备使用带有随机的可解析私有地址 (RPA) 的低功耗蓝牙 (BLE)。

  • 随机的可解析私有地址
    https://www.electronicdesign.com/technologies/communications/article/21801870/ble-v42-creating-faster-more-secure-powerefficient-designspart-2
  • 低功耗蓝牙
    https://zh.wikipedia.org/wiki/蓝牙低功耗

地址需要每 15 分钟以及每次广播会话 (Advertisement Session) 开始时更新一次。但在配对模式下不要切换使用地址;切换地址会阻止连接的建立与保持,因为当地址失效时连接便会断开。

账户密钥

Fast Pair 使用不同的账户密钥 (Acount Key) 来代表外围设备的不同的个人用户。账户密钥可以映射到一个 Gmail 地址上。

  • 账户密钥 (Acount Key)
    https://developers.google.cn/nearby/fast-pair/spec#AccountKeyList

您的外围设备需要存储至少五个账户密钥,以便多人同时使用同一设备。比如,家庭中的父母和孩子可以共用一辆车,每个人都会把自己的 Gmail 地址作为账户密钥使用。

作为一项附加功能,一个人在多部 Android 手机或平板电脑上使用同一个 Gmail 账户的情况,也会被 Fast Pair 服务视为一个账户密钥。因此,如果是十个不同的 Android 设备共享同一个 Gmail 账户,对于 Fast Pair 而言,您的外围设备不会做任何区分,它会将这些设备识别为同一个用户。

BLE GATT

您的设备需支持具有 Services 和 Characteristics 的 BLE GATT 的配置文件。

使用 Fast Pair 时,您需要定义一个 UUID 为 0xFE2C 的 service 和以下自定义 Characteristics:

  • Model ID
  • Key-based Pairing
  • Passkey
  • Account Key
  • 自定义 Characteristics
    https://developers.google.cn/nearby/fast-pair/spec#gatt_service

以上均为标准 Characteristics 和任何自定义 Characteristics (可用于与配套应用之间的通讯) 的补充。

如果您有配套应用并且已将其安装在中枢设备上,您的自定义数据将被转发至该应用。否则,自定义数据将被直接忽略。

您可以选择在应用中注册 ACTION 为 com.google.android.gms.nearby.fastpair.ACTION_LOG_BUFFER_FULL 的 BroadcastReceiver。这是可选的,因为使用此功能时,您的外围设备需要告知中枢设备数据缓冲区已满——这意味着外围设备的固件和配套应用需要做一些工作,才能对数据执行任意处理。

耳机设备

Fast Pair 常用于耳机设备,该类设备需要支持 A2DP 或 HFP。只要设备支持这些规范之一,Fast Pair 将在设备绑定完成后,先尝试连接 A2DP 之后是 HFP。

对于 TWS 耳机,需要满足以下条件:

  • 广播内容包含设备的电量信息。
  • 用户可以自定义设备名称。

虽然这些对其他外围设备来说不是必需的,但 Fast Pair 同样也支持并且强烈推荐满足这些条件。

拥有配套应用的设备

Fast Pair 具有更通用的配套应用启动流程,用于支持各种配套设备。在此流程中,Fast Pair 仅能发现距离最近的设备,检查该设备的配套应用 (如果尚未安装应用,则提示用户安装),并将用户引导到配套应用的指定界面。该流程不涉及 BT 绑定。

FitBit 采用此流程简化了它们设备配置的过程。另一个采用此流程的设备案例可能是智能体重秤或电动牙刷,可用于展示其配套应用并简化开箱即用的体验。

www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户

△ 图2: 配套设备设置引导

双向通信

虽然广播是单向通信,然而一旦您的设备成功连接到中枢设备,例如 Android 手机,双向通信就成为可能。

Fast Pair 为您的外围设备提供了一个 RFCOMM 通道,以保持与中枢设备的持续通信。一旦连接成功,切换到经典的蓝牙进行双向通信是完全没问题的。

  • RFCOMM 通道
    https://en.wikipedia.org/wiki/List_of_Bluetooth_protocols#Radio_frequency_communication_(RFCOMM)

注册

您需要将设备型号在 Google 注册为 Fast Pair Provider

  • 将设备型号在 Google 注册
    https://developers.google.com/nearby/devices/

Fast Pair Provider 是一个外围设备 (例如一副耳机) 可发送能接受配对的广播。

相反地,Fast Pair Seeker 是一个中枢设备——例如一台 Android 手机或平板电脑,它寻找其他设备进行配对。Google Play 服务框架会处理这部分工作,且不需要其他模块执行任何操作,所以这里不对该内容进行介绍。

为了注册您的外围设备,您只需要提供以下内容:

  • 设备名称
  • 设备图片

设备发射功率 (TxPower) 的测量值

https://developers.google.cn/nearby/fast-pair/spec#transmit_power

虽然设备的名称和图片很简单,但测量功率需要多花点功夫。我们建议您在距离 Android 手机一米远的地方测量蓝牙设备的信号强度,然后在测试结果的基础上再加 41dBm。

有关 Eddystone-UID 信息,请参阅:

https://github.com/google/eddystone/tree/master/eddystone-uid#tx-power

提交 TxPower 有两种选择: 您可以在注册时手动提交,或者您的设备可以在设备广播期间将其作为负载数据中的一部分。

如果您在注册期间提供了设备的 TxPower,则您提交的所有设备单位均被校准到准确的 TxPower 等级。另一方面,如果您决定把 TxPower 信息作为广播记录的一部分,TxPower 等级将按每单位的标准处理。

一旦完成注册,我们将为您提供一个 Model ID 和加密的公/私密钥对。与任何非对称加密系统一样,我们强烈建议您将私钥存储在设备上的安全元件 (SE) 中,这样攻击者便无法访问它。

  • 有关非对称密钥,请参阅:《》

您的设备在广播期间的负载数据中 (Advertisement Record) 需包括 Google 提供的 Model ID 和设备的 TxPower 等级 (如果您在注册时尚未提供的话)。

  • Model ID
    https://developers.google.cn/nearby/fast-pair/spec#AdvertisingWhenDiscoverable

结语

Fast Pair 是 Google 提供的一项服务,作为 Google Play 服务的一部分,用于简化 Android 用户的设备配对过程。除了让配对更加方便以外,Fast Pair 还提供了其他一些很棒的功能,包括帮助用户定位到放错位置的设备,并提示设备安装对应的配套应用等。为了能提供给用户最佳体验,尽管存在一些前提条件,但注册过程本身却很简单,因为它只需要提供设备名称和图片。

欢迎您通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户

推荐阅读

如页面未加载,请刷新重试

www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户

点击屏末 | 阅读原文 | 即刻了解更多 Fast Pair (快速配对) 服务


www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户
www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户
www.zeeklog.com  - Fast Pair: 轻叩一下,无缝连接 Android 用户

Read more

科普文:JUC系列之多线程门闩同步器LockSupport的使用和源码解读

科普文:JUC系列之多线程门闩同步器LockSupport的使用和源码解读

一、简介 LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。 LockSupport中的park()和unpark(thread)的作用分别是阻塞线程和解除阻塞线程,而且park()和unpark(thread)不会遇到“Thread.suspend和Thread.resume所可能引发的死锁”问题。 调用park()的线程和另一个试图将其unpark(thread)的线程之间的竞争将保持活性。 因为park()和unpark()有许可(permit)的存在,permit只有两个值1和0(默认)。permit默认值是0,所以一开始调用park()方法,线程必定会被阻塞。调用unpark(thread)方法后,会自动唤醒thread线程,即park方法立即返回。 1. 当调用unpark(thread)方法,就会将thread线程的许可permit设置成1(注意多次调用unpark方法,不会累加,permit值还是1)。 2. 当调用park()方法,如果当前线程的permit是1,那么将permit设置为0,并立即返回。如果当前线程的permit是0,

By Ne0inhk
科普文:JUC系列之多线程门闩同步器Condition的使用和源码解读

科普文:JUC系列之多线程门闩同步器Condition的使用和源码解读

一、概述 条件锁就是指在获取锁之后发现当前业务场景自己无法处理,而需要等待某个条件的出现才可以继续处理时使用的一种锁。 比如,在阻塞队列中,当队列中没有元素的时候是无法弹出一个元素的,这时候就需要阻塞在条件notEmpty上,等待其它线程往里面放入一个元素后,唤醒这个条件notEmpty,当前线程才可以继续去做“弹出一个元素”的行为。 注意,这里的条件,必须是在获取锁之后去等待,对应到ReentrantLock的条件锁,就是获取锁之后才能调用condition.await()方法。 在Java中,条件锁的实现都在AQS的ConditionObject类中,ConditionObject实现了Condition接口,所以ReentrantLock的条件锁是基于AQS实现的。 sychronized + Object.wait = Lock + Condition 二、案例 public class ReentrantLockTest { public static void main(String[] args) throws InterruptedExcepti

By Ne0inhk
科普文:JUC系列之多线程门闩同步器Semaphore的使用和源码解读

科普文:JUC系列之多线程门闩同步器Semaphore的使用和源码解读

一、概述 Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。 二、使用案例 可以用于做流量控制,特别是公用资源有限的应用场景,比如数据库连接。假如有一个需求,要读取几万个文件的数据,因为都是IO密集型任务,我们可以启动几十个线程并发地读取,但是如果读到内存后,还需要存储到数据库中,而数据库的连接数只有10个,这时我们必须控制只有10个线程同时获取数据库连接保存数据,否则会报错无法获取数据库连接。这个时候,就可以使用Semaphore来做流量控制。 /** * 类说明:演示Semaphore用法,一个数据库连接池的实现 */ public class SemaphoreExample { private final static int POOL_SIZE = 10; //两个指示器,分别表示池子还有可用连接和已用连接 private final Semaphore useful, useless; //存放数据库连接的容器 private stati

By Ne0inhk
实战:微服务之Spring Cloud 负载均衡组件loadbalance和ribbon的超时与重试机制

实战:微服务之Spring Cloud 负载均衡组件loadbalance和ribbon的超时与重试机制

一、概叙 1.1 实现目标 服务A调用服务B1和B2(B1和B2提供同种服务),当服务B1/B2在停止和重新发布阶段,或B1/B2有一个服务故障时, * 需保证服务A正常调用B服务,达到无感知发布的效果(服务B高可用) * 需保证服务A的请求负载均衡,避免某个B服务节点压力过大(服务B负载均衡) * 主要是验证服务调用超时和重试机制 说明:有用nacos服务注册发现组件。 1.2 环境 <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <spring.boot.

By Ne0inhk