蓝牙 Pbap源码分析

越来越多的车载系统、智能手表、智能手环等采用Android系统,Phone Book Access Profile 简称Pbap,是用于两个设备之间传递电话薄的协议。

通过查阅资料,通常实现方法主要有如下两种:

(1)通过BluetoothSocket与PSE端建立连接,然后,根据Pbap SPEC实现命令的组装与解析,进而完成相应的功能。

参考链接:https://www.cnblogs.com/wangzehuaw/p/3806773.html

                 https://blog.csdn.net/bin_linux96/article/details/89002312

(2)利用BluetoothPbapClient类来实现功能。--》这个类帮助我们实现了(1)中的功能,我们只需要与PSE建立连接即可。

这一部分的网上资料较少,本文主要对这一部分进行描述。

先说一下实现思路,

a、扫描,并判断是否是自己想用连接的设备;

b、对目标设备发起配对;

c、配对成功后,发起PbapClient Profile的连接。

思路讲解完成了,可以离开本文自己去实现了(自己查资料或者看源码),不一定继续阅读下文了哈~

接下来的内容:

1、PSE源码粗略分析

2、PCE源码粗略分析

3、PCE应用层实现

 

1、PSE源码粗略分析

蓝牙打开过程中,会启动BluetoothPbapService,该service启动后创建obexServerSocket。

蓝牙 Pbap源码分析_第1张图片

BluetoothPbapService.java

监听了如下三个广播,

含义分别如下:

1、

2、

3、

Pbap server状态机,一共有三个状态,分别为:WatingForAuth,Connected,Finished.

BluetoothPbapActivity用于展示client与server建立连接前的用户交互,如下所示。那什么时候会启动该Activity呢?当然是需要用户确认client pbap request的时候啦。

 

BluetoothPbapVcardManager.java提供了获取PB,ich,och,mch,cch等对象的方法。数据是从哪里获取来的呢?是从电话记录数据库中获取到的,数据库url为CallLog.calls.CONTENT_URI。

BluetoothPbapObexServer.java中维护了一个BluetoothPbapVcardManager对象,在BluetoothPbapObexServer接收到client端的调用后,通过BluetoothPbapVcardManager对象获取对应的数据,返回给client端(通过obex body stream进行发送)。

2、PCE源码粗略分析

应用层通过Pbap Client Profile建立对目标设备的连接,

蓝牙 Pbap源码分析_第2张图片

调到PbapClientSerivice.java中,创建PbapClientStateMachine对象,并调用其start()方法。

蓝牙 Pbap源码分析_第3张图片

PbapClientStateMachine创建后就进入connectiong状态机中。

蓝牙 Pbap源码分析_第4张图片

 

BluetoothPbap client端状态机:

蓝牙 Pbap源码分析_第5张图片

Connecting状态下,注册sdp广播接收者,然后查询设备支持的service,在搜索到完成查询后,在接收的广播中判断该设备是否支持PSE UUID,如果支持则发送MSG_DSP_COMPLETE消息出来,然后在该消息处理中发送MSG_CONNECT到PbapClientConnectionHandler中,PbapClientConnectionHandler创建socket以及obex session。

蓝牙 Pbap源码分析_第6张图片

 

蓝牙 Pbap源码分析_第7张图片

PbapClientConnectionHandler.java

蓝牙 Pbap源码分析_第8张图片

上面操作都成功后,client状态机即转移到Connected状态。

进入Connected状态后,直接发送了MSG_DOWNLOAD消息到handler中。

蓝牙 Pbap源码分析_第9张图片

 

蓝牙 Pbap源码分析_第10张图片

发送命令,然后接着读取结果。

蓝牙 Pbap源码分析_第11张图片

3、PCE应用层实现

这一部分先欠着吧~大过年的,在家里调试不方便~

加油武汉,加油中国,新型冠状病毒肺炎快走吧~

在家闷死了~

 

你可能感兴趣的:(物联技术)