Android 蓝牙开发——概述(一)

news2024/12/25 9:34:36

一、蓝牙简介

        蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。

        其中将1.x~3.0之间的版本称之为经典蓝牙,4.x开始的蓝牙称之为低功耗蓝牙,也就是蓝牙BLE。

1、蓝牙协议介绍

        Profiles (蓝牙应用规范),它从应用场景的角度为蓝牙技术的使用制定了不同的规范。这也是和大众日常生活接触最多的一部分。蓝牙支持很多Profiles:

MAP:(MessageAccessProfile),短信访问协议,允许设备间的信息交换,短信。使用场景:智能车载中同步短信等信息。

HFP:(Hands-free Profile),电话免提协议,让蓝牙设备(如蓝牙耳机/车机)可以控制电话,如接听、挂断、拒接等。

PBAP:(Phone Book Access Profile),电话本访问协议,是一种基于OBEX的上层协议,该协议可以同步手机这些具有电话本功能设备上的通讯录和通话记录等信息

A2DP:(Advanced Audio Distribution Profile),高级音频分发协议,在这里大家需要区分开高级音频和蓝牙音频,蓝牙音频一般指传输于蓝牙SCO链路上的音频,也就是蓝牙电话;而高级音频指的传输于蓝牙ACL链路上的高质量音频,即为蓝牙音乐的媒体音频。A2DP的典型应用是将音乐播放器的音频数据发送到耳机或者音响。

AVRCP:(The Audio/Video Remote Control Profile),音视频远程控制协议。AVRCP定义了蓝牙设备之间的音视频传输的特点和流程,来确保不同蓝牙设备之间音视频传输控制的兼容。一般包括暂停,播放,上一曲下一曲等远程控制操作。

以上是比较重要的常见蓝牙协议, 其他常见协议如下:

BIP:(Basic Imaging Profile),基本成像协议。可以在不同的设备之间传递图片;比如可以手机上的图片传给打印机。

BPP:(Basic Priting Profile),基本打印协议。比如手机可以把文本、邮件、图片等发送给打印机,有打印机完成打印。

CIP:(Common ISDN Access Profile),公共ISDN接入协议。

CTP:(Codeless Telephony Profile),无绳电话协议。

DID:(Device ID Profile),设备ID协议。

DUN:(Dial-up Network Profile),拨号网络协议。一个典型的应用:笔记本电脑可以通过手机进行拨号上网。

FAX:(Fax Profile),传真协议,FAX 旨在于手机或固定电话和安装了传真软件的 PC 之间提供适当定义的接口。典型配置为个人计算机使用手机作为 FAX 网关,向任意接收方发送 FAX 传输。

FTP:(File Transfer Profile),文件传输协议。这个用的是比较多的。手机之间互传文件,手机与PC之间传递文件。

GAP:(General Access Profile),基本访问协议。这个规范是其他规范的基础。它定义了在 Bluetooth 设备间建立基带链路的通用方法。

GOEP:(General Object Exchange Profile),通用对象交换协议。可以将对象从一个设备传输到另外一个设备商。对象可以是任意的:比如图片,文本等。此配置文件定义了两个角色:提供拉取或推送对象位置的服务器及启动操作的客户端。GOEP 为使用 OBEX 协议的其它配置文件提供了通用蓝图。

HCRP:(Hard Copy Cable Replacement Profile),硬拷贝电缆替代协议。定义了如何通过 Bluetooth 无线链路完成基于驱动程序的打印。

HID:(Human Interface Device Profile),人机接口设备协议。如果无线蓝牙鼠标;Wii Remotes; PlayStation 3 控制器。

HSP:(Handset Profile),耳机协议。这是最常使用的。用蓝牙耳机可以控制手机:接听、挂断、调节音量。

ICP:(Intercom Profile),对讲机协议。这是在两个设备之间建立语音连接,就是把两个昂贵的蓝牙设备变成廉价的对讲机。

LAP:(LAN Access Profile),局域网接入协议。本功能定义了蓝牙设备如何通过点对点协议(PPP)连接LAN的程序.该功能实现了蓝牙设备连接已存在与LAN中的蓝牙设备的功能.在连接之后,该蓝牙设备即可访问上述LAN的资源。

OPP:(Object Push Profile),对象交换协议。定义了诸如商务卡,约会提醒,任务等的交换功能。

PAN:(Personal Area Networking Profile),个域网协议。两个或更多个 Bluetooth 设备如何构成一个即时网络。

SPP:(Serial Port Profile),串口配置协议。定义了如何设置虚拟串行端口及如何连接两个 Bluetooth 设备。

SPAP:(Service Discovery Application Profile),服务发现应用协议。通过该Profile,一个Bluetooth设备可以找到其它Bluetooth设备提供的服务,以及查询相关的信息。

SAP:(SIM Access Profile),SIM卡访问协议。允许带有内置 GSM 收发器的车载电话之类的设备连接到 Bluetooth 电话中的 SIM 卡。因此车载电话本身并不需要单独的 SIM 卡。

SYNC:(Syncronization Profile),同步协议。SYNC 配置文件可以与 GOEP 配合使用以支持 Bluetooth 设备间的日历和地址信息(个人信息管理器 (PIM) 项)同步。此配置文件的常见应用是 PDA 和计算机之间的数据交换。

VDP:(Video Distribution Profile),视频发布协议。VDP 定义了 Bluetooth 设备如何通过 Bluetooth 无线技术以流传输视频。示例使用案例包括从 PC 媒体中心向便携式播放器流传输存储的视频,或从数码相机向 TV 进行流传输。

 2、蓝牙架构图

Google蓝牙架构

应用框架:应用代码,它用 android.bluetooth API  与蓝牙硬件进行交互。此代码在内部通过 Binder IPC 机制调用蓝牙进程。

蓝牙系统服务:蓝牙系统服务(位于 packages/apps/Bluetooth中)被打包为 Android 应用,并在 Android 框架层实现蓝牙服务和配置文件。该应用通过 JNI 调用 HAL 层。

JNI:与 android.bluetooth  相关联的 JNI 代码位于 packages/apps/Bluetooth/jni  中。当发生特定蓝牙操作时(例如发现设备时),JNI 代码会调用 HAL 层并从 HAL 接收回调。

HAL:硬件抽象层定义了  android.bluetooth  API 和蓝牙进程会调用的标准接口,并且您必须实现该接口才能使蓝牙硬件正常工作。

蓝牙堆栈:系统为您提供了默认蓝牙堆栈(位于  system/bt  中)。该堆栈会实现常规蓝牙 HAL,并通过扩展程序和更改配置对其进行自定义。

供应商拓展程序:要添加自定义扩展程序和用于跟踪的 HCI 层,您可以创建一个 libbt-vendor 模块并指定这些组件。

代码层次架构

APP:包括 Settings APK 和 Bluetooth APK;

Framwork:包括标准的android API,被系统app调用;

JNI:为Bluetooth APK提供操作协议栈控制底层硬件的接口;

HAL:包括

        1、HIDL框架为Android原生提供的HAL框架;

        2、Bluedroid 为蓝牙协议栈;

        3、Vendor HAL为蓝牙芯片厂商提供的操作驱动的接口;

Driver:包括蓝牙驱动,硬件接口(蓝牙和主CPU硬件连接)驱动;

Hardware:同样对应蓝牙芯片和蓝牙和主CPU连接硬件。

3、主要代码分布 

frameworks/base/core/java/android/bluetooth/

描述:提供各协议的API接口,APP可直接调用里面的类和方法

BluetoothA2dp.java

        定义高品质的音频如何通过蓝牙连接从一个设备传输到另一个设备。"A2DP" 使用场景:蓝牙音乐。

getConnectedDevices:获取此特定配置文件的连接设备

getConnectionState:获取配置文件的当前连接状态

isA2dpPlaying:检查A2DP配置文件是否为流媒体音乐

BluetoothAdapter.java

        本地蓝牙适配器,是所有蓝牙交互的入口点,表示蓝牙设备自身的一个蓝牙设备适配器,整个系统只有一个蓝牙适配器。通过它可以发现其他蓝牙设备,查询绑定(配对)设备的列表。

enable:打开蓝牙功能;
disable:关闭蓝牙功能;
isEnable:判断蓝牙功能是否打开;
startDiscovery:开始搜索周围的蓝牙设备;
cancelDiscovery:取消搜索操作;
isDiscovering:判断当前是否正在搜索设备;
getBondedDevices:获取己绑定的设备列表;
setName:设置本机的蓝牙名称;
getName:获取本机的蓝牙名称;
getAddress:获取本机的蓝牙地址;
getRemoteDevice:根据蓝牙地址获取远程的蓝牙设备;
getState:获取本地蓝牙适配器的状态;

BluetoothAssignedNumbers.java

        蓝牙编号分配

CarBluetoothService.java

        蓝牙设备类型的定义

BluetoothDevice.java

        代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket连接,或者查询关于设备名称、地址、类和连接状态等设备信息

getName:获取远程设备的蓝牙名称;

getAddress:获得该设备的地址;

getBondState:获得该设备的绑定状态;

BluetoothDevicePicker.java

        定义远程蓝牙设备的特性,比如需要认证,设备类型

BluetoothHeadset.java

        提供对移动手机使用的蓝牙耳机的支持

getConnectedDevices:获取此特定配置文件的连接设备

getConnectionState:获取配置文件的当前连接状态

isAudioConnected:检查蓝牙SCO音频是否已连接

startVoiceRecognition:启动蓝牙语音识别

stopVoiceRecognition:停止蓝牙语音识别

BluetoothInputStream.java

        蓝牙流接口的实现(输入流)

BluetoothOutputStream.java

        蓝牙流接口的实现(输出流)

BluetoothProfile.java

        一个表示蓝牙配置文件的接口。一个Bluetooth profile是一个基于蓝牙的通信无线接口定义。一个例子是Hands-Free profile

getConnectedDevices:获取此特定配置文件的连接设备

getConnectionState:获取配置文件的当前连接状态

BluetoothServerSocket.java

        代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,它允许一个应用与其他蓝牙设备通过 InputStream 和 OutputStream 交换数据

BluetoothSocket.java

        蓝牙socket的封装

close:关闭对象并释放它所拥有的任何系统资源

connect:尝试连接到远程设备

getInputStream:获取此socket的输入流

getOutPutStream:获取此socket的输出流

getRemoteDevice:获取此socket正在连接或已经连接到的远程设备

isConnected:获取此socket的连接状态,即是否有与远程设备的活动连接

BluetoothUuid.java

        蓝牙uuid的定义以及uuid的解析


frameworks/base/services/core/java/com/android/server/ 

BluetoothManagerService.java 

        蓝牙系统服务,供其他进程调用。打开和关闭蓝牙的公共接口也在这里面。


packages/services/Car/service/src/com/android/car/

描述:车机自动重连相关

BluetoothDeviceConnectionPolicy.java

        车机自动重连策略

BluetoothProfileDeviceManager.java

        设备管理列表,连接优先级相关

CarBluetoothService.java

        维护当前用户的蓝牙设备和配置文件连接。 为其他程序提供请求自动连接的接口。


packages/apps/Bluetooth/

描述:蓝牙系统服务,被打包为 Android 应用(包名com.android.bluetooth),并在 Android 框架层实现蓝牙服务和配置文件。此应用通过 JNI 调用原生蓝牙堆栈。调用 framework 的 enable 蓝牙接口后会启动该进程。其内部实现了多种上层蓝牙模式:hfp、a2dp、map、pbap 等,并通过JNI调用与haI层完成联系。和 framework/base 层是通过aidl方式交互。

 src/com/android/bluetooth/btservice/

AdapterProperties.java

        蓝牙属性相关业务.

adapterPropertyChangedCallback:蓝牙属性变更

AdapterService.java

        BluetoothAdapter 的实现类,FW 核心业务逻辑类。实现提供给 App 的接口。

BondStateMachine.java

        此状态机处理蓝牙适配器状态。

RemoteDevices.java

        远端设备相关主要业务逻辑类。

devicePropertyChangedCallback:设备属性变更

deviceFoundCallback:扫描发现设备

aclStateChangeCallback:设备状态变更


hardware/libhardware/include/hardware/ 

bluetooth.h

        蓝牙HAL的头文件


system/bt/

描述:蓝牙官方协议栈


packages/apps/Settings/src/com/android/settings/bluetooth/

描述:setting中蓝牙部分,界面相关蓝牙的调用方式:从 apk 到 framework,framework 再通过 aidl 调用 bluetooth 应用,在通过应用层利用 jni 调用 haI 层实现蓝牙的各种请求。

BluetoothDevicePreference.java

        在设置界面显示蓝牙设备的偏好类型。点击界面上的配对、连接、断开就是在这操作的

BluetoothEnable.java

        蓝牙辅助类,用来管理蓝牙的开和关以及蓝牙状态的标题显示。如打开或关闭蓝牙的switchbar的状态和文本显示

DeviceListPreferenceFragment.java

        BluetoothSettings类的父类,是一个抽象类,该类包含了用于保存蓝牙设备的列表


frameworks/base/packages/SettingsLib/src/com/android/settingslib/bluetooth/

BluetoothCallback.java

        蓝牙设备的删除、扫描状态的改变、蓝牙状态的改变等回调抽象方法


本章小结:

        本文主要介绍蓝牙的基础框架、相关协议以及代码分布,让初步接触蓝牙开发的朋友对蓝牙开发有一个基础的了解,同时为下面看源码时更好的找到源码位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Memcache学习总结

这里写自定义目录标题介绍一致性哈希寻找节点一致性哈希介绍内存管理slab结构寻找存储chunkChunk中存储的Item数据结构grow factor 调优回收删除一些特性介绍 基于内置内存Key-Value形式存储数据(字符串、对象)集群服务器是通过数组链表方式存储K-V数据<分布式>基于哈希…

编程语言那么多,我为什么推荐你学Java?

Java一直都是稳居排行榜第一的语言&#xff0c;在未来10年Java都会是最热门的语言之一&#xff0c;因为Java技术具有卓越的通用性、高效性、安全性和平台移植性&#xff0c;它可以跨平台的应用到不同的领域&#xff0c;工作需求足够大。 为什么选择学习Java编程语言&#xff1…

更具科技感的中塔机箱,模块设计兼容性强,鑫谷昆仑御风机箱上手

大家装机的时候应该都接触过鑫谷的机箱和散热器外设&#xff0c;作为一家有年头的外设品牌&#xff0c;这两年鑫谷推陈出新&#xff0c;像是在电源方面&#xff0c;就有不少很受欢迎的产品&#xff0c;像是昆仑系列等&#xff0c;前端鑫谷在昆仑系列中带来了一款设计新颖的机箱…

琥珀酰亚胺-双硫键-琥珀酰亚胺NHS-SS-NHS双端活性酯二硫键交联剂

名称:NHS-SS-NHS 中文名称:活性酯-双硫键-活性酯 琥珀酰亚胺-双硫键-琥珀酰亚胺 分子式 :C14H16N2O10S2 分子量 :436.41 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性液体&am…

VMwareWorkstationPro16的下载与安装,以及vm账号注册的问题

VMwareWorkstationPro16的下载与安装&#xff0c;以及vm账号注册的问题查看虚拟化支持是否开启vm的安装vm账号注册的常见问题VM 16的安装步骤查看虚拟化支持是否开启 可以从任务管理器中的性能去查看CPU是否开启虚拟化支持 vm的安装 访问 vm 的官网: https://www.vmware.co…

I2C_Adapter驱动框架讲解与编写

I2C_Adapter驱动框架讲解与编写 文章目录I2C_Adapter驱动框架讲解与编写参考资料&#xff1a;一、 回顾1.1 2C驱动程序的层次1.2 I2C总线-设备-驱动模型二、 I2C_Adapter驱动框架2.1 核心的结构体1. i2c_adapter2. i2c_algorithm2.2 驱动程序框架1. 所涉及的函数2. i2c_algorit…

lq-递归

1、递归实现指数型枚举从 1∼n 这 n个整数中随机选取任意多个&#xff0c;输出所有可能的选择方案。输入格式输入一个整数 n。输出格式每行输出一种方案。同一行内的数必须升序排列&#xff0c;相邻两个数用恰好 1个空格隔开。对于没有选任何数的方案&#xff0c;输出空行。本题…

AStar(A*)算法核心思想( for unity)

AStar算法算法思想举例理解核心代码A* 算法&#xff0c;A* (A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法&#xff0c;也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近&#xff0c;最终搜索速度越快。 注意:AStar的类应该作为一种单例类只…

软考初级哪个好考

其实软考初级的实用性差不多。只是看自身怎么看&#xff0c;考哪一科对你来说&#xff0c;产生的意义更大&#xff0c;对自己以后的发展前景帮助大&#xff0c;那你就选择哪一科就行。 软考初级科目有&#xff1a;程序员、网络管理员、信息处理技术员、信息系统运行管理员、网…

C语言之vs2022安装教程,还不会的快来看

下载安装包官方无毒下载链接:https://visualstudio.microsoft.com/zh-hans/vs/点击链接或者复制到浏览器出现如下按钮点击下载社区版本Visual Studio 2022Community 2022: 社区版&#xff0c;也可以理解为个人版。适用于学生、开源和个人。一些新手用来学习是个不错的选择Profe…

第十三届蓝桥杯省赛 C++ B组 - 修剪灌木

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;蓝桥杯题解集合 &#x1f4dd;原题地址&#xff1a;付账问题 &#x1f4e3;专栏定位&#xff1a;为想参加蓝桥别的小伙伴整理常考算法题解&#xff0c;祝大家…

sentinel部署配置

sentinel部署配置sentinel 部署&#xff08;V1.8.6&#xff09;获取 Sentinel 控制台启动修改用户名密码控制台登录客户端集成sentinel 部署&#xff08;V1.8.6&#xff09; 获取 Sentinel 控制台 您可以从 release 页面 下载最新版本的控制台 jar 包。 官网&#xff1a; ht…

【C语言】深度剖析数据在内存中的存储---(附源码 | 建议收藏)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;凡人修C传 &#x1f4ac;总结&#xff1a;希望你看完之后&…

让Tomcat服务器运行在Windows后台

让tomcat运行在Windows后台一、设置环境变量二、安装tomcat服务三、设置后台自动运行本机环境&#xff1a;win10一、设置环境变量 进入tomcat主目录的bin文件夹&#xff0c;复制路径 快捷键winr键唤出运行框&#xff0c;输入sysdm.cpl然后点击“确定”进入系统属性面板 在系统…

传统工科应该怎么学习机器学习or深度学习?

还是老生常谈。建议先不要直接上手机器学习/深度学习&#xff0c;先把你研究对象/信号的机理给搞清楚&#xff0c;然后再开始上现代信号处理&#xff0c;机器学习/深度学习算法&#xff0c;只有对你研究对象的机理深入了解&#xff0c;才能更好地对信号处理算法&#xff0c;机器…

【职工管理系统】C++全栈体系(十三)

职工管理系统 第一章 管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 公司中职工分为三类&#xff1a;普通员工、经理、老板&#xff0c;显示信息时&#xff0c;需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责&#xff1a;完成经理交给的任务 …

运算符重载及组合与继承

目录 一、运算符重载 1.1普通运算符重载 1.2特殊运算符重载 二、标准输入输出流 三、组合与继承 3.1组合 3.2继承 1) public继承方式 2) protected继承方式 3) private继承方式 小作业&#xff1a;模仿c的string类&#xff0c;自己实现string类 一、运算符重载 百度…

【文件随机读写和文件缓冲区】

1.1fseek函数 1.2ftell函数1.3rewind函数2. 文件读取结束的判定2.1文件缓冲区 1.1fseek函数 根据文件指针的位置和偏移量来定位文件指针。 int fseek ( FILE * stream, long int offset, int origin );看不懂没关系&#xff0c;举个例子你就明白了。 我们首先在text.txt文…

送什么礼物给小学生合适?保护视力的专业护眼台灯

在学生们过节以及生日来临&#xff0c;父母们会精心为孩子准备好礼物的&#xff0c;而最有实际意义的&#xff0c;是对学习有所帮助的&#xff0c;比如学习机、护眼灯、绘画本&#xff0c;能丰富孩子的生活都可以&#xff0c;这几年儿童青少年的近视率迅速上升&#xff0c;有52…

TypeScript中的 | 分隔符、 运算符、类型谓词is

一. | 分隔符 在 TypeScript 中联合类型&#xff08;Union Types&#xff09;表示取值可以为多种类型中的一种&#xff0c;联合类型使用 | 分隔每个类型。联合类型通常与 null 或 undefined 一起使用&#xff1a; const sayHello (name: string | undefined) > { /* ... …