物联网项目中,已连接HC-08模块,如何用react-native-ble-plx发送数据?
使用react-native-ble-plx向HC-08发送数据的完整指南
太棒了,你已经搞定安卓和HC-08的连接了!接下来用react-native-ble-plx给模块发数据其实没那么复杂,我给你一步步捋清楚:
前提确认
- 确保你的安卓设备已经和HC-08建立了稳定的BLE连接
- 提前记好HC-08的服务UUID和可写特征UUID:HC-08默认用的是串口透传服务,UUID是
0000ffe0-0000-1000-8000-00805f9b34fb,对应的可写特征UUID是0000ffe1-0000-1000-8000-00805f9b34fb,要是你改过模块配置,记得换成自己设置的那组
步骤1:导入并初始化BLE管理器
先在你的React Native组件里导入库,初始化一个管理器实例:
import { BleManager } from 'react-native-ble-plx'; const bleManager = new BleManager();
步骤2:获取已连接的HC-08设备
你可以通过设备名称(HC-08默认名称就是HC-08)或者设备ID,筛选出已经连接的目标设备:
async function getConnectedHC08() { try { // 可以传入服务UUID过滤设备,精准定位HC-08 const connectedDevices = await bleManager.connectedDevices(['0000ffe0-0000-1000-8000-00805f9b34fb']); const hc08Device = connectedDevices.find(device => device.name === 'HC-08'); if (!hc08Device) { throw new Error('没找到已连接的HC-08设备哦'); } return hc08Device; } catch (error) { console.error('获取设备失败:', error); return null; } }
步骤3:发现服务与可写特征
拿到设备实例后,得先发现它的服务和特征,才能进行数据写入操作:
async function getWritableCharacteristic(device) { try { // 发现设备所有的服务和特征 await device.discoverAllServicesAndCharacteristics(); // 获取HC-08的串口服务 const serialService = await device.serviceForUUID('0000ffe0-0000-1000-8000-00805f9b34fb'); if (!serialService) { throw new Error('找不到HC-08的串口服务'); } // 获取对应的可写特征 const writableChar = await serialService.characteristicForUUID('0000ffe1-0000-1000-8000-00805f9b34fb'); if (!writableChar) { throw new Error('找不到可写入的特征'); } // 确认特征支持写入(两种写入模式:带响应/不带响应,至少要有一种) if (!writableChar.isWritableWithResponse && !writableChar.isWritableWithoutResponse) { throw new Error('这个特征不支持写入操作'); } return writableChar; } catch (error) { console.error('获取特征失败:', error); return null; } }
步骤4:发送数据到HC-08
BLE传输的是字节数组,所以要先把你要发的字符串转换成Uint8Array,再调用特征的写入方法:
async function sendData(dataToSend) { const hc08Device = await getConnectedHC08(); if (!hc08Device) return; const writableChar = await getWritableCharacteristic(hc08Device); if (!writableChar) return; try { // 把字符串转成UTF-8编码的字节数组 const byteData = new TextEncoder().encode(dataToSend); // 选择写入模式:writeWithResponse会等待设备响应,适合需要确认发送结果的场景;writeWithoutResponse速度更快 await writableChar.writeWithResponse(byteData); console.log('数据发送成功啦!'); } catch (error) { console.error('发送数据失败:', error); } } // 调用示例:发送"Hello Raspberry Pi!" // sendData("Hello Raspberry Pi!");
关键注意事项
- 权限要到位:安卓端要确保申请了对应的蓝牙权限,Android 12+需要
BLUETOOTH_CONNECT,低版本需要ACCESS_FINE_LOCATION等,还要确保用户已经授权。 - 波特率要匹配:树莓派上的串口配置必须和HC-08的波特率一致(默认9600),不然树莓派可能读不懂收到的数据。
- 数据长度限制:BLE单次写入一般最多传20字节左右,要是发长数据,记得做分片处理。
- 连接稳定性:如果发送过程中出现断开,可以在代码里加个重连逻辑,确保通信稳定。
内容的提问来源于stack exchange,提问作者Hurobaki
相关产品推荐
相关产品推荐

