eclipse不能连接至 vm socket closed_蓝牙电话之PBAP协议的连接

蓝牙电话之PBAP—连接

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

c65086b036dd82fd7bc5255bcecf432d.png

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

连接请求格式

98a4cbb48add425298d5990686f7e4f3.png

连接响应格式

f659c47e0f6066ee96dcb96233e4ce90.png

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

所以完整的PBAP连接流程分为以下三部分:

bac93204482b84ef00e300d8b1114c54.png

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

步骤 1:SDP服务发现

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

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

dc885d8abcc4b21d50756a97a6e9a2c4.png

步骤 2:RFCOMM连接

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

b8edc9577050f983294cb0a2a8ce7c98.png

步骤 3:PBAP连接

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

4fbec296ecf34db4bee7ecebfb1456ef.png

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

  • SDP服务发现
3f7ba39a003f6d3fa996f0aab38ee03c.png

从上图可以明显看出,PBAP连接首先需要主动开启SDP服务发现流程,SDP完成后通过PSE回复的数据来确认是否支持PBAP协议,支持的话将搜索结果上报给应用层,蓝牙服务在PbapClientConnectionHandler处理线程中下发连接指令。

其中l2cap链路连接及SDP服务发现的具体流程,我们在这里暂时先不讲,这些知识点是蓝牙核心协议的部分,以后会专门另开文章做深入的分析。

  • PBAP连接
c127e06318ea97073cbd93a73b8724d4.png

这张连接时序图费了我不少脑细胞...

根据SDP服务搜索到的结果中是否包含SdpPseRecord.getL2capPsm(),决定PBAP连接是基于L2CAP还是RFCOMM建立连接,下图是那份SDP搜索结果的对比:

37480b352ea3c97319f3bb0915fb6abe.png

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

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

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

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

68c64417138c5a52fead2aaf5729765c.png

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值