Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE(低功耗)蓝牙开发,它们的开发是有区别的,如果还分不清经典蓝牙和BLE(低功耗)蓝牙的小伙伴,可以先看Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别
本文是针对BLE蓝牙开发的,如果是经典蓝牙开发,可以看Android蓝牙开发—经典蓝牙详细开发流程
注意:蓝牙4.0只有android4.3或4.3以上才支持
简单介绍
基本概念
1、Generic Access Profile(GAP)
用来控制设备连接和广播,GAP使你的设备被其他设备可见,并决定了你的设备是否可以或者怎样与合同设备进行交互。
2、Generic Attribute Profile(GATT)
通过BLE连接,读写属性类数据的Profile通用规范,现在所有的BLE应用Profile都是基于GATT的。
3、Attribute Protocol (ATT)
GATT是基于ATTProtocol的,ATT针对BLE设备做了专门的优化,具体就是在传输过程中使用尽量少的数据,每个属性都有一个唯一的UUID,属性将以characteristics and services的形式传输。
4、Characteristic
Characteristic可以理解为一个数据类型,它包括一个value和0至多个对次value的描述(Descriptor)。
5、Descriptor
对Characteristic的描述,例如范围、计量单位等。
6、Service
Characteristic的集合。例如一个service叫做“Heart Rate Monitor”,它可能包含多个Characteristics,其中可能包含一个叫做“heart ratemeasurement”的Characteristic。
7、UUID
唯一标示符,每个Service,Characteristic,Descriptor,都是由一个UUID定义。
Android ble api
1、BluetoothManager
通过BluetoothManager来获取BluetoothAdapter。
2、BluetoothAdapter
代表了移动设备的本地的蓝牙适配器, 通过该蓝牙适配器可以对蓝牙进行基本操作,一个Android系统只有一个BluetoothAdapter,通过BluetoothManager获取。
3、BluetoothDevice
扫描后发现可连接的设备,获取已经连接的设备,通过它可以获取到BluetoothGatt。
4、BluetoothGatt
继承BluetoothProfile,通过BluetoothGatt可以连接设备(connect),发现服务(discoverServices),并把相应地属性返回到BluetoothGattCallback,可以看成蓝牙设备从连接到断开的生命周期。
5、BluetoothGattService
服务,Characteristic的集合。
6、BluetoothGattCharacteristic
相当于一个数据类型,可以看成一个特征或能力,它包括一个value和0~n个value的描述(BluetoothGattDescriptor)。
7、BluetoothGattDescriptor
描述符,对Characteristic的描述,包括范围、计量单位等。
8、BluetoothProfile
一个通用的规范,按照这个规范来收发数据。
9、BluetoothGattCallback
已经连接上设备,对设备的某些操作后返回的结果。
简单总结:当我们扫描后发现多个设备BluetoothDevice,每个设备下会有很多服务BluetoothGattService,这些服务通过service_uuid(唯一标识符)来区分,每个服务下又会有很多特征BluetoothGattCharacteristic,这些特征通过uuid来区分的,它是手机与BLE终端设备交换数据的关键。而BluetoothGatt可以看成手机与BLE终端设备建立通信的一个管道,只有有了这个管道,才有了通信的前提。
开发流程
开发的流程和经典蓝牙是一样的,都需要以下这几个步骤。
- 开启蓝牙
- 扫描蓝牙
- 绑定蓝牙
- 连接蓝牙
- 通信
开启蓝牙
1.获取BluetoothAdapter对象
这里有两种方法可以获取到BluetoothAdapter对象(区别在于版本不同而已,没有太大的区别)
第一种通过BluetoothManager对象获取
final BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter mBluetoothAdapter = bluetoothManager.getAdapter();
第二种通过单例获取
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
2.判断是否有蓝牙功能模块
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
//有蓝牙功能模块
}
3.判断设备是否支持蓝牙