越来越多的车载系统、智能手表、智能手环等采用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。
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建立对目标设备的连接,
调到PbapClientSerivice.java中,创建PbapClientStateMachine对象,并调用其start()方法。
PbapClientStateMachine创建后就进入connectiong状态机中。
BluetoothPbap client端状态机:
Connecting状态下,注册sdp广播接收者,然后查询设备支持的service,在搜索到完成查询后,在接收的广播中判断该设备是否支持PSE UUID,如果支持则发送MSG_DSP_COMPLETE消息出来,然后在该消息处理中发送MSG_CONNECT到PbapClientConnectionHandler中,PbapClientConnectionHandler创建socket以及obex session。
PbapClientConnectionHandler.java
上面操作都成功后,client状态机即转移到Connected状态。
进入Connected状态后,直接发送了MSG_DOWNLOAD消息到handler中。
发送命令,然后接着读取结果。
3、PCE应用层实现
这一部分先欠着吧~大过年的,在家里调试不方便~
加油武汉,加油中国,新型冠状病毒肺炎快走吧~
在家闷死了~