Android 蓝牙协议配置讲解
Posted 峥嵘life
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 蓝牙协议配置讲解相关的知识,希望对你有一定的参考价值。
android 蓝牙协议配置讲解
文章目录
本文的蓝牙介绍无关蓝牙版本是2.0还是5.0,是关于蓝牙某个功能使能的一个介绍。比如是否能接收文件,是否能接收/发送音频。
本文内容可能对大部分普通蓝牙应用开发用处不大,但是对于拿到原厂板子开发,或者进行Android设备定制开发是要有一定帮助和值得了解的。
一、关于蓝牙协议蓝牙协议
分为四个层次:
(1)物理层;
(2)逻辑层;
(3)L2CAP;
(4)应用层:
蓝牙协议是通信协议的一种,为了把复杂问题简单化,任何通信协议都具有层次性,特点如下:
(1)从下到上分层,通过层层封装,每一层只需要关心特定,独立的功能,易于实现和维护;
(2)在通信实体内部,下层向上层提供服务,上层是下层的用户;
(3)在通信实体之间,协议仅针对每一层,实体之间的通信,就像每一层之间的通信一样,这样有利于交流,理解和标准化。
上面概念的东西对Android上层开发没啥作用。
上层对几个简单协议了解就行,比如opp表示文件传输,a2dp表示音频传输。这些协议都是在Bluetooth应用中有定义和进行使能的。
某个蓝牙功能异常,用相关关键字在日志日志上看出一些信息。
二、蓝牙相关主要协议
1、蓝牙相关常用协议:
路径:packages\\apps\\Bluetooth\\res\\values\\config.xml
主要代码:
<bool name="profile_supported_opp">true</bool> //文件传输功能.
<bool name="profile_supported_a2dp">true</bool> //蓝牙音频的输出(音频发送给蓝牙耳机功能)
<bool name="profile_supported_a2dp_sink">false</bool> //将蓝牙音频作为sink(下沉)模式,也就是当作接收端(接收另外一个连接的Android设备的音频数据)
<bool name="profile_supported_avrcp_controller">true</bool> //平板(/手机)控制手机的声音播放,暂停,音量大小等功能
<bool name="profile_supported_avrcp_target">true</bool> //手机控制蓝牙耳机设备的声音播放,暂停,音量大小等功能
<!--<bool name="profile_supueported_hs_hfp">false</bool>--> //设备的角色(hfp client / hfp server)来配置hfp profile
//下面的几个很少用
<bool name="profile_supported_hdp">false</bool> //设备可以控制电话(健康设备)
<bool name="profile_supported_hs_hfp">false</bool>
<bool name="profile_supported_pbap">false</bool>
<bool name="pbap_include_photos_in_vcard">false</bool>
<bool name="enable_phone_policy">false</bool>
上面的属性就是Android系统在编译就要配置的一些蓝牙属性,决定蓝牙某些功能是否使能。
比如Android设备需要用到文件就把opp设置成true,手机默认基本都是true,如果设备禁止蓝牙传输文件,设置成false即可。
其他的协议也是同样的方式,进行使能即可。
这里说一下 profile_supported_a2dp_sink 属性(默认为false),设置成true表示手机也可以作为音频的接收端,比如两个手机蓝牙相连,设置成true的设备,可以接收到另外一个手机正在播放音频并且播放出来。
Android 9.0上的Tv设备这样做是ok的,但是Android11的代码上,把 profile_supported_a2dp_sink 设置成true,发现不ok,不仅不能接收音频数据,并且导致了连接蓝牙耳机时也不能成功发送音频。目前还不清楚为啥。没看过里面蓝牙协议具体实现。
2、支持的蓝牙协议和相关服务有如下几种:
profile_supported_a2dp_sink(true)—A2dpSinkService
profile_supported_pan(true)—PanService
profile_supported_gatt(true)—GattService
profile_supported_hfpclient(true)—HeadsetClientService
profile_supported_avrcp_target(true)—AvrcpTargetService
profile_supported_avrcp_controller(true)—AvrcpControllerService
profile_supported_sap(true)—SapService
profile_supported_pbapclient(true)—PbapClientService
profile_supported_mapmce(true)—MapClientService
profile_supported_opp(true)—BluetoothOppService
各协议对应的服务实现还没有细看过,基本也不需要修改。
无论是上面的协议属性定义,还是对应的XXXService都是在packages\\apps\\Bluetooth下的源码。
当然蓝牙相关协议属性,也是可以在overlay中进行覆盖定义。
//设置协议属性的位置
packages\\apps\\Bluetooth\\res\\values\\config.xml
//vendow
vendor\\XXXX\\overlay\\XXX\\BlueOverlay\\res\\config.xml
3、各种蓝牙协议的全称:
拨号网络配置文件 (DUN)
DUN 提供了通过 Bluetooth 无线技术接入 Internet 和其它拨号服务的标准。最常见的情况是在手机上拨号,从膝上型计算机以无线方式接入 Internet。
OPP:对象存储规范(Object Push Profile),最为常见的,文件的传输都是使用此协议。
HFP:(Hands-free Profile),让蓝牙设备可以控制电话,如接听、挂断、拒接、语音拨号等,拒接、语音拨号要视蓝牙耳机及电话是否支持。
HDP: HDP (Health Device Profile) 蓝牙医疗设备模式 可以创建支持蓝牙的医疗设备,使用蓝牙通信的应用程序,例如心率监视器,血液,温度计和秤。
HID() 人机接口设备配置文件
HID 配置文件定义了 Bluetooth HID(如键盘、指向设备、游戏设备及远程监视设备)使用的协议、程序及功能
HSP(Handset Profile)耳机模式 ,用于支持蓝牙耳机与移动电话之间使用
A2DP: Advanced Audio Distribution Profile (A2DP) 高级音频传输模式 A2DP是能够采用耳机内的芯片来堆栈数据,达到声音的高清晰度。有A2DP的耳机就是蓝牙立体声耳机。
PAN:个人局域网(Personal Area Network)最新为了满足需求而出现的, 在小范围内能够将个人设备(自己的手机 电脑笔记本等)互联而组成的网络。
DP( Service Discovery Protocol )服务发现协议
提供应用程序在蓝牙环境中发现哪个服务可用和决定那些可用服务的特征。
GAP(Generic Access Profile)通用访问应用
一般访问应用规范定义了蓝牙设备如何发现和建立与其他设备的安全(或不安全)连接。
它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问 题(如担保),
同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。GAP规定的是一些一般性的运行任务。
因此,它具有强制性,并作为所有其它 蓝牙应用规范的基础。
三、蓝牙协议设置无效?
如果设置了属性但是未生效的思考方向:
1、package中修改了,overlay中未修改,编译后被overlay覆盖了修改的属性;
2、overlay修改了,但是XXoverlay未编译到系统,
3、package和overlay都修改了,但是对应的协议的XXXService有bug,这个概率比较小。
四、蓝牙其他
Android 开发者蓝牙相关介绍的官网:
https://developer.android.google.cn/guide/topics/connectivity/bluetooth
下面是自己之前写的几篇应用上的使用文章:
Android无线蓝牙开发总结
https://blog.csdn.net/wenzhi20102321/article/details/53870789
Android 实现蓝牙录音
https://blog.csdn.net/wenzhi20102321/article/details/89714569
Android蓝牙4.0开发
https://blog.csdn.net/wenzhi20102321/article/details/53893511
共勉: 坚持很难,但是结果会很好。
以上是关于Android 蓝牙协议配置讲解的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 中为低功耗蓝牙实现 Internet 协议支持配置文件 (IPSP)