Android蓝牙BLE通信实现

1. 引言

在Android开发中,蓝牙低功耗(BLE)通信是一项常见的技术。本文将指导你如何在Android应用中实现BLE通信,为了更好地理解整个流程,我们将采用表格的形式来展示步骤,并提供相应的代码和注释。

2. BLE通信流程

下面是一个简单的BLE通信流程表格,它将帮助你理解整个通信过程。

步骤 描述
步骤 1 初始化蓝牙适配器
步骤 2 扫描附近的BLE设备
步骤 3 连接到目标设备
步骤 4 发现目标设备的服务和特征
步骤 5 启用通知或指示器
步骤 6 读取、写入和监听数据
步骤 7 断开与目标设备的连接

下面我们将逐步解释每个步骤需要做什么,并提供相应的代码和注释。

3. 步骤详解

步骤 1:初始化蓝牙适配器

在开始BLE通信之前,我们需要初始化蓝牙适配器。首先,在AndroidManifest.xml文件中添加蓝牙权限:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

然后,在你的Activity或Fragment中,添加以下代码:

BluetoothManager bluetoothManager = (BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);
BluetoothAdapter bluetoothAdapter = bluetoothManager.getAdapter();

步骤 2:扫描附近的BLE设备

我们需要通过扫描来找到附近的BLE设备。在你的Activity或Fragment中添加以下代码:

BluetoothLeScanner bluetoothLeScanner = bluetoothAdapter.getBluetoothLeScanner();
bluetoothLeScanner.startScan(scanCallback);

然后,实现一个ScanCallback来处理扫描结果:

private ScanCallback scanCallback = new ScanCallback() {
    @Override
    public void onScanResult(int callbackType, ScanResult result) {
        // 处理扫描结果
    }

    @Override
    public void onScanFailed(int errorCode) {
        // 处理扫描失败
    }
};

步骤 3:连接到目标设备

一旦找到目标设备,我们可以通过其地址进行连接。添加以下代码:

BluetoothDevice targetDevice = result.getDevice(); // result是扫描结果中的一个设备
BluetoothGatt bluetoothGatt = targetDevice.connectGatt(context, false, gattCallback);

然后,实现一个BluetoothGattCallback来处理连接状态和事件:

private BluetoothGattCallback gattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        // 处理连接状态变化
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status) {
        // 处理服务发现
    }
};

步骤 4:发现目标设备的服务和特征

一旦连接成功,我们需要发现目标设备的服务和特征。在BluetoothGattCallback的onServicesDiscovered方法中添加以下代码:

List<BluetoothGattService> services = gatt.getServices();
for (BluetoothGattService service : services) {
    List<BluetoothGattCharacteristic> characteristics = service.getCharacteristics();
    for (BluetoothGattCharacteristic characteristic : characteristics) {
        // 处理特征
    }
}

步骤 5:启用通知或指示器

在读写数据之前,我们需要启用通知或指示器以接收数据的变化。在处理特征的代码中添加以下代码:

boolean result = gatt.setCharacteristicNotification(characteristic, true);
if (result) {
    BluetoothGattDescriptor descriptor = characteristic.getDescriptor(UUID.fromString("00002902-0000-1000-8000-00805f9b34fb"));
    descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
    gatt.writeDescriptor(descriptor);
}
``