蓝牙电话之PBAP协议的连接

蓝牙电话之PBAP—连接

前一篇文章《蓝牙电话之PBAP协议分析》大致讲解了PBAP协议的相关内容,本篇我们就开启PBAP连接流程的分析。由于PBAP的连接过程涉及到的知识点较多,有些地方没有分析写出来还忘理解。
在这里插入图片描述

PBAP的连接分为连接请求和连接响应,在PBAP协议中一般是PCE主动发起连接请求,PSE响应该连接请求,这也符合Client-Server设计原则。因为电话簿源数据都是存储在PSE中的,只有PCE需要通过PBAP协议来将这些数据同步过来,所以PSE等待PCE的请求并做出响应。

连接请求格式
在这里插入图片描述

连接响应格式
在这里插入图片描述

PBAP的连接及响应的数据构造如上所述,相应的数据包封装完成后经RFCOMM协议中转到蓝牙的l2cap链路上,通过HCI下发到蓝牙芯片将数据发送给对端设备。重点需要关注连接请求中的Target也就是标记PBAP连接的那串UUID号,Server端收到OBEX的连接请求只能通过该UUID来区分是哪种协议的连接。

所以完整的PBAP连接流程分为以下三部分:
在这里插入图片描述

所有的蓝牙数据操作都是已ACL链路连接成功为前提条件,如果PBAP连接时,蓝牙还没建立ACL链路,需要将ACL链路建立成功才能继续PBAP的连接流程。下面分别对这三部分加以分析。

步骤 1:SDP服务发现

要发起某个协议的连接,必须先进行SDP服务搜索,发现对端设备支持该协议才能继续连接流程。

主要是建立PSM = SDP的l2cap链路,然后在该链路上搜索Phonebook Access–PSE的服务,PSE如果支持该服务会将会将该服务的绑定的channel返回给PCE端。最后将该l2cap链路断开。HCI层的消息交互如下图:
在这里插入图片描述

步骤 2:RFCOMM连接

在SDP服务中根据获取到的搜索结果选择L2CAP还是RFCOMM建立链路连接,具体如何选取在后面有截图说明(其实不管是哪种连接方式,归根结底还是l2cap的连接,哈哈,蓝牙的所有数据交互都是基于l2cap链路,除了电话语音数据走的是sco链路)。这里我们以RFCOMM连接举例,通过对端设备提供的channel通道号去连接该协议的RFCOMM通道,为PBAP(OBEX)的连接做准备。
在这里插入图片描述

步骤 3:PBAP连接

以OBEX连接的数据格式构造数据,通过层层的包头封装成不同的协议数据格式最后通过步骤2建立起来的链路发送给PSE请求建立连接。如下图:
在这里插入图片描述

经过以上三个步骤,PBAP协议就认为连接成功了。那这些步骤在安卓系统中是如何一一实现的呢?其实在安卓蓝牙系统中只要分为SDP服务发现和PBAP连接两部分,那我们就分别来看下这两部分在PBAP整个连接流程中的时序图。

  • SDP服务发现
    在这里插入图片描述
    从上图可以明显看出,PBAP连接首先需要主动开启SDP服务发现流程,SDP完成后通过PSE回复的数据来确认是否支持PBAP协议,支持的话将搜索结果上报给应用层,蓝牙服务在PbapClientConnectionHandler处理线程中下发连接指令。
    其中l2cap链路连接及SDP服务发现的具体流程,我们在这里暂时先不讲,这些知识点是蓝牙核心协议的部分,以后会专门另开文章做深入的分析。

  • PBAP连接
    在这里插入图片描述
    根据SDP服务搜索到的结果中是否包含SdpPseRecord.getL2capPsm(),决定PBAP连接是基于L2CAP还是RFCOMM建立连接,下图是两份SDP搜索结果的对比:
    在这里插入图片描述

连接的过程也是分为两部分:

  1. 在蓝牙服务层和协议栈创建socket进行通信
  2. 基于OBEX发起PBAP的连接请求

其中需要注意的关键点是协议栈中socket线程通过监听文件描述符的状态变化采取对应的处理,从而使整个流程跑起来。

最终蓝牙服务将PBAP的连接状态变化的广播发送到安卓系统里,蓝牙电话相关应用监听了如下截图的广播即可捕获。从而基于PBAP连接成功的条件下进行数据交互,如同步通讯录、通话记录等,同步内容我放到下篇文章再做分析。
在这里插入图片描述

蓝牙电话中关于PBAP协议连接的流程就总结到这,大部分精髓都在那两份时序图中,期望能给同学们一点帮助。感兴趣的小伙伴欢迎私信留言一起讨论。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章