蓝牙电话之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

蓝牙电话之PBAP协议的连接相关推荐

  1. 蓝牙 socket 建立不了_蓝牙电话之PBAP同步电话簿的安卓实现

    PBAP同步电话簿的安卓实现 蓝牙电话中同步电话簿基本包含两个流程:同步联系人 + 同步通话记录,那本期我们就简单聊聊安卓系统中蓝牙电话(PCE)的电话簿是如何同步的. 本篇文章参考的安卓源码版本:A ...

  2. 蓝牙电话之PBAP同步电话簿的安卓实现

    PBAP同步电话簿的安卓实现 蓝牙电话中同步电话簿基本包含两个流程:同步联系人 + 同步通话记录,那本期我们就简单聊聊安卓系统中蓝牙电话(PCE)的电话簿是如何同步的. 本篇文章参考的安卓源码版本:A ...

  3. Android 蓝牙开发——PBAP协议(十)

    SDK路径:frameworks/base/core/java/android/bluetooth/ 服务路径:packages/apps/Bluetooth/src/com/android/blue ...

  4. 华为路由器hilink怎么用_路由器是华为HiLink协议的连接中心

    [百度文库] 路由器是华为 HiLink 协议的连接中心 HiLink 智能家居, 是华为 HiLink 计划以连接为核心,同时凭借自身强大的研发能力,与众多垂直行 业领导品牌一起, 贡献自身物联网操 ...

  5. 通过S7协议或opc协议远程连接西门子模拟器

    通过S7协议或opc协议远程连接西门子模拟器 1.环境准备 安装博途 下载:Nettoplcsim,https://sourceforge.net/projects/nettoplcsim/ 2.博途 ...

  6. PBAP协议 简单介绍

    以下的内容摘自PBAP规范1.2.3 1,phone book object类型 pb:主电话本.有的电话本数据是存储在手机本身里,还有的存储在SIM卡里. ich:接电话列表. och:打电话列表. ...

  7. Windows使用ssh协议远程连接ubuntu linux子系统

    Windows使用ssh协议远程连接ubuntu linux子系统 一.Windows远程连接ubuntu linux子系统 二.开启ubuntu ssh服务 三.获取ubuntu子系统的ip地址 四 ...

  8. mqtt调试助手_物联网入门,如何使用MQTT协议,连接Tlink物联网平台

    大家好,超子又和大家见面了,超子我能力有限,技术不高,有什么错误的地方,欢迎板砖.今天我们一起构建MQTT协议中的CONNECT报文连接Tlink物联网平台.在前面的文章<Tlink物联网平台使 ...

  9. 防火墙(12)——查看协议被连接的次数、通过连接状态来写规则

    我们想查看tcp协议在本机上建立了哪些,可以用如下命令: 来自于192.168.19.1的是我的windows主机: 还有两个128是来自我的另一台虚拟机 如下文件也会包含我们的连接信息: 一般情况下 ...

最新文章

  1. openstack安装在虚拟机上重启之后无法启动问题
  2. Qt学习之路(2):Hello, world!
  3. 前端学习(479):html简介
  4. POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...
  5. go 怎么等待所有的协程完成_Go语言中的sync.Cond 的特点与用法
  6. iis怎么更换php版本,Windows 下PHP+IIS的安装方法(PHP版本为5.0)
  7. ASP.NET DAY1
  8. mysql自动备份linux_Mysql for linux mysql自动备份脚本
  9. python和区块链哪个好_10个最流行的Python区块链开源项目
  10. 全网首发:JDK绘制文字:五、字体上下文产生流程
  11. 椭圆曲线形式下的Pedersen commitment——vector commitment和polynomial commitment
  12. ubuntu16.04 gnome环境,怎么样下载使用monaco字体
  13. html调色板快捷键,CSS color设置与调色板
  14. Android View事件传递机制
  15. 什么是SEM?SEM是否包括SEO?
  16. Notion数字笔记使用教程
  17. LabVIEW AI视觉工具包(非NI Vision)下载与安装教程
  18. JavaScript同步与异步
  19. 好程序员大数据培训分享大数据概述
  20. Jetson Nano通过笔记本实现网络连接

热门文章

  1. Qt用QProcess调用exe的简单方法
  2. 对口高考 html语言,对口高考英语试卷2017
  3. ios html数组,[转载]IOS中字符串与数组的处理
  4. 【原】flash图片批量上传处理专用php类。
  5. Unreal Engine学习(一些稀碎的知识)
  6. Samtec科普 | 用于手术设备的连接器
  7. Softmax与SoftmaxWithLoss原理及代码详解
  8. 20_Lambda表达式与Stream编程
  9. python打字机效果_零基础手把手教你用Python做一个怀旧打字机
  10. 项目经理注意事项(3)---宏观把控