【Android】【Bluetooth Stack】蓝牙电话本协议分析(超详细)

1. 精讲蓝牙协议栈(Bluetooth Stack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论
2. 欢迎大家关注和订阅,【蓝牙协议栈】专栏会持续更新中.....敬请期待!

目录

1. 协议简述

1.1 PBAP

1.2 OBEX

2. PBAP协议栈

2.1 vCard格式

2.2 PBAP 角色介绍

2.3 PSE & PCE 功能

2.3.1 Download

2.3.1.1 PullPhonebook Data Format

2.3.1.2 Application Parameters Header

2.3.2 Browsing

2.3.2.1 SetPhonebook Data Format

2.3.2.2 PullvCardListing Data Format

2.3.2.3 PullvCardEntry Data Format

2.3.3 vcf文件


1. 协议简述

        蓝牙电话应用不但需要HFP协议来支持打电话的功能,同时在很多车载蓝牙应用中,都支持查看通讯录和通话记录等信息,而这一部分的所涉及到的协议为PBAP.

 1.1 PBAP

        PBAP(Phone Book Access Profile):电话本访问协议 ,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能设备上的通讯录和通话记录等信息,用于访问电话本对象(通过 Vcard形式),是基于客户端/服务器的模型,一般是 client从 server端下载电话本。这个协议是为 HFP/SIM协议设计. 

1.2 OBEX

        Object Exchange,对象交换协议,来源与红外通讯协议,但又不局限与具体的传输方式,后来被蓝牙组织SIG吸纳其中部分并进行优化处理作为蓝牙协议中的OBEX层用于蓝牙设备间的文件数据传输,如蓝牙传输文件(OPP)、同步电话簿(PBAP)和同步短信(MAP)等场景下都是以OBEX协议组织相关数据进行传输的;

        OBEX协议有两种角色:Server和Client,通过request-response(请求-响应)形式进行交互,即客户端Client进行请求,服务端Server响应客户端请求的方式传输数据对象;应用于PBAP协议中,Client只能进行数据的读取操作,不能对源数据进行修改,保证了源数据的安全性;

2. PBAP协议栈

 

        PBAP应用层协议处于最上层,之后就是数据格式处理方式,由于通讯录在手机中都是以vCard的格式存储的,所以这边为vCard的数据处理格式。在往下就是通过OBEX协议层联通蓝牙协议栈中的RFCOMM,最后通过统一的数据传输通道L2CAP链路发送数据;

2.1 vCard格式

BEGIN:VCARD\r\n
VERSION:3.0\r\n
N:;胡x;;;\r\n
FN:胡x\r\n
TEL;TYPE=CELL:610xxx\r\n
END:VCARD\r\n

  • BEGIN:VCARD:一组联系人信息开始标志
  • END:VCARD:结束标志
  • VERSION:版本
  • FN:姓名
  • TEL;TYPE=CELL:联系人联系方式

上述的参数为必要的,有些参数是可选项,例如:住址、邮件等信息;

当前vCard的版本有vCard 2.1 和 vCard 3.0 两个版本,所以PSE需要两种数据格式都支持,同步数据时根据PCE请求的哪种格式就以哪种格式封装数据进行传输。但是无论是哪种格式,vCard属性内容字符集使用唯一的字符编码utf-8格式进行编码转换;

2.2 PBAP 角色介绍

协议栈中定义了两种角色:

  • PSE:Phone Book Server Equipment,拥有电话本源数据的设备,作为Server,比如手机;
  • PCE:Phone Book Client Equipment,向PSE端请求电话本源数据的设备,作为Client,例如车机;

因为PBAP协议是基于OBEX协议实现的,那PBAP协议获取数据的方式也是通过request-response形式传输的;

2.3 PSE & PCE 功能

FeatureSupport by the PCESupport by the PSE
DownloadC1M
BrowsingC1M
Database IdentifierC3M
Folder Version CountersOM
vCard SelectingOM
Enhanced Missed CallsOO
X-BT-UCI vCard PropertyOO
X-BT-UID vCard PropertyOO
Referencing ContactsC2C2
Contact Image Default FormatXM
  • C1:至少支持其中一种
  • C2:如果支持' X-BT-UID vCard Property ',则可选,否则不支持不可选
  • C3:如果支持“Folder Version Counters” 或 “X-BT-UID vCard Property”,则必选,否则可选
  • O:可选
  • M:必选,必须支持

我们常使用到的功能为:Download和Browsing;我们分析一下;

2.3.1 Download

        Download功能可以将电话簿对象的全部内容同步到PCE,从而PCE端获取到数据后完全可以通过蓝牙电话等应用程序将数据显示到界面,一样可以达到滚动浏览电话簿信息的目的;

        Download这个功能特别是用于PSE端存储的电话簿容量相对较大,PCE设备通常从PSE端下载这些大容量数据并在其本地存储整个电话簿的场景。

FeatureFunctionSupport by the PCESupport by the PSE
Phone Book Download featurePullPhonebookMM

协议层提供了PullPhonebook函数,这个函数就是用来下载自己感兴趣的电话簿对象;

2.3.1.1 PullPhonebook Data Format

        由于PBAP协议是基于OBEX的,所以PullPhonebook函数顾名思义也是采用request-response这种一问一答的形式传输数据;

请求格式如下:

Field / HeaderNameValueStatus
FieldOpcodeGET(0x03 or 0x83)M
FieldPacket LengthVariesM
HeaderConnection IDVariesM
HeaderSingle Response Mode0x01C1
HeaderSingle Response Mode Param0x01C2
HeaderNameObject name (*.vcf)M
HeaderType"x-bt/phonebook"M
HeaderApplication Parameters
- PropertySelectorVariesO
- FormatVariesO
- MaxListCountVariesO
- ListStartOffsetVariesO
- ResetNewMissedCallsVariesC3
- vCardSelectorVariesC4
- vCardSelectorOperatorVariesC5
  • Opcode:操作码,可以理解为标识码,和Type参数组合形成了唯一标识;
  • Connection ID:PBAP连接指令中PSE回复的连接ID 号;
  • Name:表明了需要同步哪种数据;
  • Type:对应了Function,基本上每一个Function对应一个Type,除了SetPhonebook Function;
  • Application Parameters:应用设置的参数,PSE的回复数据会根据这些参数来组装回复data数据,其中就包括了PropertySelector、Format、MaxListCount等参数信息;
  • MaxListCount:本次 GET 获取的最大List Count;
  • ListStartOffset:本次 GET 开始的List Offset;

响应格式如下:

Field / HeaderNameValueStatus
FieldResponse0x09 or 0xA0 or Error CodeM
FieldPacket LengthVariesM
HeaderSingle Response Mode0x01C1
HeaderSingle Response Mode Param0x01C2
HeaderApplication Parameters
- PhonebookSizeVariesC3
- NewMissedCallsVariesC4
- PrimaryFolderVersionVariesC5
- SecondaryFolderVersionVariesC5
- DatabaseIdentifierVariesC6
HeaderBody/End of BodyvCard object(s)C7
  • PhonebookSize:Name个数,当MaxListCount = 0时,返回Name的总个数;
  • NewMissedCalls:新增的未接电话
  • Body/End or Body:请求中MaxListCount != 0时,返回Name对应的数据,回复数据中的vCard对象只应包含使用属性选择器Attribute Selector参数指示的属性,并且应使用格式Format参数指示的格式组装数据;
2.3.1.2 Application Parameters Header

该数据是由一组不同的TAG组成的整体的Application Parameters;

ValueTag IDLengthPossible Values
Order0x011 byte0x00 = indexed 0x01 = alphanumeric 0x02 = phonetic
Search Value0x02variableText
SearchProperty0x031 byte0x00 = Name 0x01 = Number 0x02 = Sound
MaxListCount0x042 bytes0x0000 to 0xFFFF
ListStartOffset0x052 bytes0x0000 to 0xFFFF
PropertySelector0x068 bytes64 bits mask
Format0x071 byte0x00 = 2.1 0x01 = 3.0
PhonebookSize0x082 bytes0x0000 to 0xFFFF
NewMissedCalls0x091 byte0x00 to 0xFF
PrimaryVersionCounter0x0A16 bytes0 to (2 128 – 1)
SecondaryVersionCounter0x0B16 bytes0 to (2 128 – 1)
vCardSelector0x0C8 bytes64 bits mask
DatabaseIdentifier0x0D16 bytes0 to (2 128 – 1)
vCardSelectorOperator0x0E1 byte0x00 = OR 0x01 = AND
ResetNewMissedCalls0x0F1 byte0x01 = Reset
PbapSupportedFeatures0x104 bytesBit 0 = Download Bit 1 = Browsing Bit 2 = Database Identifier Bit 3 = Folder Version Counters Bit 4 = vCard Selecting Bit 5 = Enhanced Missed Calls Bit 6 = X-BT-UCI vCard Property Bit 7 = X-BT-UID vCard Property Bit 8 = Contact Referencing Bit 9 = Default Contact Image Format Bit 10 ~ 31 Reserved 1
  • PropertySelector:用于指示请求的vCard object中应该包含的属性,PSE根据这些属性来组织恢复的Body/End of Body Header中包含的数据,PCE只能使用此Header接收所请求的vCard所需要内容,PSE不得回复任何其他性能数据,除非PCE有其他要求;

        PropertySelector的值是由一个64位的数据组成,所以每一位都代表了一种属性,如果PCE请求的电话簿需要包含对应的数据,就将该数据对应在PropertySelector的二进制位设置为true(1)。具体每一位的含义见下图:

流程图

        这里有一个需要注意的,PCE和PSE的服务连接不是一直保持的,只有在同步Phone Book的时候,服务保持连接,同步完成之后,就会断开;

2.3.2 Browsing

FeatureFunctionSupport by the PCESupport by the PSE
Phone Book Browsing FeatureSetPhonebookMM
PullvCardListingMM
PullvCardEntryMM

  • SetPhonebook:选择感兴趣的Phone Object
  • PullvCardListing:client使用该Function获取感兴趣的Phone Object 列表
  • PullvCardEntry:client使用该Function获取感兴趣的Phone Object(单个)
2.3.2.1 SetPhonebook Data Format

请求格式:

Field / HeaderNameValueStatus
FieldOpcodeSETPATH (0x05)M
FieldPacket LengthVariesM
FieldFlagsUp / Down / RootM
FieldConstantReserved (0)M
HeaderConnection IDVariesM
HeaderNameName of the folderO

响应格式:

Field / HeaderNameValueStatus
FieldResponse Code0xA0 or Error CodeM
FieldPacket Length3M
2.3.2.2 PullvCardListing Data Format

请求格式:

Field / HeaderNameValueStatus
FieldOpcodeGET(0x03 or 0x83)M
FieldPacket LengthVariesM
HeaderConnection IDVariesM
HeaderSingle Response Mode0x01C1
HeaderSingle Response Mode Param0x01C2
HeaderNameName of the folderM
HeaderType"x-bt/vcard-listing"M
HeaderApplication Parameters
- OrderVariesO
- SearchValueVariesO
- SearchPropertyVariesC3
- MaxListCountVariesO
- ListStartOffsetVariesO
- ResetNewMissedCallsVariesC4
- vCardSelectorVariesC5
- vCardSelectorOperatorVariesC6

响应格式:

Field / HeaderNameValueStatus
FieldResponse Code0x09 or 0xA0 or Error CodeM
FieldPacket LengthVariesM
HeaderSingle Response Mode0x01C1
HeaderSingle Response Mode Param0x01C2
HeaderApplication Parameters
- PhonebookSizeVariesC3
- NewMissedCallsVariesC4
- PrimaryFolderVersionVariesC5
- SecondaryFolderVersionVariesC5
- DatabaseIdentifierVariesC6
HeaderBody/End of BodyvCard object(s)C7
2.3.2.3 PullvCardEntry Data Format

请求格式:

Field / HeaderNameValueStatus
FieldOpcodeGET(0x03 or 0x83)M
FieldPacket LengthVariesM
HeaderConnection IDVariesM
HeaderSingle Response Mode0x01C1
HeaderSingle Response Mode Param0x01C2
HeaderNameObject name (*.vcf) or X-BT-UID (X-BT-UID)M
HeaderType"x-bt/vcard"M
HeaderApplication Parameters
- PropertySelectorVariesO
- FormatVariesO

响应格式:

Field / HeaderNameValueStatus
FieldResponse Code0x09 or 0xA0 or Error CodeM
FieldPacket LengthVariesM
HeaderSingle Response Mode0x01C1
HeaderSingle Response Mode Param0x01C2
HeaderApplication Parameters
- DatabaseIdentifierVariesC3
HeaderBody/End of BodyvCard objectC4

 流程图

2.3.3 vcf文件

        Download和Browsing功能描述完成之后,我们需要知道,所有的Phone Object信息都是来自于PSE端,而在PSE端保存Phone Object的方式或者是路径可能有很多;

  • 存储设备

    • 手机:telecom/xxx.vcf
    • SIM卡:SIM1/telecom/xxx.vcf

        无论是哪种存储方式,其对应都有相同的数据存储类型,例如通讯录、通讯记录,而在通讯记录中,又可以分为:来电、去电、未接来电、所有通讯记录。同时电话簿还提供了两个功能:快速拨号和收藏联系人;

上述描述的分类方式,对应了PSE端存储文件格式;

Phone ObjectASFormatDesc
Phone Book Objectpbpb.vcf通讯录
Incoming Calls History Objectichich.vcf来电通话记录
Outgoing Calls History Objectochoch.vcf去电通话记录
Missed Calls History Objectmchmch.vcf未接来电通话记录
Commbined Calls History Objectcchcch.vcf所有的通话记录
Speed-Dial Objectspdspd.vcf快速拨号
Favorite Contacts Objectfavfav.vcf收藏通讯录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/473617.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt笔记 事件处理_鼠标事件

什么是事件? 点击鼠标左键,双击鼠标左键,鼠标来回移动,按下键盘按钮,这些都是事件。 那么事件的响应机制是什么样的呢? 首先main函数中有一个QApplication,其作用是创建一个应用程序对象&…

11种创造型设计模式(下)

观察者模式 我们可以比喻观察者模式是一种类似广播的设计模式 介绍 观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象是Subject,依赖的对象是Observer,Subject通知Observer变化。 代码 说明: WeatherStat…

手撕算法-判断是不是二叉搜索树

题目描述 分析 二叉搜索树的特性就是中序遍历是递增序。既然是判断是否是二叉搜索树,那我们可以使用中序递归遍历。只要之前的节点是二叉树搜索树,那么如果当前的节点大于上一个节点值那么就可以向下判断。 如果有出现当前的节点小于上一个节点值&…

Host xxx1 has more disk space than database expected (xxx2 GB > xxx3 GB)

在nova-compute.log中有时会看到日志“Host xxx1 has more disk space than database expected (xxx2 GB > xxx3 GB)”类似日志。 查看下源码,如下: 分析: 定时任务更新主机资源到内存或者对象中,当执行检测的定时任务…

颠覆传统:Web3如何塑造未来的数字经济

引言 近年来,随着数字化时代的到来,互联网已经成为人们生活中不可或缺的一部分。然而,随着技术的不断发展和社会的不断变迁,传统的Web2模式逐渐显露出一些弊端,如数据垄断、隐私泄露等问题,这促使人们寻求…

Linux账号管理与ACL权限设置

文章目录 Linux的账户和用户组用户标识符:UID与GID用户账号用户组:有效与初始用户组groups,newgrp 账号管理新增与删除用户:useradd、相关配置文件、passwd、usermod、userdel用户功能:id、finger、chfn、chsh新增与删…

【文件操作和IO】

文件操作和IO 1.文件2. 硬盘上文件的目录结构3. 文件路径4. 文件重要分类:5. Java中操作文件5.1 Java对于文件操作的API5.2 Java中使用File类来进行文件操作5.3 File类属性5.4 构造方法5.5 方法: 6. 文件内容的读写 -- 文件流(数据流&#xf…

C++ List底层实现

文章目录 前言成员变量成员函数迭代器self& operator()前置self operator(int)后置self operator--()前置--self operator--(int)后置--bool operator!(const self & tmp)判断是否相等T* operator*() 解引用操作 list()初始化iterator begin()iterator end()const_iter…

视频无水印批量下载软件|抖音视频提取工具

视频无水印批量下载软件 在当今社交媒体充斥着大量优质视频内容的时代,很多用户都希望能够轻松下载自己喜爱的视频进行收藏或分享。为了满足用户的需求,我们特别推出了一款专业的视频无水印批量下载软件,让您可以方便快捷地获取喜爱的视频内容…

鸿蒙Harmony应用开发—ArkTS-转场动画(共享元素转场)

当路由进行切换时,可以通过设置组件的 sharedTransition 属性将该元素标记为共享元素并设置对应的共享元素转场动效。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 属性 名称参数参数描述…

springboot企业级抽奖项目业务二(用户模块)

书接上回,梅开二度 开发流程 该业务基于rouyi生成好了mapper和service的代码,现在需要在controller层写接口 实际操作流程: 看接口文档一>controller里定义函数一>看给出的工具类一>补全controller里的函数一>运行测试 接口…

练习 9 Web [SUCTF 2019]CheckIn (未拿到flag)

上传图片格式的木马文件&#xff1a; 返回 <? in contents!,存在PHP代码检测 上传非图片格式文件&#xff1a; 返回 不允许非image 修改木马PHP代码规避检测 <? ?> 改为 < script language“php”>< /script ><?php eval($_POST[shell]);?>…

鸿蒙实战开发:【相机和媒体库】

介绍 在ArkTS中调用相机拍照和录像&#xff0c;以及如何使用媒体库接口进行媒体文件的增、删、改、查操作。本示例用到了 权限管理能力相机模块能力接口图片处理接口音视频相关媒体业务能力接口媒体库管理接口设备信息能力接口文件存储管理能力接口弹窗能力接口 效果预览 首…

virtualBox镜像复制

镜像复制 有一个镜像后&#xff0c;图方便&#xff0c;想直接使用这个vdi文件&#xff0c;但vdi有个uuid值&#xff0c;同一个虚拟机中不能同时存在两个同样的uuid的介质的&#xff0c;普通的复制文件所得到的uuid是一样的 &#xff0c;所以需要用到自带的方法复制vdi文件&…

SpringCloud中的@EnableDiscoceryClient和@EnableFeignClients注解的作用解析、RPC远程过程调用

目录 EnableDiscoveryClient 服务发现的核心概念 服务注册中心 EnableDiscoveryClient注解的作用 服务心跳健康检查 使用示例 EnableFeignClients Feign简介 EnableFeignClients注解的作用 RPC&#xff08;Remote Procedure Call&#xff09; 参考链接 Spring Cloud…

Cache缓存:HTTP缓存策略解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Kotlin】扩展属性、扩展函数

1 类的扩展 Kotlin 提供了扩展类或接口的操作&#xff0c;而无需通过类继承或使用装饰器等设计模式&#xff0c;来为某个类添加一些额外的属性或函数&#xff0c;我们只需要通过一个被称为扩展的特殊声明来完成。通过这种机制&#xff0c;我们可以将那些第三方类不具备的功能强…

Gateway新一代网关

Gateway新一代网关 1、概述 ​ Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中都是采用的Zuul网关&#xff1b; ​ 但在2.x版本中&#xff0c;zuul的升级一直跳票&#xff0c;SpringCloud最后自己研发了一个网关SpringCloud Gateway替代Zuul。 ​ 官网&…

HarmonyOS/OpenHarmony应用开发-HDC环境变量设置

hdc&#xff08;HarmonyOS Device Connector&#xff09;是 HarmonyOS 为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在 windows/linux/mac 系统上与真实设备或者模拟器进行交互。 hdc 工具通过 HarmonyOS SDK 获取&#xff0c;存放于 /Huawei/Sdk/openhar…

责任链模式(处理逻辑解耦)

前言 使用设计模式的主要目的之一就是解耦&#xff0c;让程序易于维护和更好扩展。 责任链则是将处理逻辑进行解耦&#xff0c;将独立的处理逻辑抽取到不同的处理者中&#xff0c;每个处理者都能够单独修改而不影响其他处理者。 使用时&#xff0c;依次调用链上的处理者处理…