在Android Pie的系统中,HOGP设备(基于BLE的HID设备)的配对流程和以往的Android版本一样,从扫描到设备,到物理层建立连接,再到生成秘钥、服务搜索、HOGP profile连接,最终设备可以使用,这一套流程并没有什么改变。它是一套通用的逻辑,先建立物理连接,接着生成秘钥(以便后续profile连接时会用到),再以最小的BLE connection interval(7.5ms)快速浏览对端设备的服务,将服务缓存并上报服务的UUID给java层,java层决定连接哪个服务。
针对这个通用的BLE设备配对逻辑,从效率的角度出发,本文试图从配对流程的每一步提出一点优化的方案,尽量缩短HOGP设备的配对时间。
物理层连接的建立,以资源换时间
配对一个HOGP设备,从host下发给controller的“LE Create Connection”开始。这个command当中有两组重要的时间参数,他们是:
- LE_Scan_Interval , LE_Scan_Window
- Conn_Interval_Min , Conn_Interval_Max
后两个决定了连接建立后Android平台与 HOGP设备的通信周期,在配对阶段这个值当然是越小越好;前两个则表明,Android端愿意付出多大的努力去和对方“配对”。根据Spec的规定,Android需要在HOGP设备的广播包之后150us发出连接请求,因此它需要先扫描设备,扫到之后再立即送出CONNECT_REQ,建立连接。这个过程如下图所示:
因此,在扫描的interval一定的情况下,更大的扫描窗口将有更大的概率在一个interval中扫到设备并建立连接。目前,在Android 9.0的源码中,LE_Scan_Interval和LE_Scan_Window分别为60ms和30ms。
当然,提高扫描窗口会占用更多的物理层资源,因此这里优化的原则是,在符合使用场景的前提下,尽量增加扫描窗口的时间。
更大的ATT MTU size
HOGP即HID over GATT,它使用的是GATT profile。GATT的ATT MTU默认是23字节。也就是说,在GATT这一层,默认一个packet只能装23字节。如果数据量太大装不下,也就只能分多个packet传输。例如,HOGP里面有一个非常重要的属性叫“Report Map”,它对应USB HID的“HID Descriptor”,是一个数据量比较大的属性,长度一般在100字节以上。如果使用默认的ATT MTU来传输,配对的双方需要交互多次,花费多个connection event。以一个长度为189字节的Report Map在Connection Interval为15ms的case为例,air中的情况如下图: