Android BLE 编程简介

蓝牙低能耗(Bluetooth Low Energy,BLE)是一种无线通信技术,广泛应用于物联网设备、可穿戴设备、智能家居产品等领域。与传统的蓝牙技术相比,BLE 更加节能,适合传输少量数据。本文将介绍如何在 Android 中使用 BLE 编程,涵盖基本概念、流程以及代码示例。

BLE 基础概念

在开始之前,我们需要了解一些 BLE 的基本概念:

  • GATT(通用属性配置文件):定义了在 BLE 设备之间通信的标准协议。
  • 服务(Service):是一组相关的功能和特征。
  • 特征(Characteristic):是服务中的一个数据点,包含数据的值和属性。

开发环境准备

要进行 Android BLE 开发,您需要以下条件:

  1. Android Studio:安装并配置好Android Studio。
  2. Android 设备:支持 BLE 功能的设备。
  3. Android SDK:确保已安装至少 API 级别 18(Android 4.3),因为BLE功能是在这个版本中引入的。

BLE 编程步骤

以下是使用 Android BLE 的基本流程:

flowchart TD
    A[开始] --> B[检查是否支持 BLE]
    B --> C[获取 BluetoothAdapter]
    C --> D[启动 BLE 扫描]
    D --> E[连接 BLE 设备]
    E --> F[发现服务和特征]
    F --> G[读写特征]
    G --> H[断开连接]
    H --> I[结束]

代码示例

接下来,我们将一步步实现这个流程。

1. 检查是否支持 BLE

首先,检查设备是否支持 BLE:

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

if (bluetoothAdapter == null || !bluetoothAdapter.isMultipleAdvertisementSupported()) {
    // 设备不支持 BLE
    Log.e("BLE", "当前设备不支持 BLE");
    return;
}
2. 启动 BLE 扫描

使用 BluetoothLeScanner 启动 BLE 设备扫描:

private void startScan() {
    BluetoothLeScanner scanner = bluetoothAdapter.getBluetoothLeScanner();
    scanner.startScan(new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
            super.onScanResult(callbackType, result);
            // 获取扫描到的 BLE 设备
            BluetoothDevice device = result.getDevice();
            Log.i("BLE", "找到设备: " + device.getName() + " " + device.getAddress());
        }
    });
}
3. 连接 BLE 设备

找到设备后,接下来需要连接到该设备:

private void connectToDevice(BluetoothDevice device) {
    device.connectGatt(this, false, new BluetoothGattCallback() {
        @Override
        public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
            if (newState == BluetoothProfile.STATE_CONNECTED) {
                Log.i("BLE", "已连接到设备");
                gatt.discoverServices();
            } else if (newState == BluetoothProfile.STATE_DISCONNECTED) {
                Log.i("BLE", "设备已断开连接");
            }
        }
    });
}
4. 发现服务和特征

连接成功后,我们可以发现 GATT 服务和特征:

@Override
public void onServicesDiscovered(BluetoothGatt gatt, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        BluetoothGattService service = gatt.getService(UUID.fromString("服务UUID"));
        BluetoothGattCharacteristic characteristic = service.getCharacteristic(UUID.fromString("特征UUID"));
        
        // 读取特征值
        gatt.readCharacteristic(characteristic);
    }
}
5. 读写特征

在获得特征之后,可以对其进行读写操作:

@Override
public void onCharacteristicRead(BluetoothGatt gatt, BluetoothGattCharacteristic characteristic, int status) {
    if (status == BluetoothGatt.GATT_SUCCESS) {
        byte[] value = characteristic.getValue();
        Log.i("BLE", "读取到的特征值: " + Arrays.toString(value));
    }
}

// 向特征写入数据
private void writeCharacteristic(BluetoothGattCharacteristic characteristic, byte[] data) {
    characteristic.setValue(data);
    bluetoothGatt.writeCharacteristic(characteristic);
}
6. 断开连接

在完成所有操作后,不要忘记断开连接和清理资源:

private void disconnect() {
    if (bluetoothGatt != null) {
        bluetoothGatt.disconnect();
        bluetoothGatt.close();
    }
}

总结

在这篇文章中,我们学习了如何使用 Android BLE API 进行基本的 BLE 编程。通过上述代码示例和流程图,您应该能够掌握连接和通信的基本步骤。

蓝牙低能耗技术为开发可穿戴设备和智能家居产品提供了广泛的机会。虽然实现过程有些复杂,但只需持续学习和实践,您将逐步掌握这项技术所需的技能。希望这篇文章对您有所帮助,鼓励您在 BLE 编程的道路上不断探索与尝试!