蓝牙电话之PBAP协议分析

蓝牙电话之PBAP—简介

蓝牙电话应用不但需要HFP协议来支持打电话的功能,还有查看通讯录和通话记录等需求,那这就是PBAP协议干的事了,本系列我们就来聊一聊PBAP的前世今生。

PBAP:Phone Book Access Profile的简称,电话本访问协议,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能设备上的通讯录和通话记录等信息。该协议初始版本为2004-05-20的D05r00版本,随着后续的不断发展优化,首次被蓝牙组织SIG董事会采用是2013-11-05的v1.2.0版本,当前最新版本为2019-01-21发布的v1.2.3。我们之后所讲的PBAP协议规定都是以2015-12-15发布的v1.2.1版本为唯一依据,详情可查看《PBAP_v1.2.1.pdf》。
在这里插入图片描述

PBAP协议规定两种角色:

  • PSE:Phone Book Server Equipment,拥有电话本源数据的设备,作为服务端,比如手机。
  • PCE:Phone Book Client Equipment,向PSE端请求电话本信息的设备,作为客户端,比如车载蓝牙。
    在这里插入图片描述

由于PBAP协议是基于OBEX协议之上的应用层协议,所以我们先来简单学习下OBEX的相关知识,依据的协议为OBEX 1.3版本,详情可参考《OBEX 1.3.pdf》。

OBEX:Object Exchange的简称,对象交换协议,来源于红外通讯协议,但又不局限于具体的传输方式,后来被蓝牙组织SIG吸纳其中部分并进行优化处理作为蓝牙协议中的OBEX层用于蓝牙设备间的文件数据传输,如蓝牙传输文件(OPP)、同步电话簿(PBAP)和同步短信(MAP)等场景下都是以OBEX协议组织相关数据进行传输的。

OBEX协议有两种角色ServerClinet,通过request-response(请求-响应)形式进行交互,即客户端Client进行请求,服务端Server响应客户端请求的方式传输数据对象。应用于PBAP协议中客户端只能进行读取操作,不能对源数据进行修改操作,这样保证了源数据的安全性。

OBEX协议的数据组成有两个关键部分,分别为对象模型和会话协议。

(1) 对象模型:根据相关具体应用而定,这部分定义了Header来描述对象的一个方面,多个Header的集合便是一个完整的对象。

每个Header都是由两部分组成:HI + HV

  • HI:the header ID,一个字节,高两位代表ID的编码方式,低六位代表ID的含义
    在这里插入图片描述
    所以协议定义了如下这些HI,红色图框标注的几个类型的HI在PBAP中很重要:
    在这里插入图片描述
    HI=0x4C的APP.Parameters表示基于OBEX的上层应用协议在请求或响应包中传递的附加信息,也是由一系列连续的Tag-Length-Value构造组成:在这里插入图片描述
    那这一系列参数在PBAP中的构造组成主要是:在这里插入图片描述

  • HV:the header value,一个或多个字节,代表HI指示类型的具体值

(2) 会话协议:即Client和Server端采用请求-响应的方式进行数据传输

  • 请求数据格式
    在这里插入图片描述
    每个请求包必须有响应确认。
    请求命令中的opcode有如下选择:在这里插入图片描述
    其中红框标注的则是在PBAP中常使用到的三条指令,主要是建立连接、断开连接,还有一个Get就是数据传输的主要实现方式,PBAP中获取通讯录及通话记录都是以这样的方式同步数据的。

  • 响应数据格式
    在这里插入图片描述
    回应Client端的请求,response code有多种定义及说明,感兴趣的同学自行可以查看《OBEX 1.3.pdf》的3.2.1部分,但主要使用的回复code还是0xA0(OK)和0x90(Continue)。

前面OBEX会话协议中的请求部分也介绍到了在PBAP中常用的三种请求,接下来我们再分别就这些请求再加以详细说明。

1、Connect在这里插入图片描述

  • OBEX version number:已编码的OBEX协议版本,当前默认为1.0,这个和OBEX协议没有必然相同的关系。
  • lags:连接的标志,默认为 0。
  • maximum OBEX packet length:OBEX数据传输的最大包长,连接两方协议确定。

2、Disconnect在这里插入图片描述

3、Get在这里插入图片描述

总体而言OBEX的操作还是挺简单的,更多OBEX的详细分析可以参考协议或相关文章,这里就不做过多介绍。

接下来我们再回来看看PBAP协议在整体蓝牙协议结构中的位置:在这里插入图片描述

从上面的蓝牙协议栈结构中可以看出,PBAP应用层协议处于最上层,之后就是数据格式处理方式,由于通讯录在手机中都是以vCard的格式存储的,所以这边为vCard的数据处理格式。再往下就是通过OBEX协议层联通蓝牙协议栈中的RFCOMM,最后通过统一的数据传输通道l2cap链路发送数据。

当前vCard的版本有vCard 2.1 and vCard 3.0两种版本,所以PSE需要两种数据格式都支持,同步数据时根据PCE请求的哪种格式就以那种格式封装数据进行传输。但是无论哪种格式,vCard属性内容的字符集使用唯一的字符编码utf-8格式进行编码转换。

PSE如果是手机等带有SIM卡的设备,那其存储源数据的地方可能是手机也可能是SIM卡,因此在同步数据时需要考虑的更全面。这样的设备数据存储形式如下图所示:在这里插入图片描述

其中的各个电话簿对象说明如下表:
在这里插入图片描述

所以在同步获取相关数据时需要指明从哪个路径下获取对应的数据,即从手机同步还是从SIM卡中同步数据。

  • 手机路径:telecom/xxx.vcf
  • SIM卡路径:SIM1/telecom/xxx.vcf

因此根据同步的路径和同步对象的不同,我们大致可以得出四种不同的同步命令:

  1. 同步手机中的通讯录
  2. 同步SIM卡中的通讯录
  3. 同步手机中的通话记录
  4. 同步SIM卡中的通话记录

在后面的PBAP同步流程分析中我们也将着重讲解以上四个方面,使用PBAP协议中的Phone Book Download Feature功能,同步PCE感兴趣的电话簿对象,整体流程如下:在这里插入图片描述

蓝牙电话中关于PBAP协议我们就总结到这,后续分别总结下PBAP的连接断开、同步等流程,感兴趣的小伙伴欢迎私信留言一起讨论。

更多互联互通技术,欢迎关注微信公众号:Connectivity在这里插入图片描述