Android BLE 知识总结
1.蓝牙介绍
1.1什么是蓝牙?
蓝牙( Bluetooth ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。蓝牙技术最初由电信巨头爱立信公司于1994年创制,当时是作为RS232数据线的替代方案。如今蓝牙由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理。
(https://baike.baidu.com/item/%E8%93%9D%E7%89%99/102670?fr=aladdin)
1.2蓝牙版本简介
蓝牙发展至今经历了8个版本的更新。1.1、1.2、2.0、2.1、3.0、4.0、4.1、4.2、5.0。蓝牙规范1.0、2.0,即基本速率(BR)和增强数据速率(EDR),蓝牙技术规范3.0,即高速(HS)技术规范,最大数据速率达到了24Mb/s。
按版本来划分:蓝牙可分为经典蓝牙模块(v1.1/1.2/2.0/2.1/3.0),低功耗蓝牙模块(v4.0/4.1/4.2),以及蓝牙双模模块(支持蓝牙所有版本,兼容低功耗蓝牙及经典蓝牙)。
经典蓝牙支持音频(HFP/HSP, A2DP)和数据(SPP, HID, OPP, PBAP等)两大类协议,在音箱,耳机,汽车电子及传统数传行业,由于苹果对经典蓝牙数据传输接口有限制(需要过MFI认证),加上功耗偏大,因此在目前移动互联应用中慢慢地被淘汰。因此低功耗蓝牙4.0顺势而出,由于可支持苹果4S以上及android4.3系统以上的数据传输,且功耗极低,目前正在被越来越多的移动互联设备所采用,但不支持音频协议及受数据传输速度限制,其应用也被限制在小数据传输行业。而蓝牙双模则是综合了两者的优缺点,既可以支持音频传输,同样可支持数据传输,并且兼容性也是两者之和(android可不受系统限制,同样支持苹果4S以后的数据传输),在对功耗要求不苛刻的情况下,是比较理想的选择。
2.低功耗蓝牙
2.1 BLE介绍
蓝牙 4.0 支持单模和双模两种部署方式,其中单模即是我们说的 BLE低功耗蓝牙(Bluetooth Low Energy),而双模指的是 Classic Bluetooth + BLE 。
2.2 经典蓝牙(Classic Bluetooth)与低功耗蓝牙(BLE)的区别
(1)经典蓝牙可以用与数据量比较大的传输,如语音,音乐,较高数据量传输等。
(2)BLE 特点就如其名,功耗更低的同时,对数据包做出了限制。所以适用于实时性要求比较高,但是数据速率比较低的产品,如鼠标,键盘,传感设备的数据发送等。
Android 4.3(API Level 18)开始引入Bluetooth Low Energy(BLE,低功耗蓝牙)的核心功能并提供了相应的 API, 应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。
Android BLE 使用的蓝牙协议是 GATT 协议, Android 开发中我们需要了解的一些 Bluetooth Low Energy 的专业术语。
蓝牙协议图
Service
一个低功耗蓝牙设备可以定义许多 Service, Service 可以理解为一个功能的集合。设备中每一个不同的 Service 都有一个 128 bit 的 UUID 作为这个 Service 的独立标志。蓝牙核心规范制定了两种不同的UUID,一种是基本的UUID,一种是代替基本UUID的16位UUID。所有的蓝牙技术联盟定义UUID共用了一个基本的UUID:
0x0000xxxx-0000-1000-8000-00805F9B34FB
为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。例如,心率测量特性使用0X2A37作为它的16位UUID,因此它完整的128位UUID为: 0x00002A37-0000-1000-8000-00805F9B34FB。 每一个service 和 characteristic在蓝牙的官网里面都有一个assgined Number (替代基本UUID的‘x’部分)。参考如何获得每个Service 和 Characteristic的uuid
手机的BLE默认有2个服务
(1)Service 通用属性规范 00001801-0000-1000-8000-00805f9b34fb (null)
a)Characteristic 服务改变 00002a05-0000-1000-8000-00805f9b34fb
(2)Service 通用接入规范 00001800-0000-1000-8000-00805f9b34fb
a)Characteristic 设备名称 00002a00-0000-1000-8000-00805f9b34fb
b)Characteristic 设备外观 00002a01-0000-1000-8000-00805f9b34fb (00 00)
Characteristic
在 Service 下面,又包括了许多的独立数据项,我们把这些独立的数据项称作 Characteristic。同样的,每一个 Characteristic 也有一个唯一的 UUID 作为标识符。在 Android 开发中,建立蓝牙连接后,我们说的通过蓝牙发送数据给外围设备就是往这些 Characteristic 中的 Value 字段写入数据;外围设备发送数据给手机就是监听这些 Charateristic 中的 Value 字段有没有变化,如果发生了变化,手机的 BLE API 就会收到一个监听的回调。
2.3 Android BLE API 简介
BluetoothAdapter
BluetoothAdapter 拥有基本的蓝牙操作,例如开启蓝牙扫描,使用已知的 MAC 地址 (BluetoothAdapter#getRemoteDevice)实例化一个 BluetoothDevice 用于连接蓝牙设备的操作等等。
BluetoothDevice
代表一个远程蓝牙设备。这个类可以让你连接所代表的蓝牙设备或者获取一些有关它的信息,例如它的名字,地址和绑定状态等等。
BluetoothGatt
这个类提供了 Bluetooth GATT 的基本功能。例如重新连接蓝牙设备,发现蓝牙设备的 Service 等等。
BluetoothGattService
这个类通过 BluetoothGatt#getService 获得,如果当前服务不可见那么将返回一个 null。这个类对应上面说过的 Service。我们可以通过这个类的 getCharacteristic(UUID uuid) 进一步获取 Characteristic 实现蓝牙数据的双向传输。
BluetoothGattCharacteristic
这个类对应上面提到的 Characteristic。通过这个类定义需要往外围设备写入的数据和读取外围设备发送过来的数据。