随着智能设备的普及,基于IoT的“万物互联”时代越来越近。低功耗蓝牙(Bluetooth Low Energy,简称BLE) 作为近距离无线传输的重要手段之一,相对于传统蓝牙显著地降低了功耗,所以未来可能会在IoT领域大展身手。刚好最近开发了 BLE 相关的功能,遇到了一些困难,所以整了个基于 Android平台 的 低功耗蓝牙开发指南,希望帮助大家更好的入坑。
关键术语和概念
1. Generic Attribute Profile(GATT):
GATT profile是一种关于发送和接收简短数据片段的一般规范,这种简短数据片段例如在BLE的连接上众所周知的“attribute(属性)”等。当前所有低功耗应用程序的profile都基于GATT。另外,蓝牙技术联盟(Bluetooth SIG)已经为很多BLE设备定义了profile。profile就是一种在指定的应用程序中定义设备如何工作的规范。注意,一台设备可以实现多个profile。例如,一台设备可以包含心率监视器和电池电量探测器。
2. Attribute Protocol(ATT,属性协议):
GATT构建在ATT的基础之上,因此也总被成为GATT/ATT。ATT针对BLE设备的运行进行了优化。为此,它会尽可能的使用更少的字节数据。每一个属性都通过UUID来唯一确定。UUID就是一个标准128位格式的字符串ID,用于唯一确定一个信息。属性通过ATT协议格式化为characteristics和services后进行传输。
3. Service:
一个service包含一个或多个characteristic。例如,你可以持有一个名为“心率监视器”的service,它包含一个characteristic例如“心率测量”。你可以在bluetooth.org上找到一系列基于GATT的profile和service
4. Characteristic:
一个characteristic中包含一段数据,以及0个或多个用于描述characteristic值的descriptor。可以将characteristic认为是一种类型,类似于一个类。
5. Descriptor:
Descriptor(描述符)中定义的属性用于描述一个characteristic值。例如,一个descriptor可以为一个characteristic的值指定一个在可接受范围内的可读性描述,或者为一个characteristic的值指定一个计量单位。
Tips: 对于 BLE 应用开发而言,比较重要的是后面三个概念。在应用开发时,中心设备与外围设备建立连接后,找到外围设备BLE程序中运行的对应 service ,然后取出 service 中包含的 characteristic ,通过characteristic携带数据进行传递而实现设备间数据的通信。
那么,what is 中心设备 or 外围设备?来往下看
角色和职能
对于 BLE 而言,要完成连接和数据通信必须拥有两种角色: 中心(central)设备 和 外围(peripheral)设备:
- 中心设备:负责扫描和连接附近的BLE设备,属于主动扫描和主动连接的角色。一般手机就是作为 BLE 中的中心设备,去连接各种蓝牙设备的。
- 外围设备:负责向外发送广播包,属于被扫描和被连接的角色。如小米智能手环等蓝牙设备。
对于Android上层应用开发而言,通常只会涉及到中心设备端程序的开发,一般外围设备端程序的开发需求并不多见。但是基于学习的目的,接下来会分别对中心设备端和外围设备端的程序开发进行讲解。
另外,BLE功能对Android系统版本是有要求的:
Android 4.3(API Level 18) 开始提供了中心设备需要的扫描和连接等API;
Android 5.0 (API Level 21) 开始才提供了外围设备需要的向外发送广播包的API。
所以,低于这两个版本的系统,目前是无法实现对应功能的。
设备间的数据通信
数据通信原理
这里简单描述下BLE底层的数据传输原理。假设设备A(中心设备)和设备B(外围设备)已经成功建立连接,设备A将周期性以CI(connection interval)为间隔向设备B发送数据包,而设备B也周期性地以CI为间隔打开射频接收窗口以接收设备A的数据包。同时按照蓝牙spec要求,设备B收到设备A数据包150us后,设备B切换到发送状态,把自己的数据发给设备A;设备A则切换到接收状态,接收设备B发过来的数据。由此可见,连接状态下,设备A和设备B的射频发送和接收窗口都是周期性地有计划地开和关,而且开的时间非常短,从而显著地降低了系统功耗。
数据传输限制
基于BLE协议栈的实现,所以数据通信时,每次只能发送最大为 20 byte 的数据。如果有传输大于20byte数据的需求,就需要通过数据分包来解决了。
End-----
接下来计划分几篇文章,通过两个Android终端之间实现数据通信的实例,来讲解中心设备端和外围设备端的程序开发以及数据分包发送的实现,并附上源码。
有问题欢迎一起探讨哦!!!