You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,这导致设备收到的不是预期的二进制数据。

正确的实现步骤:

  1. 把前缀和密码的十进制数组拼接后,直接转换为十六进制字符串(base16),不需要用Buffer转base64。
  2. 确保十六进制字符串是连续的无分隔符格式,比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 07:32:05