在研究蓝牙源码之前,先来看看蓝牙大致都有什么功能。蓝牙模块支持什么功能完全由蓝牙所支持的蓝牙协议而确定,所以先从蓝牙协议看起

 

  一,Android各版本与蓝牙profile关系

 

首先明确一下,目前市面上的Android机的源码大致跟三方面有关系(只考虑蓝牙profile)

  1. Google推出的各Android系统:所支持的蓝牙协议profile均是开启状态

  2. 芯片提供商(常见的诸如高通)修改后的Android源码–开发中称之为base代码:新增或者修改某些蓝牙profile

  3. 开发商拿到base代码进行进一步加工:新增或者修改某些profile

 

所以至于你所使用的手机是否支持某个协议就要从这三方面来看了。Android源码中会告诉你某个原生的Android系统所支持的蓝牙profile,芯片提供商也会给你一个相关的蓝牙文档告诉你目前base代码中所支持的蓝牙profile。 


但是不同的芯片提供商会有不同的修改,也就是说要说Android版本和蓝牙profile一一对应这句话对也不对,只能说原生的Android版本和蓝牙profile一一对应。 


所以本文从Android源码的角度分析各Android版本与蓝牙profile。(选几个代表性的Android版本进行分析)

 

跟我一起学蓝牙基础篇(四)---Profile_java

 

2,profile配置文件简介

 

跟我一起学蓝牙基础篇(四)---Profile_java_02

 

在学习这些协议代码之前,先来看看各种协议都是干什么的?我们如何复现?

 

1>,OppProfile

 

用于两个蓝牙设备间进行文件传输。有发送方和接受方之分

  • 发送方Sender:发送文件的一方

  • 接收方receiver:接受文件的一方

 

所以蓝牙设备的发送方和接受方是根据谁发送文件而决定的,设备既可以是发送方和接收方。 


实现文件传输需要以下条件

  1. 两个蓝牙设备均支持OppProfile

  2. 接受方蓝牙处于打开状态

  3. 接收方设备对发送方设备蓝牙可见

 

接下来就可以进行文件传输了,至于最终传输结果,还很未知啊。


这就好比相亲,旁人能撮合的能提供的就到这里了(相当于文件传输的前提条件,见以上三条),至于能不能成,还得看双方的意见(接收方是否同意接受和发送方是否停止发送,见下文)。

 

但不管能不能成,所谓是雁过留痕,这事儿已经是经历了总要存在记忆里(发送方是传出历史记录,接收方是传入历史记录),每一条记忆都记录了事情的结果,原因,时间,等各种详细信息。唯一不同的是记忆无法删除,但是机器设备中的记录是在查看后自动清除。

 

过程演示说明:

 

发送方Sender:

 

选择文件–>分享–>蓝牙

跟我一起学蓝牙基础篇(四)---Profile_java_03

 

其中所显示的可用设备包括三部分

  • 已与Sender连接的蓝牙设备(但此时接收方蓝牙可能处于关闭状态,只是由于先前进行过配对)

  • 已与Sender配对的蓝牙设备(但此时接收方蓝牙可能处于关闭状态,只是由于先前进行过配对)

  • 未与Sender配对的蓝牙设备(可能已经与其他设备配对)

 

如果是向已经关闭的蓝牙设备发送文件,会提示连接错误

 

跟我一起学蓝牙基础篇(四)---Profile_java_04

 

如果向已经和其他设备连接的蓝牙设备发送设备,依旧能够成功,但是接收方的当前连接会被断开,被与Sender的文件传输所取代。

如果已经满足文件传输条件,则准备上传文件

 

跟我一起学蓝牙基础篇(四)---Profile_java_05

 

 

此时只是准备发送文件。
如果Sender此时选择停止。则会出现

 

跟我一起学蓝牙基础篇(四)---Profile_java_06

 

文件传输会停止,并提示,用户取消上传。
在Sender的传出历史记录中可以看到所传出的文件列表

 

跟我一起学蓝牙基础篇(四)---Profile_java_07

 

点击每个文件可以看到传输详情

 

接收方Receiver:

在有文件传输进来时,会通知receiver

 

跟我一起学蓝牙基础篇(四)---Profile_java_08

 

receiver可以选择拒绝或者接受。
在传入文件记录中会显示所有通过蓝牙发送过来的文件

跟我一起学蓝牙基础篇(四)---Profile_java_09

 

话不多说,对于OppProfile的基本情况就是这样了

 

 

 

2>,PanProfile

 

个人局域网有三个角色,说白了其实就是一个蓝牙网络共享的功能

  • Network Access Point (NAP)  网络接入点:开启蓝牙网络共享的一方

  • Group Ad-hoc Network (GN)  群组Ad-hoc网络

  • PAN User (PANU)  网络使用者:通过蓝牙使用网络的一方

 

前提条件:

  • 双方设备支持PanProfile

  • 其中一方蓝牙共享网络开启

 

文章写到这里,不得不提我工作中遇到的一个相关的问题。
有次我们公司的测试发来一个bug,说在蓝牙配对成功后互联网无法共享,
首先配对之后界面如下:其中配置文件中的互联网访问即为PanProfile

 

跟我一起学蓝牙基础篇(四)---Profile_java_10

 

于是乎,bug描述就是,蓝牙配对后,点击互联网访问一直选择不成功……. 


在这里也烦请各位测试大神看一看,互联网访问要想成功是先要开启蓝牙共享网络开关的亲!!! 


蓝牙共享网络的开关位于设置–>更多–>网络恭喜与热点–>蓝牙共享网络

 

跟我一起学蓝牙基础篇(四)---Profile_java_11

 

可以看到,在配对之后如果想要实现个人局域网,有两个相关开关,一个是蓝牙共享网络开关,一个是互联网访问开关。

 

 

既然双方设备均有蓝牙共享网络开关,按照蓝牙共享网络开关状态进行区分,那么就会有三种情况

  1. 双方均不开启蓝牙共享网络开关

  2. 其中一方开启蓝牙共享网络开关

  3. 双方均开启了蓝牙共享网络开关

 

不论是哪种情况,至于第一种情况可以参加上述bug,不再赘述。

 

第一,只有一方打开了蓝牙共享网络开关

那么此时开启蓝牙共享网络开关的就是Nap–>即网络接入点,选择互联网访问的是PanU–>使用网络方。而且此时设备只能是单一角色(要么是Nap和PanU),即如果设备A打开了蓝牙共享开关,与之配对的设备B未打开蓝牙共享开关,此时只能在设备B上选择开启互联网访问连接。连接成功后如下

 

提供网络的一方(Nap)显示:与设备共享本地互联网连接

 

跟我一起学蓝牙基础篇(四)---Profile_java_12

 

使用网络的一方(PanU)显示:连接到设备以访问互联网

 

跟我一起学蓝牙基础篇(四)---Profile_java_13

 

在这种情况下,双方均可以主动断开互联网连接。 


举个栗子:
买家和卖家: 商人提供水果(相当于开启了蓝牙网络共享Nap提供网络),等待消费者购买(等待开启互联网连接),只有消费者自己才能决定买或者不买(即是否开启互联网连接),商人是不能强买强卖的(即无法开启互联网连接)。当消费者选择要买之后,此时可能在买卖过程中发生矛盾,商人不想卖了或者消费者不想买了都会结束本次交易(即断开设备间的互联网连接)。道理一致。

 

写了这么久…好累好累,来张美图养养眼~~美图来自作者所拍,地点是北京北郊农场桥上 

 

跟我一起学蓝牙基础篇(四)---Profile_java_14

 

好了,继续!!!

 

第二,双方均打开了蓝牙共享网络开关

 

此时双方均可以作为Nap,也可以作为PanU。与第一种情况的区别就是在开启互联网连接之前是无法确定设备是处于什么角色的。 


此时如果在其中一方开启了互联网连接,那么该方在本次互联网连接过程中作为PanU(使用网络),对方在本次互联网连接过程中充当Nap(提供网络)。当断开后,双方的身份又回到了不能确定的状态。当再次有一方开启互联网连接后,角色才能分配。即每次互联网连接都会重新分配身份。

 

按照我的习惯,当然还是会举个浅显易懂的栗子,猜猜这次是什么??
你想到了什么栗子???

 

跟我一起学蓝牙基础篇(四)---Profile_java_15

哈哈哈小小调皮一下~~ 

 

千呼万唤的栗子来了!!准备好小板凳了么

前段时间回家路上看到有一个共享单车是带后座的,好激动,决定来一波共享单车的风:Twins(这不算侵权吧??算的话请一定告诉我!!)要骑一辆带有后座的共享单车,两人都有骑车载人的能力(即表示蓝牙共享网络开关开启),现在就会有两个角色之分:一个是骑车的一个是坐车的。

 

在她们开始骑车之前是无法确定谁是骑车的谁是坐车的(即在互联网连接之前是无法确定谁作为Nap,谁作为PanU),只有一方比如阿娇选择了坐车之后,即选择享受骑车人带来的福利(即选择打开互联网连接),那么另一方阿Sa就被动的成为了骑车的人,提供车前进的动力(即Nap,网络提供者)。也许在骑了1km后,阿Sa觉得累了,或者是阿娇心疼阿Sa,此时,停止骑车(即断开互联网连接),双方交换角色后继续前进~~

 

https://mp.weixin.qq.com/s/7wnZDtT4xbGt1loBHjQX_w

对于PanProfile的第二中角色,暂时还未碰到,列为todo吧,或者有了解的可以普及一下。