什么是GATT?
GATT的全名是Generic Attribute Profile(暂且翻译成:普通属性协议),它定义两个BLE设备通过叫做Service和Characteristic的东西进行通信。GATT就是使用了ATT(Attribute Protocol)协议,ATT协议把Service、 Characteristic遗迹对应的数据保存在一个查找表中,次查找表使用16 bit ID作为每一项的索引。一旦两个设备建立起了连接,GATT就开始起作用了,这也意味着,你必需完成前面的GAP协议。这里需要说明的是,GATT连接,必需先经过GAP协议。实际上,我们在Android开发中,可以直接使用设备的MAC地址发起连接,可以不经过扫描的步骤。这并不意味不需要经过GAP,实际上在芯片级别已经给你做好了,蓝牙芯片发起连接,总是先扫描设备,扫描到了才会发起连接。
GATT 连接需要特别注意的是:GATT连接是独占的。也就是一个 BLE 外设同时只能被一个中心设备连接。一旦外设被连接,它就会马上停止广播,这样它就对其他设备不可见了。当设备断开,它又开始广播。中心设备和外设需要双向通信的话,唯一的方式就是建立GATT连接。
GATT(Generic Attribute Profile)
由上图可以看出:
一个低功耗蓝牙(ble)可以包括多个Profile
一个Profile中有多个Service(通过uuid就可以找到对应的Service)
一个Service中有多个Characteristic(通过uuid就可以找到对应的Characteristic)
一个Characteristic中包括一个value和多个Descriptor(通过uuid就可以找到对应的Descriptor)
如何开发Ble?
在整个Ble开发中,我有使用别人比较优秀的第三方库辅助开发,推荐这个库:https://github.com/litesuits/android-lite-bluetoothLE , 开发起来真的很方便,使用也比较简单。
1. 准备工作
(1) 声明权限
(2) 添加lite-ble-0.9.2.jar库到工程中
这步应该不用讲解怎么添加了吧。
(3) 检测蓝牙是否打开并且创建蓝牙操作的对象
private LiteBluetooth liteBluetooth;
// 检查当前手机是否支持ble 蓝牙,如果不支持退出程序
if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
Toast.makeText(this, "ble_not_supported", Toast.LENGTH_SHORT).show();
}
// 初始化 Bluetooth adapter, 通过蓝牙管理器得到一个参考蓝牙适配器(API必须在以上android4.3或以上和版本)
// 1.获取bluetoothAdapter
final BluetoothManager bluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
// 2.检查设备上是否支持并开启蓝牙
if (mBluetoothAdapter == null) {
Toast.makeText(this, "ble_not_supported", Toast.LENGTH_SHORT).show();
return;
}
//创建liteBluetooth的单例对象,(BleUtil是自己写的类,实现单例的)
if (liteBluetooth == null)
liteBluetooth = BleUtil.getInstance(getApplicationContext());
// 为了确保设备上蓝牙能使用, 如果当前蓝牙设备没启用,弹出对话框向用户要求授予权限来启用
/