【Android】【Bluetooth Stack】蓝牙电话本协议之同步通讯录分析(超详细)

本文主要是介绍【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协议栈

3. PBAP协议数据包分析

3.1 同步通讯录

3.1.1 获取联系人数量 - telecom

3.1.2 获取联系人数量 - SIM1/telecom


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链路发送数据;

3. PBAP协议数据包分析

        在PBAP协议同步通讯录和通讯记录中,都是基于OBEX协议实现的,PBAP协议作为了应用层协议;

3.1 同步通讯录

3.1.1 获取联系人数量 - telecom

Request:

Frame 485: 84 bytes on wire (672 bits), 84 bytes captured (672 bits)
…………………………
OBEX Protocol[Profile: PBAP (4)][Current Path: /].000 0011 = Opcode: Get (0x03)1... .... = Final Flag: TruePacket Length: 70[Response in Frame: 489]HeadersConnection Id: 1Header Id: Connection Id (0xcb)11.. .... = Encoding: 4 byte quantity (network order) (0x3)..00 1011 = Meaning: Connection Id (0x0b)Connection ID: 1Name: "telecom/pb.vcf"Header Id: Name (0x01)00.. .... = Encoding: Null terminated Unicode text, length prefixed with 2 byte Unsigned Integer (0x0)..00 0001 = Meaning: Name (0x01)Length: 33Name: telecom/pb.vcfType: "x-bt/vcard-listing"Header Id: Type (0x42)01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)..00 0010 = Meaning: Type (0x02)Length: 22Type: x-bt/vcard-listingApplication ParametersHeader Id: Application Parameters (0x4c)01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)..00 1100 = Meaning: Application Parameters (0x0c)Length: 7Parameter: Max List CountParameter Id: Max List Count (0x04)Parameter Length: 2Max List Count: 0 (0x0000)
  • Profile:PBAP (4),上层应用层协议为PBAP,OBEX协议的上层应用层协议除了PBAP,还有OPP、MAP协议;

  • Opcode:操作码,Get (0x03),即Request对应的code为Get;

  • Packet Length:70

  • Response in Frame:该request frame-485对应的Response frame为489;

  • Header - Connection Id = 1:PBAP连接指令中PSE回复的连接ID 号;

  • Header - Name = "telecom/pb.vcf":代表了访问的通讯录路径;

  • Header - Type = "x-bt/vcard-listing":代表了该Request对应的Function为PullvCardListing;

  • Header - Application Parameters

    • Parameter Id = 0x04:该ID 对应了Max List Count
    • Parameter - Max List Count = 0:在MaxListCount = 0 的情况下,Response返回的PhonebookSize为Name对应路径下所有通讯人的Count;

Response:

Frame 489: 29 bytes on wire (232 bits), 29 bytes captured (232 bits)
………………………………
OBEX Protocol[Profile: PBAP (4)][Current Path: /].010 0000 = Response Code: Success (0x20)1... .... = Final Flag: TruePacket Length: 15[Request in Frame: 485]HeadersConnection Id: 1Header Id: Connection Id (0xcb)11.. .... = Encoding: 4 byte quantity (network order) (0x3)..00 1011 = Meaning: Connection Id (0x0b)Connection ID: 1Application ParametersHeader Id: Application Parameters (0x4c)01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)..00 1100 = Meaning: Application Parameters (0x0c)Length: 7Parameter: Phonebook SizeParameter Id: Phonebook Size (0x08)Parameter Length: 2Phonebook Size: 102 (0x0066)
  • Response Code:Success

  • Header - Connection Id = 1:对应了上述Request 的Connection Id;

  • Header - Application Parameters

    • Parameter Id = 0x08:该Id代表了Phonebook Size
    • Parameter - Phonebook Size = 102:代表了Name对应telecom/pb.vcf的总数

3.1.2 获取联系人数量 - SIM1/telecom

Request:

OBEX Protocol[Profile: PBAP (4)][Current Path: /].000 0011 = Opcode: Get (0x03)1... .... = Final Flag: TruePacket Length: 80[Response in Frame: 492]HeadersConnection Id: 1Header Id: Connection Id (0xcb)11.. .... = Encoding: 4 byte quantity (network order) (0x3)..00 1011 = Meaning: Connection Id (0x0b)Connection ID: 1Name: "SIM1/telecom/pb.vcf"Header Id: Name (0x01)00.. .... = Encoding: Null terminated Unicode text, length prefixed with 2 byte Unsigned Integer (0x0)..00 0001 = Meaning: Name (0x01)Length: 43Name: SIM1/telecom/pb.vcfType: "x-bt/vcard-listing"Header Id: Type (0x42)01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)..00 0010 = Meaning: Type (0x02)Length: 22Type: x-bt/vcard-listingApplication ParametersHeader Id: Application Parameters (0x4c)01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)..00 1100 = Meaning: Application Parameters (0x0c)Length: 7Parameter: Max List CountParameter Id: Max List Count (0x04)Parameter Length: 2Max List Count: 0 (0x0000)

  • Header - Name = "SIM1/telecom/pb.vcf":访问路径为SIM卡中的联系人总数;
  • Parameter - Max List Count = 0:获取SIM中联系人总数;

Response:

OBEX Protocol[Profile: PBAP (4)][Current Path: /].010 0000 = Response Code: Success (0x20)1... .... = Final Flag: TruePacket Length: 11[Request in Frame: 490]HeadersConnection Id: 1Header Id: Connection Id (0xcb)11.. .... = Encoding: 4 byte quantity (network order) (0x3)..00 1011 = Meaning: Connection Id (0x0b)Connection ID: 1End Of BodyHeader Id: End Of Body (0x49)01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)..00 1001 = Meaning: End Of Body (0x09)Length: 3Value: <MISSING>
  • End or Body:

    • MaxListCount != 0:返回Name对应的数据,回复数据中的vCard对象只应包含使用属性选择器Attribute Selector参数指示的属性,并且应使用格式Format参数指示的格式组装数据;
    • MaxListCount == 0:直接返回,代表没有获取的数据;

这篇关于【Android】【Bluetooth Stack】蓝牙电话本协议之同步通讯录分析(超详细)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829415

相关文章

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

将sqlserver数据迁移到mysql的详细步骤记录

《将sqlserver数据迁移到mysql的详细步骤记录》:本文主要介绍将SQLServer数据迁移到MySQL的步骤,包括导出数据、转换数据格式和导入数据,通过示例和工具说明,帮助大家顺利完成... 目录前言一、导出SQL Server 数据二、转换数据格式为mysql兼容格式三、导入数据到MySQL数据

Redis的Zset类型及相关命令详细讲解

《Redis的Zset类型及相关命令详细讲解》:本文主要介绍Redis的Zset类型及相关命令的相关资料,有序集合Zset是一种Redis数据结构,它类似于集合Set,但每个元素都有一个关联的分数... 目录Zset简介ZADDZCARDZCOUNTZRANGEZREVRANGEZRANGEBYSCOREZ

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

springboot整合gateway的详细过程

《springboot整合gateway的详细过程》本文介绍了如何配置和使用SpringCloudGateway构建一个API网关,通过实例代码介绍了springboot整合gateway的过程,需要... 目录1. 添加依赖2. 配置网关路由3. 启用Eureka客户端(可选)4. 创建主应用类5. 自定