蓝牙OBEX和PBAP协议概述
OBEX 全称为 Object Exchange,是对象交换协议,蓝牙的 OBEX 是 IrOBEX 的子集,其中对象是一个柔性概念,可以包括文件,诊断信息,电子商务卡片(Vcard),银行的存款,短信消息等等。Objects 在这里没有高级的技术含义,而是视你的应用而定。
对象模型回答了对象是如何在 OBEX 协议描述的。这个模型必须包括被传输的对
象和对对象的描述。为了做到这点,OBEX 定义了 Headers 的概念。
一个 Header 反映了对象的一个方面,例如名字、长度、描述文字或者对象本身。
例如,一个文件对象 demo.txt 会包含它的名字,一个类型标示为“text”,长
度和文件本身。
Headers 的构成
Headers 简单的由<Header ID>和<Header Value>组成,简称为<HI>和<HV>。
HI 由一个字节组成,指出了 Header 包含的内容以及它的格式。HV 包含了一个或
者多个字节,其结构由 HI 所决定。
所有的 Header 都是可选的,取决于设备的类型和事务的种类。你可以使用所有
的 Header,或者一些,或者没有。ID 可以使 Header 可解析以及与传输顺序无关,
也可以使不支持的 Header 被忽略掉。
HI 又可以分为两部分,高 2 位和低 6 位。高 2 位确定了 HI 的编码方式(见表二),
低 6 位确定了 HI 的意义(见表三)。
其中,0x4C也就是App.Parameter,是给OBEX的上层协议提供的,可以填一些上层应用的特定参数,是基于TLV结构的,tag和len都占用1个字节
OBEX请求和响应
request 和 response都是如下结构
request的opcode
response的opcode
OBEX 用于蓝牙的 opcode 格式
connect operation
个人理解,connect request的header中应该包含target header,说明要连接什么服务,connect response的header中应该包含connection id header,说明这个服务连接到了哪个id,之后的操作中需要使用这个id。
disconnect operation
put operation
get operation
abort operation
这几个都是一样的标准OBEX请求和响应格式
setpath operation
SetPath 操作用于切换对方的路径。通常使用一个 Name Header 用于指定对方路径名称。如果为空,则返回默认目录,通常为根目录
PBAP 概念
电话本访问协议 Phone Book Access Profile (PBAP)用于访问电话本对象(通
过 Vcard 形式),是基于客户端/服务器的模型,一般用于 client 从 server 下
载电话本。这个协议为为 HFP/SIM 协议设计。分为两个角色
Phone Book Server Equipment (PSE)
Phone Book Client Equipment (PCE)
可以看到两个架构在 OBEX 层以下稍微有点不同,V1.2 之前是 OBEX 直接走
RFCOMM,但是在 V1.2 后基于 GOEP 的版本,如果是 GOEP V2.0 以后那么走 L2CAP
ertm,如果是 1.1 版本,那么继续走 RFCOMM,对旧版本做兼容
只有当 PCE 跟 PSE 都在 SDP 中宣称 GOEP 2.0 或者更新的情况下数据走 L2CAP,
否则数据走 RFCOMM
PBAP 连接只是单向的,只能 PCE 去连接 PSE
建立PBAP连接
主要是target header 其中 796135f0-f0c5-11d8-0966-0800200c9a66 就是PBAP 的 UUID
连接响应格式如下:
phone book download feature
PullPhonebook 功能,整个流程是这样,PCE 连接了 PSE 的前提下,下载电话本,直到下载结束或者取消下载。
这个功能就是下载电话本的功能,用 OBEX Get 功能,参数如下:
Connection ID:这个是在 connection response 的时候获取到的参数
Single Response Mode:这个是在 GOEP 2.0 或者更新的版本必须要使用。
Single Response Mode Param:这个是在 GOEP 2.0 或者更新的版本必须要使用。
Name:要下载的电话本名称,是虚拟文件夹的绝对路径,比如你要下载手机中的所有的电话本,那么这个名字就是:telecom/pb.vcf,比如你要下载 SIM 卡中的电话本,这个名字就是:SIM1/telecom/pb.vcf,比如你要下载手机全部的通话记录,那么 name 就是:telecom/cch.vcf ,总之就是虚拟文件夹的绝对路径+.vcf 格式,另外这里要提下,编码方式是 unicode,也就是一个字符占用两个byte.
Type:类型,在 PBAP 中一直是 x-bt/phonebook
Application - PropertySelector:用于过滤返回 vcard 中属性,如果没有设置这个或者设置为 0,那么 vcard 中所有属性都会返回,另外,有几个属性会强制返回,不管你有没有设定,这个是区分 Vcard 版本,Vcard2.1 会强制返回VERSION ,N and TEL,Vcard3.0 会强制返回 VERSION, N, FN and TEL
Application - Format:vcard 格式,00是vcard2.1,01是vcard3.0
Application - MaxListCount:这个代表最大可以下载多少笔 vcard,设置为 0 可以获取到手机有多少笔 vcard.
Application - ListStartOffset:这个就是下载的开始偏移,如果你想从 50 笔开始下载,那么就设置为 50,如果你不设置或者设置为 0,那么默认从 0 开始
response的参数如下
其中 Body/End of Body 就是 vcard 数据
Phone Book Browsing feature
其中 SetPhonebook 就是进入 PBAP server 特定的虚拟文件夹
其中 PullvCardListing 就是下载 vCard 列表
其中 PullvCardEntry 就是下载特定的 vCard 数据
SetPhoneBook function是用OBEX的setpath请求,在应用参数中填上connect id和name(路径)就行了
PullvCardListing function
vcard list 是一组 xml 格式的对象,采用 utf-8 编码,vcard list 的 example
这个功能是下载 vCard 列表的功能,也是用的 OBEX 的 Get 封包,整个 request封包格式为:
Name:就是你要下载的虚拟文件夹路径
Type:固定为 x-bt/vcard-listing
PullvCardEntry function
这个就是根据 entry number 来下载特定 vcard 数据的功能,封包格式如下:
返回数据如下: