React Native + react-native-ble-plx BLE设备写入失败求助
问题:React Native + react-native-ble-plx 设备写入数据无效
已实现设备扫描、连接、读取功能,运行正常。当前核心问题是向设备写入数据:
设备未按功能划分独立特征值,而是通过3个服务(设备服务、读取服务、写入服务),用前缀区分不同写入操作:
- 设置密码(4位):前缀
0x5501+ 密码01020304,最终载荷为0x550101020304 - 锁定/解锁设备:前缀
0x5505+ 密码01020304+ 01(锁定)/00(解锁),载荷如0x550501020301或0x55050102030400
尝试设置密码时无报错,但设备未实际修改密码(Nordic工具测试可正常修改,设备本身无问题)。
尝试的无效代码:
const prefix = [55, 1]; let passwordWithHeader = []; if (data) { if (data.length < 4) throw new Error("Password must be 4 digits"); passwordWithHeader = Buffer.from( convertedArrayToHex(prefix.concat(data)) // 返回 ["55","01","01","02","03","04"] ); } try { let res = await connectedDevice.device.writeCharacteristicWithResponseForService( SPS_SERVICE_UUID, SPS_SERVER_TX_UUID, passwordWithHeader.toString("base64") ); return res; // Password set successfully } catch (error) { console.log("err in write password", error); throw error; // Handle error while setting password }
疑惑点:根据react-native-ble-plx文档,写入数据似乎要求为base16格式,不清楚如何正确转换数据格式以匹配设备要求。
解决方案
问题出在数据格式转换错误:ble-plx要求写入的是base16(十六进制字符串)格式,而你代码里转成了base64,这导致设备收到的不是预期的二进制数据。
正确的实现步骤:
- 把前缀和密码的十进制数组拼接后,直接转换为十六进制字符串(base16),不需要用Buffer转base64。
- 确保十六进制字符串是连续的无分隔符格式,比如
550101020304,而不是带引号或逗号的数组。
修改后的代码:
const prefix = [55, 1]; // 对应0x55, 0x01 let hexPayload = ''; if (data) { if (data.length < 4) throw new Error("Password must be 4 digits"); // 拼接前缀和密码数组,将每个数字转为两位十六进制字符串,再拼接成完整payload const fullArray = prefix.concat(data); hexPayload = fullArray.map(num => { // 确保每个数字转为两位十六进制,不足补0(比如1转为"01") return num.toString(16).padStart(2, '0'); }).join(''); } try { const res = await connectedDevice.device.writeCharacteristicWithResponseForService( SPS_SERVICE_UUID, SPS_SERVER_TX_UUID, hexPayload // 直接传入base16格式的字符串 ); return res; } catch (error) { console.log("err in write password", error); throw error; }
关键说明:
- ble-plx的写入方法接受的base16字符串,本质是把十六进制字符直接映射为二进制数据。比如字符串
5501会被解析为字节0x55和0x01,完全匹配设备需要的载荷格式。 - 不需要用Buffer处理,直接通过
toString(16)和padStart(2, '0')确保每个字节都是两位十六进制,避免出现单字符(比如1转为"1"而不是"01")导致的格式错误。 - 测试时可以先打印
hexPayload,确认输出是550101020304这种格式,和Nordic工具里发送的内容一致。
内容的提问来源于stack exchange,提问作者Elna Haim
相关产品推荐
相关产品推荐

