Android 蓝牙体系学习记录-UUID&PROFILE
平时总是忙, 上班事情多, 还总是加班, 搞得好像没时间做笔记了, 实际上还是因为没有养成习惯. 做笔记不仅能帮助自己记录学习的东西, 也能给需要的人提供帮助.
该文档记录学习蓝牙的笔记。之前一直模模糊糊的知道蓝牙的接口, 也写过蓝牙相关的app, 但总是很模糊, 每次做项目遇到蓝牙相关的开发心里都没底, 这次决心花些时间学习蓝牙的整个体系.
大体的学习思路大概是先描述一下蓝牙的整体框架, 然后对从APP层, framework层, 再到协议栈, 底层rfkill驱动, 再到蓝牙芯片模块, 硬件设计分别描述.
体系学习完了后,再具体到蓝牙到开发, 比如蓝牙音箱, 蓝牙耳机, 蓝牙AVRCP控制, 蓝牙接电话, 传文件.
由于学习是基于9.0的版本学习, 同时也是跟着解决公司项目问题. 我看Android的源码8.0以上有改动, 一方面蓝牙协议栈使用了Treble, 另外8.0以上的版本也支持了蓝牙5, 当然,要使用蓝牙5得蓝牙芯片模组本身支持.
Android 8.0以上蓝牙的框架
首先引用Android 官方的框架描述
上面这张图是8.0以上版本的框架.基于这个框架来看源码, 有安卓源码的朋友可以根据下面路径来看
- 从谷歌的框架来看, app和framework的android.bluetooth都归置为同一层. 应用可以看看安卓原生的Settings,或者TvSettings, 这两个APK的源码在源码packages/apps/Settings, packages/apps/TvSettings目录下, 这两个APK使用的是framework的接口,以及蓝牙进程的服务. framework目录是在framework/base/core/java/android/bluetooth目录
- 蓝牙进程和JNI在packages/apps/Bluetooth目录下. 所有的Profile的服务都在这里启动和控制.
- 蓝牙协议栈在system/bt目录,主要实现逻辑链路控制和适配协议层. 这里具体分为BTA (Bluetooth App Layer) 和 BTE (Bluetooth Embedded System).承接它和蓝牙进程的JNI的是 /hardware/libhardware/include/hardware/bluetooth.h
- HIDL 是8.0以上供应商必须使用的了, 以前供应商只需要实现libbt-vendor. vendor 库源码 /hardware/broadcom/libbt, 控制硬件power, uart.
- RFKILL驱动, RFKILL驱动给HAL层提供了数据操作, 蓝牙模块供电控制接口.
UUID
以前总是遇到各种为什么有些Android设备连上后发送不了文件? 为什么两个手机连上后不能像连蓝牙音箱一样播放歌曲呢? 为什么别人的蓝牙可以连打印机打印? 为什么我的蓝牙耳机不能接电话? 所以, 我们怎么知道一个蓝牙设备有哪些功能呢, 连上它后, 它能不能接收我们发送的声音,能不能传文件给它, 简而言之, 我们怎么知道这个蓝牙设备的能力呢? 然后另一个设备需要什么样的能