Android 蓝牙BLE开发完全指南
如果你想开发一款能够与周围的蓝牙BLE设备通信的Android应用程序,那么你需要了解如何使用Android提供的Bluetooth Low Energy(BLE)API。本指南将帮助你快速入门BLE开发,并通过两个示例,详细介绍如何使用Android BLE API建立连接、搜索设备、读写数据等操作。
基础概念
BLE简介
Bluetooth Low Energy(BLE),又称为Bluetooth LE、Bluetooth Smart,是一种低功耗的蓝牙协议,用于连接需要节省能源的设备(如智能手表、健康设备等)。BLE设备的最大特点就是低功耗,因此它是智能家居、物联网、移动设备等领域非常重要的技术。
BLE架构
BLE协议栈通常由三个层次构成:应用程序层、核心协议层以及物理层。其中,核心协议层是BLE协议栈的核心部分,主要完成设备的发现、连接、读写等工作。
BLE UUID
UUID(Universally Unique Identifier)是用于唯一标识蓝牙BLE设备及其服务和特征的标识符。一个BLE设备可能包含多个服务和特征,每个服务或特征都有一个唯一的UUID。
BLE GATT
GATT(Generic Attribute Profile)是针对BLE设备的数据交换协议。GATT的基本概念包括服务、特征、描述符等。服务代表一个功能模块,特征则表示一个服务内的数据单元,描述符则用于描述某个特征的属性。
Android BLE API
BLE API概述
Android 4.3以上版本提供了蓝牙低功耗(BLE)API,使得Android应用程序可以直接与BLE设备通信。BLE API包含BluetoothManager、BluetoothAdapter、BluetoothDevice、BluetoothGatt等类,通过这些类可以完成BLE设备的搜索、连接、读写等操作。
BLE权限
在使用BLE API时,需要在AndroidManifest.xml文件中添加蓝牙权限:
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
获取BluetoothManager和BluetoothAdapter对象
在使用BLE API之前,首先需要获取BluetoothManager和BluetoothAdapter对象。获取BluetoothManager对象的方法如下:
final BluetoothManager bluetoothManager =
(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
然后可以通过BluetoothManager对象获取BluetoothAdapter对象:
final BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();
搜索BLE设备
使用BluetoothAdapter.startLeScan()方法可以搜索周围的BLE设备并返回它们的BluetoothDevice对象。
bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback(){
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
// 处理搜索到的设备
}
});
在搜索到设备后,可以使用BluetoothDevice.getName()方法获取设备名称,使用BluetoothDevice.getAddress()方法获取设备MAC地址。
建立连接
建立BLE连接需要首先获取BluetoothDevice对象,然后使用该对象的connectGatt()方法建立Gatt连接。
BluetoothGatt gatt = device.connectGatt(context, false, gattCallback);
在建立连接时,需要传入一个BluetoothGattCallback对象,该对象会在连接状态变化、服务发现、特征读写等事件发生时被回调。
发现服务
在BLE连接建立成功后,需要使用BluetoothGatt.discoverServices()方法发现BLE设备中的服务。
gatt.discoverServices();
在服务发现成功后,会回调BluetoothGattCallback.onServicesDiscovered()方法。
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status){
if(status == BluetoothGatt.GATT_SUCCESS){
// 处理发现的服务
}
}
收发数据
收发BLE数据主要通过BluetoothGattCharacteristic对象实现,在发现设备的服务和特征后,可以使用BluetoothGatt.readCharacteristic()方法读取数据,使用BluetoothGatt.writeCharacteristic()方法写入数据。
BluetoothGattCharacteristic characteristic = gattCharacteristic.getService().getCharacteristic(UUID);
gatt.readCharacteristic(characteristic);
gatt.writeCharacteristic(characteristic);
在数据读写完成后,会回调BluetoothGattCallback.onCharacteristicRead()或BluetoothGattCallback.onCharacteristicWrite()方法。
示例一
接下来我们通过一个简单的BLE操作示例来说明如何实现BLE设备的搜索、连接、读写。
- 搜索BLE设备
bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback(){
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
if(device.getName().equals("BLE设备名称")){
bluetoothAdapter.stopLeScan(this);
connect(device);
}
}
});
- 连接BLE设备
BluetoothGatt gatt;
private void connect(BluetoothDevice device){
gatt = device.connectGatt(context, false, gattCallback);
}
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback(){
@Override
public void onConnectionStateChange(final BluetoothGatt gatt, int status, int newState){
if(newState == BluetoothProfile.STATE_CONNECTED){
gatt.discoverServices();
} else if(newState == BluetoothProfile.STATE_DISCONNECTED){
gatt.close();
}
}
};
- 发现服务
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status){
if(status == BluetoothGatt.GATT_SUCCESS){
BluetoothGattService service = gatt.getService(UUID_SERVICE);
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_CHARACTERISTIC);
gatt.setCharacteristicNotification(characteristic, true);
}
}
- 读取/写入数据
@Override
public void onCharacteristicRead(final BluetoothGatt gatt, final BluetoothGattCharacteristic characteristic, int status) {
if (status == BluetoothGatt.GATT_SUCCESS) {
byte[] data = characteristic.getValue();
// 处理读取到的数据
}
}
public void writeData(byte[] data){
BluetoothGattService service = gatt.getService(UUID_SERVICE);
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_CHARACTERISTIC);
characteristic.setValue(data);
gatt.writeCharacteristic(characteristic);
}
示例二
这个示例通过一个心率监测器来说明如何使用BLE API与BLE设备通信。
- 搜索心率监测器
bluetoothAdapter.startLeScan(new BluetoothAdapter.LeScanCallback(){
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord){
if(device.getName().equals("Heart Rate Monitor")){
bluetoothAdapter.stopLeScan(this);
connect(device);
}
}
});
- 连接心率监测器
BluetoothGatt gatt;
private void connect(BluetoothDevice device){
gatt = device.connectGatt(context, false, gattCallback);
}
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback(){
@Override
public void onConnectionStateChange(final BluetoothGatt gatt, int status, int newState){
if(newState == BluetoothProfile.STATE_CONNECTED){
gatt.discoverServices();
} else if(newState == BluetoothProfile.STATE_DISCONNECTED){
gatt.close();
}
}
};
- 发现服务
@Override
public void onServicesDiscovered(final BluetoothGatt gatt, int status){
if(status == BluetoothGatt.GATT_SUCCESS){
BluetoothGattService service = gatt.getService(UUID_SERVICE);
BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID_CHARACTERISTIC);
gatt.setCharacteristicNotification(characteristic, true);
BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID_DESCRIPTOR);
descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
gatt.writeDescriptor(descriptor);
}
}
- 接收心率数据
@Override
public void onCharacteristicChanged(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic) {
if (UUID_CHARACTERISTIC.equals(characteristic.getUuid())) {
byte[] data = characteristic.getValue();
int flags = data[0] & 0xFF;
int format = (flags & 0x01) == 0 ? BluetoothGattCharacteristic.FORMAT_UINT8 : BluetoothGattCharacteristic.FORMAT_UINT16;
int heartRate = characteristic.getIntValue(format, 1);
// 处理心率数据
}
}
FQA
什么是支持BLE的Android设备?
Android 4.3以上版本支持BLE API,但即使设备支持BLE,也有可能会遇到兼容性问题。因此,在开发使用BLE的应用程序前需要了解设备的具体BLE特性。
为什么我搜索不到BLE设备?
搜索BLE设备需要打开蓝牙,并且设备的蓝牙需要处于可检测状态。如果搜索BLE设备时不成功,请确认蓝牙是否已经打开,并且设备是否处于可检测状态。
如何重新连接已连接的BLE设备?
通过调用BluetoothDevice.connectGatt()方法并传递false作为autoConnect参数可以重新连接已连接的BLE设备。另外,也可以使用BluetoothGatt.connect()方法重新连接。
如何处理蓝牙连接中断?
BLE设备的连接可能会由于信号中断、蓝牙关闭等原因而中断。当连接中断时,Android会回调BluetoothGattCallback.onConnectionStateChange()方法,并发送一个断开连接的广播。在收到此广播后,应用程序可以尝试重新连接设备。
结论
本指南介绍了如何使用Android BLE API进行BLE设备的搜索、连接、读写数据等操作。通过这些API,我们可以轻松地与BLE设备通信,并将BLE技术应用到各种智能设备中,为用户提供更好的产品和服务。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android 蓝牙BLE开发完全指南 - Python技术站