【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.3 同步通话记录

3.3.1 获取 All CCH Count

3.3.2 同步 All CCH


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.3 同步通话记录

3.3.1 获取 All CCH Count

同步所有的通话记录;

Request:

OBEX Protocol
    [Profile: PBAP (4)]
    [Current Path: /]
    .000 0011 = Opcode: Get (0x03)
    1... .... = Final Flag: True
    Packet Length: 72
    [Response in Frame: 566]
    Headers
        Connection Id: 1
            Header Id: Connection Id (0xcb)
                11.. .... = Encoding: 4 byte quantity (network order) (0x3)
                ..00 1011 = Meaning: Connection Id (0x0b)
            Connection ID: 1
        Name: "telecom/cch.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: 35
            Name: telecom/cch.vcf
        Type: "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: 22
            Type: x-bt/vcard-listing
        Application Parameters
            Header Id: Application Parameters (0x4c)
                01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)
                ..00 1100 = Meaning: Application Parameters (0x0c)
            Length: 7
            Parameter: Max List Count
                Parameter Id: Max List Count (0x04)
                Parameter Length: 2
                Max List Count: 0 (0x0000)
  • Name = "telecom/cch.vcf":代表了需要加载或访问的数据为所有通话记录;

  • Type = "x-bt/vcard-listing":获取感兴趣的Phone Object 列表;

  • Application Parameters

    • Parameter - Max List Count = 0:= 0的情况下,表明本次Request获取的是符合条件的所有信息的Count;

Response:

OBEX Protocol
    [Profile: PBAP (4)]
    [Current Path: /]
    .010 0000 = Response Code: Success (0x20)
    1... .... = Final Flag: True
    Packet Length: 15
    [Request in Frame: 562]
    Headers
        Connection Id: 1
            Header Id: Connection Id (0xcb)
                11.. .... = Encoding: 4 byte quantity (network order) (0x3)
                ..00 1011 = Meaning: Connection Id (0x0b)
            Connection ID: 1
        Application Parameters
            Header Id: Application Parameters (0x4c)
                01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)
                ..00 1100 = Meaning: Application Parameters (0x0c)
            Length: 7
            Parameter: Phonebook Size
                Parameter Id: Phonebook Size (0x08)
                Parameter Length: 2
                Phonebook Size: 1631 (0x065f)
  • Phonebook Size = 1631:代表所有的通话记录信息为1631条;

3.3.2 同步 All CCH

Request:

OBEX Protocol
    [Profile: PBAP (4)]
    [Current Path: /]
    .000 0011 = Opcode: Get (0x03)
    1... .... = Final Flag: True
    Packet Length: 71
    [Response in Frame: 578]
    Headers
        Connection Id: 1
            Header Id: Connection Id (0xcb)
                11.. .... = Encoding: 4 byte quantity (network order) (0x3)
                ..00 1011 = Meaning: Connection Id (0x0b)
            Connection ID: 1
        Name: "telecom/cch.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: 35
            Name: telecom/cch.vcf
        Type: "x-bt/phonebook"
            Header Id: Type (0x42)
                01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)
                ..00 0010 = Meaning: Type (0x02)
            Length: 18
            Type: x-bt/phonebook
        Application Parameters
            Header Id: Application Parameters (0x4c)
                01.. .... = Encoding: Byte sequence, length prefixed with 2 byte Unsigned Integer (0x1)
                ..00 1100 = Meaning: Application Parameters (0x0c)
            Length: 10
            Parameter: Max List Count
                Parameter Id: Max List Count (0x04)
                Parameter Length: 2
                Max List Count: 50 (0x0032)
            Parameter: Format
                Parameter Id: Format (0x07)
                Parameter Length: 1
                Format: 3.0 (0x01)
  • Name = "telecom/cch.vcf":被访问加载的数据文件路径;

  • Type = "x-bt/phonebook":同步通话记录;

  • Application Parameters

    • Parameter - Max List Count = 50:本次Request需要同步的最大的信息数
    • Parameter - Format:版本格式为3.0格式;

Response:

Frame 578: 61 bytes on wire (488 bits), 61 bytes captured (488 bits)
Bluetooth
    [Source: HuaweiDe_42:c7:dd (30:aa:e4:42:c7:dd)]
    [Destination: BarrotTe_50:67:20 (04:7f:0e:50:67:20)]
Bluetooth HCI H4
    [Direction: Rcvd (0x01)]
    HCI Packet Type: ACL Data (0x02)
Bluetooth HCI ACL Packet
    .... 0000 0000 0010 = Connection Handle: 0x002
    ..10 .... .... .... = PB Flag: First Automatically Flushable Packet (2)
    00.. .... .... .... = BC Flag: Point-To-Point (0)
    Data Total Length: 56
    Data
    [Connect in frame: 109]
    [Source BD_ADDR: HuaweiDe_42:c7:dd (30:aa:e4:42:c7:dd)]
    [Source Device Name: dupz]
    [Source Role: Slave (2)]
    [Destination BD_ADDR: BarrotTe_50:67:20 (04:7f:0e:50:67:20)]
    [Destination Device Name: HAVAL_6720]
    [Destination Role: Master (1)]
    [Last Role Change in Frame: 107]
    [Current Mode: Active Mode (0)]
    [Last Mode Change in Frame: 564]
Bluetooth L2CAP Protocol
    Length: 52
    CID: Dynamically Allocated Channel (0x0041)
    [Connect in frame: 178]
    [PSM: RFCOMM (0x0003)]
Bluetooth RFCOMM Protocol
    Address: E/A flag: 1, C/R flag: 0, Direction: 0, Channel: 19
        1001 10.. = DLCI: 0x26 (Direction: 0, Channel: 19)
            1001 1... = Channel: 19
            .... .0.. = Direction: 0x0
        .... ..0. = C/R Flag: Response (0x0)
        .... ...1 = EA Flag: Last field octet (0x1)
    Control: Frame type: Unnumbered Information with Header check (UIH) (0xef), P/F flag: 1
        ...1 .... = P/F flag: 0x1
        111. 1111 = Frame type: Unnumbered Information with Header check (UIH) (0xef)
    Payload length: 47
    Credits: 1
    Frame Check Sequence: 0xe1
OBEX Protocol
    [Profile: PBAP (4)]
    [Current Path: /]
    [8 OBEX Fragments (6977 bytes): #569(990), #570(990), #571(990), #572(990), #573(990), #574(990), #576(990), #578(47)]
        [Frame: 569, payload: 0-989 (990 bytes)]
        …………………………
        [Frame: 578, payload: 6930-6976 (47 bytes)]
        [Fragment count: 8]
        [Reassembled OBEX length: 6977]
    .010 0000 = Response Code: Success (0x20)
    1... .... = Final Flag: True
    Packet Length: 6977
    [Request in Frame: 567]
    Headers
        Connection Id: 1
            Header Id: Connection Id (0xcb)
                11.. .... = Encoding: 4 byte quantity (network order) (0x3)
                ..00 1011 = Meaning: Connection Id (0x0b)
            Connection ID: 1
        End Of Body
            Header 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: 6969
            Value: 424547494e3a56434152440d0a56455253494f4e3a332e30…
    Line-based text data: x-bt/phonebook (350 lines)
        BEGIN:VCARD\r\n
        VERSION:3.0\r\n
        FN:\r\n
        N:\r\n
        TEL;TYPE=0:03511008611\r\n
        X-IRMC-CALL-DATETIME;TYPE=DIALED:20220609T145831\r\n
        END:VCARD\r\n
        BEGIN:VCARD\r\n
        VERSION:3.0\r\n
        FN:\r\n
        N:\r\n
        TEL;TYPE=0:03511008611\r\n
        X-IRMC-CALL-DATETIME;TYPE=DIALED:20220609T143109\r\n
        END:VCARD\r\n
        BEGIN:VCARD\r\n
        VERSION:3.0\r\n
        FN:\r\n
        N:\r\n
        TEL;TYPE=0:131xxxxxxxx\r\n
        X-IRMC-CALL-DATETIME;TYPE=RECEIVED:20220608T184054\r\n
        END:VCARD\r\n
        BEGIN:VCARD\r\n
        VERSION:3.0\r\n
        FN:\r\n
        N:\r\n
        TEL;TYPE=0:03511008611\r\n
        X-IRMC-CALL-DATETIME;TYPE=DIALED:20220608T092034\r\n
        END:VCARD\r\n
        ……………………
        BEGIN:VCARD\r\n
        VERSION:3.0\r\n
        FN;CHARSET=UTF-8:中通快递\r\n
        N;CHARSET=UTF-8:中通快递\r\n
        TEL;TYPE=0:95720\r\n
        X-IRMC-CALL-DATETIME;TYPE=DIALED:20220606T142440\r\n
        END:VCARD\r\n
        BEGIN:VCARD\r\n
        VERSION:3.0\r\n
        FN;CHARSET=UTF-8:中通快递\r\n
        N;CHARSET=UTF-8:中通快递\r\n
        TEL;TYPE=0:95720\r\n
        X-IRMC-CALL-DATETIME;TYPE=MISSED:20220606T141702\r\n
        END:VCARD\r\n
        ……………………

        在本次的Response中,一共返回了50组通话记录信息,对应了Request中的MaxListCount = 50;

        我们发现,在这50组信息中,有很多相同的来电或者是去电信息,他们以发生的时间节点作为唯一标识;

BEGIN:VCARD\r\n
VERSION:3.0\r\n
FN:\r\n
N:\r\n
TEL;TYPE=0:03511008611\r\n
X-IRMC-CALL-DATETIME;TYPE=DIALED:20220609T145831\r\n
END:VCARD\r\n

  • BEGIN:VCARD:一组通话记录信息开始标志

  • END:VCARD:结束标志

  • VERSION:版本

  • N:姓名,现在的这组信息中为空,因为在一般情况下,我们手机中保存的联系人来电时,会提示Name Info,如果是陌生号码,一般直接显示电话号码,无法显示Name Info,但是存在一种情况:公共类型的电话号码是默认支持的,例如外卖、快递、中国移动、中国联通类似性质的号码是无需备注,来电时可以直接显示Name;

    • CHARSET=UTF-8:针对中文Name,采用UTF-8的编码方式
  • TEL;TYPE=0:联系人联系方式

  • X-IRMC-CALL-DATETIME:发生的时间点

  • X-IRMC-CALL-DATETIME;TYPE:通话记录类型

    • TYPE=DIALED:拨号,去电
    • TYPE=RECEIVED:来电
    • TYPE=MISSED:未接​​​​​​​

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

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

相关文章

Day02-DDLDMLDQL(定义,操作,查询)(联合查询,子查询,字符集和校对集,MySQL5.7乱码问题)

文章目录 Day02-DDL&DML和DQL学习目标1. SQL语言的组成2. DDL2.1 数据库结构2.2 表结构2.3 约束2.3.1 主键约束(重要)(1)特点(2) 添加主键(3)删除主键(了解) 2.3.2 自增约束(1)特点(2) 添加自增约束(3)删除自增约束(了解) 2.3.3 非空约束(1)添加非空约束(2) 删除非空约束 2…

day01_mysql数据类型和运算符_课后练习 - 参考答案

文章目录 day01_mysql_课后练习第1题第2题第3题第4题第5题 day01_mysql_课后练习 第1题 案例: 1、创建数据库day01_test01_library 2、创建表格books 字段名字段说明数据类型允许为空唯一b_id书编号int(11)否是b_name书名varchar(50)否否…

OLAP数据库选型指南:Doris与ClickHouse的深入对比与分析

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 在当今数据驱动的时代,数据的存储、处理和分析变得尤为重要。为了满足这一需求,市场上涌现出了许多优秀的…

FPGA Vivado环境下实现D触发器

题目要求:使用Verilog HDL语言设计一个D触发器。请提交程序源代码和Word格式的作业文档,作业文档中应给出程序源代码及RTL分析原理图。 D触发器的工作原理: 初始状态下,触发器处于复位状态,输出为复位信号的稳定状态…

Linux笔试题

1. 程序代码如下,请按执行顺序写出输出结果: int main() { pid_t pid1,pid2;if((pid1fork()) 0) {sleep(3);printf(“info1 from child process_1\n”);exit(0);printf(“info2 from child process_1\n”); } else {if((pid2fork()) 0){sleep(1);printf(“i…

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

力扣刷题-砖墙题554

砖墙题 这题一开始没有想到思路&#xff0c;一开始还想着用枚举法做/笑哭 后来看了题解&#xff0c;原来就是哈希表的题目呀。 说到哈希表&#xff0c;这里有个八股需要记一下&#xff1a; HashMap和HashTable的区别 线程是否安全&#xff1a;HashMap线程不安全 HashTable线…

[综述笔记]Flexible large-scale fMRI analysis: A survey

论文网址&#xff1a;Flexible large-scale fMRI analysis: A survey | IEEE Conference Publication | IEEE Xplore 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff0…

力扣热门算法题 56. 合并区间,57. 插入区间,58. 最后一个单词的长度v

56. 合并区间&#xff0c;57. 插入区间&#xff0c;58. 最后一个单词的长度&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.20 可通过leetcode所有测试用例。 目录 56. 合并区间 解题思路 完整代码 Python Java ​编辑 5…

【自然语言处理】NLP入门(八):1、正则表达式与Python中的实现(8):正则表达式元字符:.、[]、^、$、*、+、?、{m,n}

文章目录 一、前言二、正则表达式与Python中的实现1、字符串构造2、字符串截取3、字符串格式化输出4、字符转义符5、字符串常用函数6、字符串常用方法7、正则表达式1. .&#xff1a;表示除换行符以外的任意字符2. []&#xff1a;指定字符集3. ^ &#xff1a;匹配行首&#xff0…

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题&#xff0c;原本打算在代码中自己写一个类去管理将打印信息收集到log日志中&#xff0c;忽然想到&#xff0c;其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test&#xff0c;并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…

基于Java中的SSM框架实现高校毕业设计管理系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现高校毕业设计管理系统演示 摘要 现代学校的教学规模逐渐增加&#xff0c;需要处理的信息量也在增加。每年毕业&#xff0c;将会有大量的毕业设计要处理。传统的毕业设计管理方法已不能满足师生的需求。教师和学生需要一个简单方便的系统来取代传统的机…

FPGA学习_Xilinx7系列FPGA基本结构

文章目录 前言一、7系列FPGA介绍1.1、芯片编号 二、基本组成单元2.1、可编程逻辑块CLB&#xff08;Configable Logic Block&#xff09;2.2、可编程输入输出单元&#xff08;IOB&#xff09;2.3、嵌入式块RAM&#xff08;Block RAM&#xff09;2.4、底层内嵌功能单元2.5、内嵌专…

【2】华为交换机如何修改Web登录密码?

0x01 问题描述 如果忘记了Web登录密码或者希望修改Web登录密码&#xff0c;用户可以通过Console口、STelnet或Tenet等方式登录交换机后设置新的Web登录密码。 使用Telnet协议存在安全风险&#xff0c;建议使用Console囗或STelnet V2登录设备 0x02 问题解决 <HUAWEI> s…

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…

线段树优化dp

abc339 E - Smooth Subsequence 思路&#xff1a;我们很容想到一个 n n n方的的状态转移方程&#xff0c;即对于每个i&#xff0c;我们去枚举 1 1 1到 i − 1 i-1 i−1的状态&#xff0c;即 d p [ i ] m a x ( d p [ i ] , d p [ j ] 1 ) ; dp[i]max(dp[i],dp[j]1); dp[i]ma…

Vue字符串里的中文数字转换为阿拉伯数字

js字符串里的中文数字转换为数字 <template><view><view><view class"inpbox" ><textarea v-model"voiceMane" input"convert" ></textarea></view></view></view> </template> &…

3.7 RK3399项目开发实录-板载OpenWRT系统的使用(wulianjishu666)

STM32F103单片机从零到项目开发程序实例 下载链接&#xff1a;https://pan.baidu.com/s/1dWNskNinrMk4bxaE-jgHhQ?pwdymn3 1. OpenWRT 手册 1.1. 支持设备列表 主控板卡型号RK3568ROC-RK3568-PC/Station-P2 1.2. 登录 IP 、登录密码和 WIFI 名称 固件默认登录 IP 为 192.1…

Linux Ncurses库部分函数使用说明

目录 1. initscr&#xff08;&#xff09;函数 2. endwin&#xff08;&#xff09;函数 3. curs_set()函数 4.noecho()函数 5. keypad()函数 6. start_color()函数 7.init_pair()函数 8.getch()函数 9.move()函数 10.addch()函数 11. refresh()函数 12.inch()函数…

【Linux 进程概念】

【Linux 进程概念】 冯诺依曼体系结构冯诺依曼结构简要解释&#xff1a;你用QQ和朋友聊天时数据的流动过程 操作系统(OperatorSystem)概念设计OS的目的定位操作系统的上下层都分别是什么如何理解“管理"总结 进程基本概念描述进程-PCBtask_ struct内容 组织进程查看进程通…