专栏首页编程思想之路带你解锁蓝牙skill(二)

带你解锁蓝牙skill(二)

紧接着带你解锁蓝牙skill(一)继续分析

3>,Pbap配置

Pbap:Phone Book Access Profile是说共享联系人协议,具体定义可参考上一篇。 其实说白了就是一个手机可以从另一个手机中导入联系人信息。 其中包括两个角色

  1. PCE:对应的协议配置文件为PbapClientProfile,作为客户端,是指获取联系人的一端
  2. PSE:对应协议配置文件为PbapServerProfile,作为服务器端,是指提供联系人数据的一端。

Android源码在7.0以前只支持作为PSE即作为提供数据的一方。但是各芯片提供商可能会自己增加一个蓝牙协议用于支持读取数据。

现在用两个手机做测试机进行测试

  • 一个是支持PSE,PCE两种角色,相当于既可以当客户端又可以当服务端(即既可以提供联系人数据,又可以获取对方的联系人数据),可以主动选择获取其他手机上的联系人数据。我们称之为S&C(server&client).
  • 一个是只支持PSE(即作为提供联系人数据的一方),只能作为服务端,不能通过蓝牙获取其他手机上的联系人,只能是被动的提供数据。我们称之为S(server)。

首先看一下Pbap是怎么用的。

第一,Pbap不是什么

首先要说明一点:Pbap不是说在通讯录中通过蓝牙分享联系人,因为在分享联系人时是将联系人先导出到一个一个文件,然后把文件分享出去,归根结底还是分享文件,走的是Opp协议。如下图所示,当对方在分享一个联系人信息时,会先将联系人打包到一个vcf文件中,并通过文件分享的方式传送过来

那么Pbap是什么呢??

第二,Pbap是什么

在通讯录–>菜单中,会有导入/导出选项,针对Pbap的两种角色来进行分析。

1>,如果你的手机只支持PSE角色不支持PCE,即只支持外界读取本机的联系人,不支持读取外界联系人的话—–测试机S ,那么显示选项如下

联系人的来源只有一个,那就是从存储设备中导入。(因为没有安装sim卡的缘故) 其实导入来源应该是有两个

  • 从存储设备中导入
  • 从sim卡中导入

2>,但如果你的手机既支持PSE角色有支持PCE角色的话—–测试机S&C,那么导入联系人时的选项如下

可以看到对于联系人的导入可以通过三种

  • 从存储设备中导入
  • 从sim卡中导入
  • 从其他手机导入

相对于上一种情况,这种条件下多了一个从其他手机导入的支持。 接下来就可以从其他设备导入通讯录了

选择通过蓝牙方式导入联系人后,会提示

在从其他设备导入联系人时有两个要求,

  • 保证对方设备在设置中开启蓝牙
  • 报这个对方设备设置为对其他蓝牙可见

这两个条件是为了让S&C设备可以实现和C设备的配对。配对成功后,在C设备上会有一个读取联系人权限的问题

权限声明如下: 设备想要访问您的联系人信息和通话记录。要向设备授予访问权限吗? 点击同意之后,C设备上的联系人信息便会同步到S&C设备上。C设备上的联系人会成为S&C设备上联系人的一部分。所获取到的信息包括联系人信息和通话记录。

当然,因为我的测试机是S&CC,所以以上就是按这种情况考虑的。具体情况基本可以类推。

举个例子来帮助你理解Pbap的含义。 比如现在有3个桶A,B,C,其中桶C是空的。桶A和桶B有水,而且桶B无限大(哈哈,搞笑嘛,谁不会,哈哈哈)。 接下来桶A主动将桶A的水的一部分(某个联系人)倒入到桶C中(打包成一个vcf文件),然后送给桶B(这种情况就是C设备通过蓝牙分享的方式将联系人分享至S&C设备),此时蓝牙分享联系人过程已经结束,在桶B这里需要自己把桶C中的水倒进来(即S&C设备获取到了一个vcf文件)。这种情况并不是属于Pbap的情况 但如果桶B说我要获取A的所有水(导入联系人),也就是说桶A是被动提供水的,此时就是S&C设备通过蓝牙导入联系人,那么A中的所有水会直接倒入C中(所有联系人打包到一个vcf文件),并且,此时还没结束,桶C中的水紧接着会倒入B中与B融为一体,至此,通过蓝牙导入联系人的过程才结束。

写了那么多,该歇一歇了

哇噻,有彩虹噢~~~

4>,音频协议

Android中的音频协议包括两大类

  1. 手机音频:蓝牙通话,常见的是蓝牙耳机。协议是HeadSet
  2. 媒体音频:蓝牙播放音视频声音,可以是手机,蓝牙耳机,蓝牙音箱等可以播放音频的设备,相关协议是A2dp 如下图所示,手机与一个蓝牙耳机进行配对时会显示手机音频和媒体音频配置项。

先来说一下媒体音频相关—A2dp,A2dp是说音频分发协议,分为两个角色

  • Source (SRC) : A2dp服务端,用于提供音频源,对应的协议文件为A2dpProfile。
  • Sink (SNK) :A2dp客户端,用于播放音频,对应的协议文件为A2dpSinkProfile. 其实说白了A2dp的高级音频分发协议说的就是用其他蓝牙设备播放本机的媒体音频(注意,是音频,只有声音)。

再来看看手机音频—-Headset,与A2dp类似,同样分为两个角色

  • HeadsetProfile:提供音频源的一端
  • HfpClientProfile:播放音频源的一端

比如在手机和蓝牙耳机的连接中 蓝牙耳机可以作为媒体音频的播放器—A2DP的sink角色,也可以作为手机音频的播放器—Headset的HfpClient 而手机扮演的是媒体音频中的音频源的提供者—A2dp的src角色,手机音频中的音频提供者–headset。

至于HID和Map一个是人机接口设备,一个是读取短彩信,因条件不允许,暂时不能演示,接下来进行源码研究。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 带你解锁蓝牙skill(一)

    蓝牙这个专题,很值得深入研究,但又不是一篇两篇能说的清除,所以决定连载~~~ 不知道能坚持多久 在研究蓝牙源码之前,先来看看蓝牙大致都有什么功...

    fanfan
  • 蓝牙协议栈初识

    在学习的过程中一直有疑问,为什么蓝牙技术突然就产生了呢?蓝牙技术的目的是什么呢?蓝牙技术相对于它所替代的技术存在什么样的优势和劣势呢?蓝牙技术都做了些什么呢?

    fanfan
  • 带你解锁蓝牙skill(0)

    蓝牙系列文章之前言篇 0.0 一直以为自己对蓝牙很是了解,但前段时间跟一个很熟悉蓝牙的人进行交谈,才发现自己对蓝牙的学习太浅,所写的只是蓝牙最上层的东西而已,甚...

    fanfan
  • R语言包_knitr

    科学研究中,可重复性相当重要,即结果能够被复现。 knitr之前,学者们通常通过简单的图片和文字组合交流信息,这种方式效率极低,一方面不利于相互的理解交流,...

    用户1147754
  • Redis 哨兵机制以及底层原理深入解析,这次终于搞清楚了

    前面我们基于实际案例搭建了缓存高可用方案(分布式缓存高可用方案,我们都是这么干的)同时提到了redis主从架构下是如何保证高可用的,讲到了它是通过redis s...

    架构师修炼
  • 004.Heartbeat+HAProxy+MySQL半复制高可用架构

    192.168.77.100 master-private.ha.com master-private

    木二
  • JavaScript之正则表达式

    正则表达式 (regular expression) 描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某...

    laixiangran
  • JavaScript ECMAScript规范里对于分号semicolon用法最权威的定义

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.bl...

    Jerry Wang
  • 电源:模组 & 非模组(一个码农眼中的 区别 & 选择)

      给实习公司组装主机时,电源既装过模组的也装过非模组的。当时没太在意它俩的区别,就知道装非模组的时候比较轻松简单。今天CTO提起这个事,我就去查了一下这二者的...

    JNingWei
  • Spring Cloud 中的分布式事务,附源码《一》

    在开发我的开源项目 prex 时,加入工作流,解决工作流用户与当前系统用户同步问题时,涉及到远程调用操作两个数据库所产生的事务问题,比如系统用户在增加用户同步工...

    搜云库技术团队

扫码关注云+社区

领取腾讯云代金券