React Native BLE 开发实战:react-native-ble-plx 核心功能详解
前言
在移动应用开发中,蓝牙低功耗(BLE)技术因其低功耗特性被广泛应用于物联网设备连接。react-native-ble-plx 是一个优秀的 React Native 蓝牙库,为开发者提供了强大的 BLE 功能支持。本文将深入解析该库的核心功能和使用方法,帮助开发者快速掌握 BLE 开发的关键技术。
设备连接状态监控
断开连接事件处理
在实际应用中,设备可能会因各种原因断开连接。react-native-ble-plx 提供了 onDeviceDisconnected
方法来监控设备断开事件,开发者可以基于此实现自定义的重连逻辑或用户提示。
const setupDeviceDisconnectMonitor = (targetDeviceId: string) => {
bleManager.onDeviceDisconnected(targetDeviceId, handleDisconnection)
}
const handleDisconnection = (error: BleError | null, device: Device | null) => {
if (error) {
console.error('断开连接错误:', JSON.stringify(error, null, 2))
return
}
if (device) {
console.log('设备已断开:', device.id)
// 自动重连逻辑
device.connect().catch(err => {
console.error('重连失败:', err)
})
}
}
重要说明:连接状态监控仅在应用处于前台时有效,iOS 和 Android 系统出于节能考虑会限制后台的蓝牙操作。
特征值读写操作
设备连接准备
建立 BLE 连接需要两个关键步骤:
- 物理层连接:
device.connect()
- 服务发现:
device.discoverAllServicesAndCharacteristics()
async function connectToDevice(device) {
try {
// 第一步:建立物理连接
const connectedDevice = await device.connect()
// 第二步:发现所有服务和特征
const readyDevice = await connectedDevice.discoverAllServicesAndCharacteristics()
// 现在可以进行读写操作
return readyDevice
} catch (error) {
console.error('连接过程出错:', error)
throw error
}
}
特征值读取
读取特征值时,需要指定服务UUID和特征UUID:
async function readCharacteristic(device, serviceUUID, characteristicUUID) {
try {
const characteristic = await device.readCharacteristicForService(
serviceUUID,
characteristicUUID
)
console.log('读取到的值:', characteristic.value)
return characteristic.value
} catch (error) {
console.error('读取特征值失败:', error)
throw error
}
}
特征值写入
写入操作有两种模式:
- 带响应写入:确保数据正确传输,等待设备确认
- 不带响应写入:快速发送但不保证送达
// 带响应写入(可靠)
async function writeWithResponse(device, serviceUUID, characteristicUUID, value) {
try {
await device.writeCharacteristicWithResponseForService(
serviceUUID,
characteristicUUID,
value
)
console.log('写入成功')
} catch (error) {
console.error('写入失败:', error)
}
}
// 不带响应写入(快速)
async function writeWithoutResponse(device, serviceUUID, characteristicUUID, value) {
try {
await device.writeCharacteristicWithoutResponseForService(
serviceUUID,
characteristicUUID,
value
)
console.log('写入请求已发送')
} catch (error) {
console.error('写入失败:', error)
}
}
已连接设备管理
获取系统已连接设备
当设备已与操作系统配对但未被当前应用连接时,可以使用以下方法获取并连接:
async function connectToSystemDevice(serviceUUIDs, targetDeviceId) {
try {
const devices = await bleManager.getConnectedDevices(serviceUUIDs)
const targetDevice = devices.find(d => d.id === targetDeviceId)
if (targetDevice && !targetDevice.isConnected) {
await targetDevice.connect()
console.log('已连接到系统设备')
}
} catch (error) {
console.error('连接系统设备失败:', error)
}
}
调试与日志收集
启用详细日志
在开发阶段,启用详细日志有助于排查问题:
import { LogLevel } from 'react-native-ble-plx'
// 设置日志级别为详细
bleManager.setLogLevel(LogLevel.Verbose)
平台特定日志收集
Android 日志
在 Android Studio 中使用 Logcat 查看日志,建议设置以下过滤器:
package:mine (tag:BluetoothGatt | tag:ReactNativeJS | RxBle)
iOS 日志
在 Xcode 中通过控制台查看实时日志输出。
最佳实践建议
- 连接管理:实现稳健的重连机制,处理各种断开场景
- 错误处理:对所有BLE操作添加适当的错误处理
- 资源释放:在组件卸载时取消所有订阅和监听
- 性能优化:避免频繁的读写操作,合理使用不带响应的写入
- 用户反馈:在关键操作(如连接、写入)时提供适当的用户反馈
通过掌握这些核心功能,开发者可以构建出稳定可靠的蓝牙应用,满足各种物联网场景的需求。react-native-ble-plx 的强大功能为 React Native 生态中的BLE开发提供了坚实基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考