蓝牙电话之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搜索结果的对比:
连接的过程也是分为两部分:
- 在蓝牙服务层和协议栈创建socket进行通信
- 基于OBEX发起PBAP的连接请求
其中需要注意的关键点是协议栈中socket线程通过监听文件描述符的状态变化采取对应的处理,从而使整个流程跑起来。
最终蓝牙服务将PBAP的连接状态变化的广播发送到安卓系统里,蓝牙电话相关应用监听了如下截图的广播即可捕获。从而基于PBAP连接成功的条件下进行数据交互,如同步通讯录、通话记录等,同步内容我放到下篇文章再做分析。
蓝牙电话中关于PBAP协议连接的流程就总结到这,大部分精髓都在那两份时序图中,期望能给同学们一点帮助。感兴趣的小伙伴欢迎私信留言一起讨论。
更多互联互通技术,欢迎关注微信公众号:Connectivity
蓝牙电话之PBAP协议的连接相关推荐
- 蓝牙 socket 建立不了_蓝牙电话之PBAP同步电话簿的安卓实现
PBAP同步电话簿的安卓实现 蓝牙电话中同步电话簿基本包含两个流程:同步联系人 + 同步通话记录,那本期我们就简单聊聊安卓系统中蓝牙电话(PCE)的电话簿是如何同步的. 本篇文章参考的安卓源码版本:A ...
- 蓝牙电话之PBAP同步电话簿的安卓实现
PBAP同步电话簿的安卓实现 蓝牙电话中同步电话簿基本包含两个流程:同步联系人 + 同步通话记录,那本期我们就简单聊聊安卓系统中蓝牙电话(PCE)的电话簿是如何同步的. 本篇文章参考的安卓源码版本:A ...
- Android 蓝牙开发——PBAP协议(十)
SDK路径:frameworks/base/core/java/android/bluetooth/ 服务路径:packages/apps/Bluetooth/src/com/android/blue ...
- 华为路由器hilink怎么用_路由器是华为HiLink协议的连接中心
[百度文库] 路由器是华为 HiLink 协议的连接中心 HiLink 智能家居, 是华为 HiLink 计划以连接为核心,同时凭借自身强大的研发能力,与众多垂直行 业领导品牌一起, 贡献自身物联网操 ...
- 通过S7协议或opc协议远程连接西门子模拟器
通过S7协议或opc协议远程连接西门子模拟器 1.环境准备 安装博途 下载:Nettoplcsim,https://sourceforge.net/projects/nettoplcsim/ 2.博途 ...
- PBAP协议 简单介绍
以下的内容摘自PBAP规范1.2.3 1,phone book object类型 pb:主电话本.有的电话本数据是存储在手机本身里,还有的存储在SIM卡里. ich:接电话列表. och:打电话列表. ...
- Windows使用ssh协议远程连接ubuntu linux子系统
Windows使用ssh协议远程连接ubuntu linux子系统 一.Windows远程连接ubuntu linux子系统 二.开启ubuntu ssh服务 三.获取ubuntu子系统的ip地址 四 ...
- mqtt调试助手_物联网入门,如何使用MQTT协议,连接Tlink物联网平台
大家好,超子又和大家见面了,超子我能力有限,技术不高,有什么错误的地方,欢迎板砖.今天我们一起构建MQTT协议中的CONNECT报文连接Tlink物联网平台.在前面的文章<Tlink物联网平台使 ...
- 防火墙(12)——查看协议被连接的次数、通过连接状态来写规则
我们想查看tcp协议在本机上建立了哪些,可以用如下命令: 来自于192.168.19.1的是我的windows主机: 还有两个128是来自我的另一台虚拟机 如下文件也会包含我们的连接信息: 一般情况下 ...
最新文章
- openstack安装在虚拟机上重启之后无法启动问题
- Qt学习之路(2):Hello, world!
- 前端学习(479):html简介
- POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)...
- go 怎么等待所有的协程完成_Go语言中的sync.Cond 的特点与用法
- iis怎么更换php版本,Windows 下PHP+IIS的安装方法(PHP版本为5.0)
- ASP.NET DAY1
- mysql自动备份linux_Mysql for linux mysql自动备份脚本
- python和区块链哪个好_10个最流行的Python区块链开源项目
- 全网首发:JDK绘制文字:五、字体上下文产生流程
- 椭圆曲线形式下的Pedersen commitment——vector commitment和polynomial commitment
- ubuntu16.04 gnome环境,怎么样下载使用monaco字体
- html调色板快捷键,CSS color设置与调色板
- Android View事件传递机制
- 什么是SEM?SEM是否包括SEO?
- Notion数字笔记使用教程
- LabVIEW AI视觉工具包(非NI Vision)下载与安装教程
- JavaScript同步与异步
- 好程序员大数据培训分享大数据概述
- Jetson Nano通过笔记本实现网络连接