BlueTooth Phone Book Access Profile Client  V1.0

一.  简介:

此功能具体使用的是bluetoothV2.1之后的Phone Book Access Profile功能,简称PBAP .目前MTK Android中只实现了server端的功能,并没有实现client.所以该文档简略介绍了如何开发一个简易client.并在最后给出一个测试用的demo.下面就按照客户端的开发流程来说明.

二.  前提设置:

本处介绍执行PBAP之前的蓝牙需要的一些操作.其包括开启和搜索.

首先在manifest中加入权限

<uses-permissionandroid:name="android.permission.BLUETOOTH"/>

<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN"/>

判断是否开启

private BluetoothAdaptermBluetoothAdapter;

if (null ==mBluetoothAdapter) {

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

}

if (!mBluetoothAdapter.isEnabled()) {

mStatus = CLOSE;

else {

mStatus = OPEN;

}

如果未开启,则执行开启

Intent startBluetoothIntent = new Intent(

BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(startBluetoothIntent, 1001 ); //1001 = BT OPEN

执行完开启后在onActivityResult中取收取反馈

protected void onActivityResult(int requestCode,int resultCode, Intent data) {

if (requestCode ==1001) { //1001 = BT OPEN

if (resultCode ==RESULT_OK) {

mBtStatus.setCurrStatus(BtStatus.OPEN);

else {

//在打开时的dialog中选择取消也会反馈到这里

mBtStatus.setCurrStatus(BtStatus.OPEN_FAILED);

}

}

}

反馈中接受为OK的话,下一步可以开始搜索附近蓝牙设备

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

mBluetoothAdapter.startDiscovery();

搜索的时候需要监听下面几个action

IntentFilter iFilter = new IntentFilter();

iFilter.addAction(BluetoothDevice.ACTION_FOUND);

iFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);

在定义的BroadCast中存储搜索到的BLUETOOTH_DEVICE

BluetoothDevice bluetoothDevice = intent

.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);

搜索的时候可以取消,相关函数为

mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

mBluetoothAdapter. cancelDiscovery ();

三.  蓝牙的配对连接

//此处的UUID是协议中规定的.这样才能访问server端的pbap服务.

//在spec中未看到.但是查阅了蓝牙的UUID相关中有发现这个条目

//同0X1103

MY_UUID = UUID.fromString("0000112f-0000-1000-8000-00805f9b34fb");

//api中提供的安全连接方法

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID);

//连接函数.此为broken方法,需要放入thread中取处理

socket.connect();

SPEC中描述2个设备中需要GAP认证建立安全连接.本处使用SDK中提供的

//此处的UUID是协议中规定的.这样才能访问server端的pbap服务.

//在spec中未看到.但是查阅了蓝牙的UUID相关中有发现这个条目

//同0X1103

MY_UUID = UUID.fromString("0000112f-0000-1000-8000-00805f9b34fb");

//api中提供的安全连接方法

BluetoothSocket socket = device.createRfcommSocketToServiceRecord(MY_UUID);

//连接函数.此为broken方法,需要放入thread中取处理

socket.connect();

上面的步骤操作完之后,服务端和客户端都会弹出一个配对对话框.在双方都配对成功后.服务端又会弹出一个是否允许对方获取联系人的确认.在对方确认后.socket.connect才执行完成.

上面整了这么多.其实都是前期的必须操作.至此2台手机连接上了.并建立了PBAP连接.

四.  PhoneBook DownLoad Feature

下面开始操作server端电话本下载功能.在spec中的功能流程图如下

下面分开说明这些步骤:

1.      PCE建立和PSE的连接

先声明此处的连接跟前一节说的连接是两回事.前一节是2台机器建立蓝牙连接

此处为OBEX的连接.

client请求数据包格式

Client request 解释:

80      op

001f     整个数据包长度

10      OBEX版本,始终10

00      flags始终00

2000    数据包的最大长度2k

下面7-n为header关于header请查看obex spec

46      target

0013    target header的长度

796135f0f0c511d809660800200c9a66 此处不知道哪里来的.但就是这个

c3      length

0000f483 length值

现在发现connect的时候.这串字符串是不需要变得.肯定是这个

server反馈数据包格式

Server response 解释:

这个是随意找了一台手机做的测试结果.不过一般都相差不大.关键点connect id

a0     response code(只有a0为成功,其他都为各式各样的错误)

001f   长度

10     obex 版本

00     flags

4bc8   最大数据包长度

下面都是header信息.关于header请查看obex spec

Cb      connect id(关键.很重要)

00000007connect id value(这个值需要存储下来.下面会用的到)

4a    who

0013  who的长度

796135f0f0c511d809660800200c9a660000000 who的值(跟上面的target是一样的)

判断完response code为a0 就可以操作下一步了.

2.      PCE下载联系人

PCE下载联系人需要用到的是GET方法.

在OBEX中GET方法如下定义

在PBAP SPEC中定义了如下的要求

按照上图描述.数据组织如下

83   get(也可以为03)

004f  整个数据包的长度.最后手动计算得出

Cb   connect id

00000007  此处就为上面connect方法执行完成之后得到的数据.

01    name

0021  name的长度

00740065006c00650063006f006d002f00700062002e0076006300660000

上面为telecom/pb.vcf的unicode码.结尾必须要0000收尾.对于name在obex中定义必须要用unicode来处理.这个字串表示取到对方手机存储中所有的联系人.

42    type

0012  type的长度

782d62742f70686f6e65626f6f6b00  为x-bt/phonebook 结尾必须用00.此处

4c    app params

0014  app params 的长度

06    此处为pbap自定义,表示vcardfilter

08    8位

0000000000000000  64位掩码.需要的话请看spec.全为0,则返回所有的

07    vcard 版本

01    长度

01    01= 3.1  00 = 2.0

04    maxlistcount 取多少个

02    长度

Ffff    ffff表示取所有的.

此处的例子说明的是取对方联系人中手机内纯中所有的.

maxlistcount的参数并没有做测试.也不知道设置了在此处是否有用.

vcard的版本,服务端是会同时定义好2.0和3.1的vcardbuilder的,这个是协议中要求的.所有对于客户端具体我们想要用那个,视我们用那个vard praser来决定.

Filter其实很有用.规定了我们取哪些数据回来.毕竟如果服务端的联系人都有头像之类的.我们要是全取回来.要考虑下速度的问题了

ListStartOffset,改例子取全部.所有这个参数都没传过去.默认就为0.

server反馈数据包格式

此处没有存数据.暂时没有例子.分析也同上

Response code必须要为a0才能继续解析

Header中的解析到body或者end of body的话.则根据length,把这段buffer存储下来.直接保存到vcf文件中就行了.当然.如果code中实现了vcard praser,则可以直接去解析并载入到联系人数据库中.

顺便说明下:对于PBAP.MTK不支持calllog的处理.其他的spec中有的都支持.

3.      虚线处表示可此处循环.

此处不做详细解释.可以查看pbap spec中虚拟文件夹这一块.此处的功能可以单独下载server端1个或者几个联系人.

要实现此处功能.最好也先了解下phonebook browser的功能.

4.      PCE终端跟PSE的连接

调用OBEX的disconnect功能就可以了.目前代码未实现

android Pbap下载手机电话簿协议介绍相关推荐

  1. win10 android软件下载,手机Win10安卓桌面

    Win10安卓桌面是一款以WIN10作为样式所制作的桌面软件,让用户能够在自己的安卓手机上面体验到使用WIN10的感觉,不仅仅只是桌面的样式上面而且是在使用个的体验上面也是具有着相同的感觉,如果你需要 ...

  2. Android系统下载管理DownloadManager功能介绍及使用示例

    一.DownloadManager简单介绍 DownloadManager是系统开放给第三方应用使用的类,包含两个静态内部类DownloadManager.Query和DownloadManager. ...

  3. ANDROID 系统下载

    从Android 2.3(API level 9)开始Android用系统服务(Service)的方式提供了Download Manager来优化处理长时间的下载操作.Download Manager ...

  4. Android系统下载管理DownloadManager

    转载: http://www.trinea.cn/android/android-downloadmanager/ http://www.trinea.cn/android/android-downl ...

  5. android版 点击下载,暴雪游戏手机安全令Android版下载与使用说明

    全新设计的手机安全令已正式上线!界面更加优美,更具现代气息.此外,每次载入数字密码时,都可以看到暴雪系列游戏的主题画作. 当您使用暴雪游戏手机安全令时,我们强烈建议您同时添加暴雪游戏短信安全保护服务. ...

  6. android手机防盗图片,android手机防盗措施介绍【图文】

    android翻译成中文就是安卓的意思,所以标题中所说的就是安卓系统手机的防盗措施问题.其实手机隐私对我们来说非常重要,现在手机功能越来越齐全,手机内存储包含的信息业非常多.如果手机一旦丢失,很有可能 ...

  7. [Android] DownloadManager下载管理类2.3新增API介绍

    从Android 2.3开始新增了一个下载管理类,在SDK的文档中我们查找android.app.DownloadManager可以看到.下载管理类可以长期处理多个HTTP下载任务,客户端只需要给出请 ...

  8. android手游开发三维地图高清版,三维地图实景地图下载手机

    三维地图实景地图下载手机这是一款非常实用的地图导航软件,用户可以通过这款的站看到各种高清的街景,山地,这个地图每年都会更新,无论用户出门去哪里,都可以使用这个地图软件快速的为你导航,这款容量会最快选取 ...

  9. Android手机凡客项目介绍

    Android手机凡客项目介绍 凡客诚品Android客户端是凡客诚品专为Android用户免费定制的购物软件,它与凡客网上万产品库对接,拥有商品搜索.浏览.收藏.查物流.购物车等功能,保持用户的体验 ...

  10. steam android app,steam手机客户端下载

    steam app是适用于移动设备的国际游戏平台Steam手机客户端,你现在可以用手机随时随地加入到Steam社区中去,玩游戏应该没有人不知道Steam吧,像很多很好玩的PC游戏都可以在Steam上购 ...

最新文章

  1. python语言入门w-python基础知识(一)
  2. ntfs分区对linux的局限,如何使Linux支持NTFS分区
  3. SAP中过账码or记账码posting code
  4. LeetCode 92. Reverse Linked List II
  5. 【电设控制与图像训练题】【激光打靶】【opencv测试代码以及效果】
  6. python语言浮点数可以不带小数部分吗_python 浮点数四舍五入需要注意的地方
  7. android区域截图app,【干货】最新App应用市场截图尺寸大全
  8. 如何在 Azure 虚拟机里配置条带化
  9. button执行onclick函数_可能你的react函数组件从来没有优化过
  10. Windows Server 2008 R2之三十八 Hyper-V的授权管理
  11. Linux内核网络udp数据包发送(一)
  12. creator tween复杂用法
  13. 【Xmy的第一次Python】
  14. mysql数据库无法插入中文
  15. 购物足迹功能php,wordpress实现访客足迹功能
  16. 上海科学家研制出新型“耐火宣纸”
  17. C语言——计算阶层求和
  18. Android开发三:数据库设计及应用(一)
  19. Xilinx芯片存储介绍
  20. 两台计算机怎么快速拷贝文件夹,两台电脑,用什么方法相互传文件最快?

热门文章

  1. android客户端服务器传输,【图片】【转】通过Android 客户端上传数据到服务器【aide吧】_百度贴吧...
  2. 补天漏洞厂商资产数据爬虫以及总漏洞量可视化分析
  3. 打印服务器后台程序没有运行,打印后台程序服务没有运行
  4. nodejs中使用nodemon加载文件报错
  5. 联想Thinkpad sl400 7HC入手感觉
  6. 13.图像识别与文字处理
  7. idea的设置,导致list长度只有1000
  8. python 数据集中随机选择作为测试集、验证集
  9. 用户界面之工具栏详解-AutoRunner自动化测试工具
  10. 怎样用计算机命令提高网速,老司机教你电脑网速慢怎么办