Android之蓝牙驱动开发总结
一 Bluetooth基本概念 1
二 Android Bluetooth架构 1
2.1 Bluetooth架构图 1
2.2 Bluetooth代码层次结构 3
三 Bluetooth协议栈分析 4
3.1 蓝牙协议栈 4
3.2 Android与蓝牙协议栈的关系 5
四 Bluetooth之HCI层分析 5
4.1 HCI层与基带的通信方式 6
4.2 包的分析及研究 7
4.3 通信过程的研究与分析 8
五 Bluetooth之编程实现 8
5.1 HCI层编程 8
5.2 L2CAP层编程 10
5.3 SDP层编程 12
六 Bluetooth之启动过程实现 13
6.1 Bluetooth启动步骤 14
6.2 Bluetooth启动流程 14
6.3 Bluetooth数据流向 14
6.4 Bluez控制流程 14
6.5 Bluetooth启动过程分析 15
七 Bluetooth之驱动移植 15
7.1 android系统配置 15
7.2 启动项修改 16
7.3 电源管理rfkill驱动 16
7.4 Rebuild Android image and reboot 16
7.5 实现BT睡眠唤醒机制 16
7.6 系统集成 17
八 Bluetooth之调试与编译 17
8.1 Bluetooth驱动调试 17
8.2 Bluetooth 调试工具 18
九 Bluetooth之应用程序开发 18
9.1 Bluetooth的API开发 18
9.2 The Basics开发 18
9.3 Bluetooth Permissions开发 19
9.4 Setting Up Bluetooth服务 19
9.5 Finding Devices服务 20
9.6 Connecting Devices服务 22
9.7 Managing a Connection服务 26
9.8 Working with Profiles服务 28
十 总结与疑问 29
一 Bluetooth基本概念
蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。它的传输距离为10cm~10m,如果增加功率或是加上某些外设便可达到100m的传输距离。它采用2.4GHz ISM频段和调频、跳频技术,使用权向纠错编码、ARQ、TDD和基带协议。TDMA每时隙为0.625μs,基带符合速率为1Mb/s。蓝牙支持64kb/s实时语音传输和数据传输,语音编码为CVSD,发射功率分别为1mW、2.5mW和100mW,并使用全球统一的48比特的设备识别码。由于蓝牙采用无线接口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该技术功耗低、对人体危害小,而且应用简单、容易实现,所以易于推广。
蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。
二 Android Bluetooth架构
2.1 Bluetooth架构图
Android蓝牙系统分为四个层次,内核层、BlueZ库、BlueTooth的适配库、BlueTooth的JNI部分、Java框架层、应用层。下面先来分析Android的蓝牙协议栈。
图1 面向库的架构视图
Linuxkernel层:
bluez协议栈、uart驱动, h4协议, hci,l2cap, sco, rfcomm
bluez层:
这是bluez用户空间的库,开源的bluetooth代码,包括很多协议,生成libbluetooth.so。
library层:
libbluedroid.so等
framework层:
实现了Headset /Handsfree 和 A2DP/AVRCP profile,但其实现方式不同Handset/Handfree是直接 在bluez的RFCOMM Socket上开发的,没有利用bluez的audio plugin,而A2DP/AVRCP是在bluez的audio plugin基础上开发的,大大降低了实现的难度。
Android的蓝牙协议栈采用BlueZ来实现,BlueZ分为两部分:内核代码和用户态程序及工具集。
图2 面向进程的架构视图
2.2 Bluetooth代码层次结构
(1)JAVA层
frameworks/base/core/java/android/bluetooth/
包含了bluetooth的JAVA类。
(2)JNI层
frameworks/base/core/jni/android_bluetooth_开头的文件
定义了bluez通过JNI到上层的接口。
frameworks/base/core/jni/android_server_bluetoothservice.cpp
调用硬件适配层的接口system/bluetooth/bluedroid/bluetooth.c
(3)bluez库
external/bluez/
这是bluez用户空间的库,开源的bluetooth代码,包括很多协议,生成libbluetooth.so。headset
(4)硬件适配层
system/bluetooth/bluedroid/bluetooth.c
包含了对硬件操作的接口
system/bluetooth/data/*一些配置文件,复制到/etc/bluetooth/。
还有其他一些测试代码和工具。
内核代码主要由BlueZ核心协议和驱动程序组成;蓝牙协议实现在内核源代码net/bluetooth中,驱动程序位于内核源代码目录driver/bluetooth中。用户态程序及工具集主要包括应用程序接口和BlueZ工具集,位于Android源代码目录externel/bluetooth(注:Android版本不一样,有的在externel/bluez目录下)中。
三 Bluetooth协议栈分析
3.1 蓝牙协议栈
蓝牙协议栈的体系结构由底层硬件模块、中间协议层和高端应用层三部分组成。
(1)底层硬件模块
组成:
链路管理协议(Link ManagerProtocol,LMP);
基带(Base Band,BB);
射频(Radio Frequency,RF)。
功能:
射频(RF)通过2.4GHz的ISM频段实现数据流的过滤和传输。
基带(BB)提供两种不同的物理链路,即同步面向连接链路(Synchronous Connection Oriented,SCO)和异步无连接链路(AsynchronousConnection Less,ACL),负责跳频和蓝
牙数据,及信息帧的传输,且对所有类型的数据包提供不同层次的前向纠错码(Frequency Error Correction,FEC)或循环冗余度差错校验(CyclicRedundancy Check,CRC)。
链路管理协议(LMP)负责两个或多个设备链路的建立和拆除,及链路的安全和控制,如鉴权和加密、控制和协商基带包的大小等,它为上层软件模块提供了不同的访问入口。
主机控制器接口(HostController Interface,HCI)是蓝牙协议中软硬件之间的接口,提供了一个调用下层BB、LMP、状态和控制寄存器等硬件的统一命令,上下两个模块接口之间的消息和数据的传递必须通过HCI的解释才能进行。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论