带你解锁蓝牙skill(一)

来源:互联网 发布:网络打鱼赌钱游戏微信 编辑:程序博客网 时间:2024/05/02 19:20

本文已授权微信公众号fanfan程序媛独家发布



蓝牙这个专题,很值得深入研究,但又不是一篇两篇能说的清除,所以决定连载~~~
不知道能坚持多久


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

转载请注明出处,本文出自带你解锁蓝牙skill
作者为fanfan


1,蓝牙是什么

蓝牙是设备间的一种短距离的无线近场通信。对通信距离,通讯速率,频段等都有相关的规定,具体可自行百度百科。

生活中最常见的诸如蓝牙耳机,蓝牙音箱,智能家居也有很多蓝牙(但对距离和速率有一定的限制)。

  • 可以利用蓝牙从别的手机设备上导入联系人信息
  • 可以利用蓝牙进行设备间的文件传输
  • 可以利用蓝牙在其他设备上播放媒体音频
  • 可以利用蓝牙在其他设备上播放手机音频(蓝牙通话)
  • 可以利用蓝牙读取其他设备上的短彩信
  • 可以利用蓝牙开启网络共享,共享互联网
  • 可以利用蓝牙实现对某个设备的输入控制,比如蓝牙鼠标,蓝牙键盘

蓝牙之所以可以实现上述这些功能,是因为在蓝牙中规定了蓝牙协议,来提供一些接口供开发商使用。

协议是什么??协议是说在通信过程中设备所遵循的一种规则

为了更方便的了解蓝牙是什么,我们就借助蓝牙协议来看一看蓝牙到底能干什么??

2,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\Android版本 Android2.1 Android4.4 Android5.0.0 Android6.0.0 Android7.1.1 API 7(ECLAIR_MR1) 19(KITKAT) 21(LOLLIPOP) 23(M) 25(N) 发布时间 2010-01 2013-10 2014-11 2015 2016 OppProfile ✔ ✔ ✔ ✔ PanProfile ✔ ✔ ✔ ✔ PbapServerProfile ✔ ✔ ✔ ✔ PbapClientProfile ✔ A2dpProfile ✔ ✔ ✔ ✔ A2dpSinkProfile ✔ HeadsetProfile ✔ ✔ ✔ ✔ HfpClientProfile ✔ HidProfile ✔ ✔ ✔ ✔ MapProfile ✔ ✔ ✔ ✔ SapProfile ✔ ✔

3,profile配置文件简介

接下来以Android7.1.1为例,分析profile相关

含义 作用 举例 OppProfile Object Push Profie 文件传输协议:用于蓝牙设备间的文件传输 手机间的文件传输 PanProfile Personal Area Networking Profile 个人局域网协议:(有三个角色NAP,PANU,GN)设备一方开启蓝牙网络共享给其他设备使用 手机上的蓝牙共享网络 PbapServerProfile Phone Book Access Profile(PSE) 读取联系人协议:作为server,本设备的联系人可共享给其他设备 提供联系人列表 PbapClientProfile Phone Book Access Profile(PCE) 读取联系人协议:作为client角色,本设备可读取server端的联系人 读取联系人列表 A2dpProfile Advanced Audio Distribution Profile(SRC:Source) 高级音频分发协议:作为server提供音频源 例如可以提供音频源的手机 A2dpSinkProfile Advanced Audio Distribution Profile(SINK) 高级音频分发协议:作为client播放接收到的音频 车载蓝牙,蓝牙音响 HeadsetProfile Headset Profile 耳机协议:提供手机音频 连接蓝牙耳机 HfpClientProfile Hands-Free Profile 免提设备:播放音频 蓝牙耳机 HidProfile Human Interface Device 人机接口设备 蓝牙鼠标,蓝牙键盘 MapProfile Message Access Profile 读取短消息协议 SapProfile SIM Access Profile 读取sim卡协议


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


1>,OppProfile

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

  • 发送方Sender:发送文件的一方
  • 接收方receiver:接受文件的一方

所以蓝牙设备的发送方和接受方是根据谁发送文件而决定的,设备既可以是发送方和接收方。
实现文件传输需要以下条件

  1. 两个蓝牙设备均支持OppProfile
  2. 接受方蓝牙处于打开状态
  3. 接收方设备对发送方设备蓝牙可见

接下来就可以进行文件传输了,至于最终传输结果,还很未知啊。
这就好比相亲,旁人能撮合的能提供的就到这里了(相当于文件传输的前提条件,见以上三条),至于能不能成,还得看双方的意见(接收方是否同意接受和发送方是否停止发送,见下文)。但不管能不能成,所谓是雁过留痕,这事儿已经是经历了总要存在记忆里(发送方是传出历史记录,接收方是传入历史记录),每一条记忆都记录了事情的结果,原因,时间,等各种详细信息。唯一不同的是记忆无法删除,但是机器设备中的记录是在查看后自动清除。



过程演示说明:

发送方Sender:

选择文件–>分享–>蓝牙
选择蓝牙接收设备

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

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

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

接收方蓝牙关闭

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

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

文件准备上传

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

Sender取消上传

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

文件列表

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

接收方Receiver:

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

接受文件

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

这里写图片描述

话不多说,对于OppProfile的基本情况就是这样了,如果有任何疑问可以扫描右下方二维码或者点击左上方蓝色区域获取到二维码或者是微信搜索公众号:fanfan程序媛,关注我的微信公众号留言吧~~


2>,PanProfile

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

  • Network Access Point (NAP) 网络接入点:开启蓝牙网络共享的一方
  • Group Ad-hoc Network (GN) 群组Ad-hoc网络
  • PAN User (PANU) 网络使用者:通过蓝牙使用网络的一方

前提条件:

  • 双方设备支持PanProfile
  • 其中一方蓝牙共享网络开启

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

这里写图片描述

于是乎,bug描述就是,蓝牙配对后,点击互联网访问一直选择不成功…….
在这里也烦请各位测试大神看一看,互联网访问要想成功是先要开启蓝牙共享网络开关的亲!!!
蓝牙共享网络的开关位于设置–>更多–>网络恭喜与热点–>蓝牙共享网络

这里写图片描述

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



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

  1. 双方均不开启蓝牙共享网络开关
  2. 其中一方开启蓝牙共享网络开关
  3. 双方均开启了蓝牙共享网络开关

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

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

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

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

这里写图片描述

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

这里写图片描述

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



写了这么久…好累好累,来张美图养养眼~~美图来自作者所拍,地点是北京北郊农场桥上
转载请注明出处,本文出自带你解锁蓝牙skill
作者为fanfan
看在我这么累的份上,转载一定要注明出处,各位程序员们!!!

美图美图噢



好了,继续!!!

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

此时双方均可以作为Nap,也可以作为PanU。与第一种情况的区别就是在开启互联网连接之前是无法确定设备是处于什么角色的。
此时如果在其中一方开启了互联网连接,那么该方在本次互联网连接过程中作为PanU(使用网络),对方在本次互联网连接过程中充当Nap(提供网络)。当断开后,双方的身份又回到了不能确定的状态。当再次有一方开启互联网连接后,角色才能分配。即每次互联网连接都会重新分配身份。



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

哈哈哈小小调皮一下~~


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

前段时间回家路上看到有一个共享单车是带后座的,好激动,决定来一波共享单车的风:Twins(这不算侵权吧??算的话请一定告诉我!!)要骑一辆带有后座的共享单车,两人都有骑车载人的能力(即表示蓝牙共享网络开关开启),现在就会有两个角色之分:一个是骑车的一个是坐车的。在她们开始骑车之前是无法确定谁是骑车的谁是坐车的(即在互联网连接之前是无法确定谁作为Nap,谁作为PanU),只有一方比如阿娇选择了坐车之后,即选择享受骑车人带来的福利(即选择打开互联网连接),那么另一方阿Sa就被动的成为了骑车的人,提供车前进的动力(即Nap,网络提供者)。也许在骑了1km后,阿Sa觉得累了,或者是阿娇心疼阿Sa,此时,停止骑车(即断开互联网连接),双方交换角色后继续前进~~


对于PanProfile的第二中角色,暂时还未碰到,列为todo吧,或者有了解的可以普及一下。
累呀~~感觉好玩儿的话就动手点个赞吧,更多精彩技术故事尽在我的微信公众号
这里写图片描述
我又开完乐了,此公众号为蓝牙技术公众号,欢迎关注,欢迎吐槽