翻译之间先看几张BLE Stack图:
BLE Stack:
BLE GATT stack:
低功耗蓝牙(Bluetooth Low Energy)
Android4.3(API 18)引入BLE低功耗蓝牙,并且提供了相应的API供应用程序搜索蓝牙设备,查询服务,读写特性.与经典蓝牙相比,BLE的显著特点是低功耗, 使得android应用可以和具有低功耗要求的蓝牙设备进行通讯,如传感器,心率检测器,健身设备等等.
关键术语和概念(Key Terms and Concerpt)
Generic Attribute Profile(GATT): 通用属性协议
GATT配置文件是一个通用的规范, 用于在BLE链路上发送和接收被称为”属性”的数据块.目前所有的BLE应用都是基于GATT.- 蓝牙SIG规定了许多低功耗设备的配置文件.配置文件就是设备如何在特定应用中运转的规格说明.注意一个设备可以实现多个配置文件,例如:一个设备可以包含心率监测器和电量检测器.
Attribute Protocol(ATT) 属性协议
GATT是建立在ATT协议的基础上的.ATT对在BLE设备上运行做了优化,为此他使用了尽可能少的字节,每个属性都通过一个唯一的统一标识符(UUID)来标识,每个String类型的UUID使用是128bit标准格式,属性通过ATT被格式化为characteristics 和servicesCharacteristic 特性
一个CXharacteristic包含一个单一变量和0-n个用来描述characteristic变量的descriptor,characteristic可以被认为是一个类型, 类似于类.Descriptor 描述
Descriptor用来描述characteristic变量的属性.例如,一个descriptor可以规定一个可读的描述,或者一个characteristic变量可接受的范围,或者一个characteristic变量特定的测量单位.Service 服务
service是characteristic的集合.例如,你可能有一个叫Heart rate minitord的service,他包含了很多characteristic,如 heart rate measurement等等.可在bluetooth.org找到一个目前支持基于AGTT的配置文件和服务列表
角色和责任(Roles & Responsiblity)
- 一下是android设备和BLE设备交互时的角色和责任
- 中央 vs 外设: 使用与BLE连接本身.中央设备扫描,寻找广播,外围设备发出广播
- GATT服务端 vs GATT客户端: 决定了两个设备在建立连接后如何交互
- 为了方便理解,想象你有一个用于活动跟踪BLE设备,手机支持中央角色,后动跟踪器支持外围活动(为了建立BLE连接你需要注意两件事,只支持外围设备的两方或者只支持中央设备的两方不能互相通讯.
- 当手机和运动跟踪器建立连接后,他们开始向另一方传输GATT数据.哪一方作为服务器取决于他们传输数据的种类.例如,如果运动跟踪器想向手机报告传感器数据,运动跟踪器就是服务器.如果运动跟踪器更新来自手机的数据,手机作为服务器.
BLE权限(BLE Permissions)
- 为了在应用中使用Bluetooth特性,必须要声明BLUETOOTH权限.你需要这个权限区执行任何蓝牙通讯,例如请求连接,接收连接,传输数据.
- 如果你想要App应用初始化设备搜索或者手动操作蓝牙设置,你必须声明BLUETOOTH_ADMIN权限.注意:如何要使用BLUETOOTH权限,比先声明BLUETOOTH权限.
- 在manifest.xml文件中声明权限:
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
- 如果你想要声明你的APP应用仅仅支持具有BLE功能的设备,请声明下面权限:
<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>
- 然而,如果想要你的APP对不支持BLE的设备也有效,必须引入该元素在manifest文件中,但是
required=false.
在运行时可以通过PackagerManager.hasSystemFeature()
来判断BLE是否可用.
// Use this check to determine whether BLE is supported on the device. Then
// you can selectively disable BLE-related features.
if(!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this,R.string.ble_not_supported,Toast.LENGTH_SHORT).show();
finish();
}
启动BLE(Setting up BLE)
- 在使用BLE通讯前,请确认你的APP是否支持BLE,并且要保证蓝牙已打开(enable).注意:如果
<uses-feature....>
设定为false,此处检查是必须的. 如果APP不支持BLE,那就不能使用BLE任何特性.如果支持BLE,但是没有打开蓝牙,你可以请求在不退出应用打开蓝牙.这样,蓝牙就是通过BluetoothAdapter分2步启动.
1.获得BluetoothAdapter:
BluetoothAdapter在任何Bluetooth Activity中都是必备的.BluetoothAdapter代表了设备本身的适配器.整个系统有一个适配器,你的应用可以BluetoothAdapter和整个应用交互.下面代码显示了如何获取BluetoothAdapter
此方法使用getSystemService()来获得一个BluetoothMangager的实例, BluetoothManager实例能够用来获取一个BluetoothAdapter的一个实例.在andriod4.3引入BluetoothManager.
// Initializes Bluetooth adapter.
final BluetoothManager bluetoothManager =(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
2.打开蓝牙设备:
下一步,你必须保证Bluetooth是开启的.调用isEnable()可以检查当前蓝牙是否开启.如果返回false,表示蓝牙为开启.下面代码用于检测蓝牙是否开启,如果没有,会显示一个错误信息让用户去开启蓝牙.
private BluetoothAdapter mBluetoothAdapter;
...
// Ensures Bluetooth is available on the device and it is enabled. If not,
// displays a dialog requesting user permission to enable Bluetooth.
if (mBluetoothAdapter == null || !mBluetoothAdapter.isEnabled()) {
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
搜索BLE设备(Finding BLE Device)
- 使用startLeScan()搜索BLE设备,此方法将
BluetoothAdapter.LeScanCallback
作为一个参数,你必须实现该回调接口,因为接口决定着扫描结果是怎么样返回的.扫描很耗电,应当遵守如下准则:
- 找到设备立即关掉扫描功能
- 不要反复扫描,并且设置扫描时间限制,先前可用的设备可能现在已经移出扫描范围,继续扫描可能耗干电池.
- 下面代码是如何开启和关闭扫描:
//Activity for scanning and displaying available BLE devices.
public class DeviceScanActivity extends ListActivity {
private BluetoothAdapter mBluetoothAdapter;
private boolean mScanning;