Android Bluetooth模块学习笔记
一、蓝牙基础知识
蓝牙(Bluetooth)是基于一种先进无线技术标准而发展起来的通信协议。该技术标准支持各类端点之间短距离数据通信。该协议采用低成本的收发器芯片设计,并且能够实现近距离通信且具有节能特性。
2.微波频段:使用2.402GGHz到2.480GHz(包括防护频带)的ISM波段的UHF无线电波
- 蓝牙系统采用跳频技术对数据进行分段处理。各通过79个特定的蓝牙通道依次发送相应的数据块。每个信道的工作频率设定为1MHz。
4.蓝牙遵循数据包传输,并采用主从架构作为其通信协议。每个主要装置最多可以在同一微波网络内连接到七个辅助装置。各个装置均会分享同一个时钟。
当蓝牙装置充当主设备时, 最多可与其连接七台从设备; 通常每个从设备仅与其所配接的一个主装置相连接; 所有这些不同类型的装置基于协议切换彼此的角色.
6. 功率射程

就射程而言,在大多数蓝牙应用场景中
8.最新版本:蓝牙4.2,发布于2014年12月2日(截止2016年3月22日)
9.每个设备都具有一个独特的48位地址码。然而这些地址并未包含在相应的连接请求信息中。然而用户可通过为其蓝牙装置设定特定标识符(Bluetooth装置标识),该标识符将被包含在所有相关方的数据记录及配对列表之中。
10.蓝牙框架

蓝牙核心技术由主机和控制器两部分构成;其中 controllers 包括 main controller 和 secondary controller.

12.蓝牙基本规范
蓝牙领域中包含四种基础规范(Profile),这些规范会被其他规范所采用。
GAP Profile: Generic Access Profile;该Profile确保不同Bluetooth设备之间能够实现相互发现,并从而实现设备间的连接。
(2)SDAP 规范:服务发现应用规范。通过该规范,在一个蓝牙设备上可以实现与其他蓝牙设备之间服务的互操作性,并可查询相关信息。
(3)SPP 规范:串行口通讯模拟器。
(4)GOEP 规范:通用对象交换协议。本规范名称虽略显复杂性,请注意其定义的内容即数据传输机制——包括同步、文件传输或数据推送操作等,并非特定于具体数据内容的传输方式;而是一种与具体数据内容无关的传输层协议——可作为通用的数据交换协议被任意应用程序采用以实现对自己定义的数据对象的传输功能。
13.蓝牙应用规范
BR/EDR profile(Android支持)
(1)A2DP(Advanced Audio Distribution Profile)
高级音频、立体声规范,包括A2DP Sink和A2DP Source;
(2)AVRCP(Audio/Video Remote Control Profile)
音视频远程控制规范,音乐播放、暂停等;
(3)HFP(Hands-Free Profile)
免提规范,用于蓝牙通话;
(4)HSP(Headset Profile)
耳机规范,用于蓝牙耳机;
(5)HID(Human Interface Device Profile)
人体接口设备规范,分为HID Host和HID Device;
(6)OPP(Object Push Profile)
对象推送规范,用于传输文件;
(7)PAN(Personal Area Networking Profile)
个人局域网规范,蓝牙网络共享;
(8)PBAP(Phone Book Access Profile)
电话号码簿访问规范;
(9)MAP(Message Access Profile)
信息访问规范;
(10)HDP(Health Device Profile)
健康设备规范,和一些健康设备进行通信;
(11)BLP(Blood Pressure Profile)
血压规范;
(12)FMP(Find Me Profile)
找我规范;
(13)HRP(Heart Rate Profile)
心率规范;
(14)HOGP(HID Over GATT Profile)
基于GATT的HID规范;
(15)TIP(Time Profile)
时间规范。
二、硬件部分知识
1.基础处理器
(1)AP:ApplicationProcessor应用处理器
基于ARM架构设计的中央处理器通常用于操作系统以及一些预设配置的加载。例如一台不具备电话功能的平板设备仅支持运行安卓或Windows 8系统通过AP配置即可完成设置
(2)BP:BasebandProcessor 基带处理器
架构相对于AP简单,处理电话、信息之类的功能。
(3)CP:coprocessor Processor 协处理器
基带芯片与协处理器(CP一般为多媒体加速器),作为辅助处理器使用,并通过处理主CPU的工作负载来加快操作速度。
(4)RF:Radio Frequency射频部分
无线信号的发射部分,如电话、蓝牙、WIFI信号发射、接收。
2.简单平板电脑结构框图

AP芯片+外设+Android系统
3.蓝牙硬件接口框图(以UART接口芯片为例)

(1)串行口:专门负责数据传输;
(2)语音采集接口:在通话过程中实现语音数据传输;
(3)电源管理:负责电源控制。
三、软件部分知识
1.Android Bluetooth Architecture蓝牙代码架构

1.1 串口驱动
Linux的内核的蓝牙驱动程、Linux的内核的蓝牙协议的层
1.2BlueZ的适配器

(1)内核代码:由驱动程序和BlueZ核心协议组成
驱动程序:具体负责在内核源代码下的蓝牙模块中的操作(支持Linux内核对各种接口的处理)包括:USB驱动模块、串口专用驱动以及其他相关驱动。
Bluetooth协议:实现了在内核源代码 kernel/net/bluetooth中的功能。具体包括:HCI(HCAP)、L2CAP(Link-Encapsulating Congestion Control Protocol)、HID(Human Identification Protocol)、RFCOMM(Radio Frequency Communications Protocol)、SCO(Short Conection Ordered)、SDP(Session Description Protocol)、BNEP等多种协议的实现。
(2)用户态程序及工具集:
涵盖应用程序接口以及BlueZ工具集。蓝紫提供函数库与相关应用接口设计,这一设计方便了程序开发人员构建蓝牙设备应用系统。蓝紫 utilities集合则构成了核心功能模块,能够实现对蓝牙设备的初始化以及控制过程
1.3 蓝牙相关的应用程序接口
Android.buletooth包中的各个Class(蓝牙在框架层的内容)

附:Google官方提供的蓝牙代码框架图

2.Hciattach:建立串口和蓝牙协议层的数据连接通道
3.数据传输流程
(1)uart口用于读取蓝牙模块的数据;
(2)uart口通过ldisc传输至hci_uart;
(3)hci_uart将数据发送至其上连接的h4;
(4)h4将数据发送至hci层面处理;
(5)hcis层负责将数据转发至l2cap层面;
(6)l2cap层面则会将信息进一步传递到rfcomm节点。
4.BluetoothAdapter:蓝牙适配器
从连接bluetoothSocket开始前就要持续操作它

5.常量介绍
(1)开关状态值
蓝牙关闭 : int STATE_OFF , 值为10, 蓝牙模块处于关闭状态;
蓝牙打开中 : int STATE_TURNING_ON , 值为11, 蓝牙模块正在打开;
蓝牙开启 : int STATE_ON , 值为12, 蓝牙模块处于开启状态;
蓝牙开启中 : int STATE_TURNING_OFF , 值为13, 蓝牙模块正在关闭;
蓝牙开关状态顺序 : STATE-OFF → STATE-STARTING_ON → STATE-BEGINNING_ON → STATE-STARTINGOFF → STATE-OFF;
(2)扫描状态值
无功能状态由变量SCAN_MODE_NONE定义,并设为20。在该状态下,查询扫描及页面扫描均不再支持。在该状态下蓝牙模块既无法识别其他设备也无需进行展示。
当前扫描模式设定为SCAN_MODE_CONNECTABLE类型,在此状态下系统报告其运行状态信息;其中查询功能已处于失效状态而页面仍可接收数据;此时蓝牙模块具备探测其他可连接设备的能力;但仅限于与之处于配对状态下的其他蓝牙设备;从可见性角度来看,在这种情况下只有已配对的蓝牙设备才可能被检测到;此外只有当存在彼此配对关系时才可能实现主动连接操作至对方装置
可见状态 : int 扫描模式(可连接性和可发现性),值为23;支持两种扫描方式均正常运行
查询扫描功能 : 其它设备可以扫描到本设备 , 指的是可见性可见;
页面扫描功能 : 可以主动扫描其它设备;
(3)蓝牙操作接收的广播
启动广播搜索 : String ACTION_DISCOVERY_STARTED, 蓝牙适配器进入远程设备搜索模式, 值为"android.bluetooth.action.DISCOVERY_START",启动过程中, 首先会持续12秒的查询扫描(12s内可见), 完成查询扫描后执行页面扫描流程(主动搜索), 此时系统须获取蓝牙权限才能完成操作;
当探测到蓝牙设备时(即搜索到蓝牙设备),系统将发送...
设备查找过程对资源有较高的消耗,在执行查找操作时,无法与远程蓝牙设备建立连接;同时已存在的连接也需要控制其带宽;若希望进行除了查找之外的其他操作,则应在开始这些操作前调用cancelDiscovery();
广播已成功搜索并发送 : String ACTION_DISCOVERY_FINISHED, 蓝牙模块发送相应的广播指令, 其值为 "android.bluetoothadapter.action.ACTIONDISCOVERYFINISHED", 需获取蓝牙通信权限;
蓝牙适配器名称变更事件 : String ACTION_LOCAL_NAME_CHANGED, 某个本地蓝牙设备更新了其标识符(字符串常量ACTION_LOCAL_NAME_CHANGED),该更新仅适用于本地设备;该事件还包含了额外的信息字段EXTRA_LOCAL_NAME(需要BLUETOOTH权限);
扫描模式变化事件 : String ACTION_SCAN_MODE_CHANGED,
蓝牙模块检测到当前scan mode状态已经发生变化,
该intent包含两个附加域:EXTRA SCAN_MODE和EXTRA PREVIOUS SCAN_MODE,
分别表示当前的新scan mode类型与上一次的old scan mode类型,
根据前后两种scan mode状态的变化情况采取相应的处理措施,
实现此功能需先获取bluetooth权限。
开关模式变化触发的蓝牙操作 : String ACTION_STATE_CHANGED, 当蓝牙模块的状态发生变化时, 该值为"android.bluetooth.adapter.action.STATE_CHANGED", 此消息的目的意图包含了EXTRA_STATE和EXTRA_PREVIOUS_STATE两个字段, 执行此操作时需要蓝牙权限;
(4)蓝牙操作请求的广播
启动蓝牙设备 : String ACTION_REQUEST_ENABLE, 发起操作, 其值为"android.bluetooth.adapter.action.REQUEST_ENABLE","
Intentintent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,requestCode);
在Activity类中的on setResult()方法内部可以实现结果处理,在该方法中若遇到蓝牙模块正常开启的情况,则应返回的结果码应为RESULT_OK;反之若遇到无法正常开启的情况,则应返回的结果码为RESULT_CANCELED。
打开和关闭蓝牙模块, 都可以通过ACTION_STATE_CHANGED广播来监听;
设备可发现状态:String ACTION_REQUEST_DISCOVERABLE表示设备可发现状态,默认值为'android.bluetooth.adapter.action.REQUEST_DISCOVERABLE'。允许向广播添加一个附加数据域,并指定EXTRA DISCOVERABLE_DURATION作为数据域类型;但须确保设备具备BLUETOOTH权限。在Activity的on setResult()方法中处理此结果:若成功,则返回指示码RESULT_OK;否则返回指示码RESULT_Canceled。
发现型意图字段被从BluetoothAdapter中获取到指定的动作请求属性进行初始化
discoverableIntentOutputStream(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
startActivityForResult(discoverableIntent,resultCode)
(5)附加域
附加域被安置在Intent对象中,并通过Intent课外加法(附加域,附加值)方法实现对附加域的添加;
该附加域支持以下几种扫描模式:SCAN_MODE_NONE,SCAN_MODE_CONNECTABLE,SCAN_MODE_CONNECTABLE DISCOVERABLE;
String EXTRA_SCAN_MODE :值为"android.bluetooth.adapter.extra.SCAN_MODE";
String EXTRA_PREVIOUSSCAN_MODE :等于"android.bluetooth.adapter.extra.PREVIOUSSCAN_MODE";
开关状态附加字段 : 该附加字段仅能取四个特定的状态值:关断、开启、关断中、开启中。
String EXTRA_STATE :值为"android.bluetooth.adapter.extra.STATE";
String 转换为 字符串(更具体)EXTRA_PREVIOUS_STATE 作为一个变量名(通常使用斜体):其值为字符串类型中的特定常量字符串 'android.bluetoothadapterextra.previous.state'
蓝牙额外本地名称域:String EXTRA_LOCAL_NAME, 存储ACTIONLOCALNAMECHANGED附加域的增补值(value),其值为"android.bluetoothadapter.extra.LOCALNAME";
可见时间附加域 : String EXTRA_DISCOVERABLE_DURATION, 表示为: ACTION_REQUEST_DISCOVERABLE 广播的有效持续时间长度, 其值等于: android.bluetoothadapter.extra.DISCOVERABLE_DURATION
(6)错误码
int ERROR ,这个值用来标记错误 , 方便自己使用的 , 没有实际意义。
6.A2DP连接的建立
A2DP_CONNECT上层代码流程表

