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

Web Bluetooth多Characteristic声明及读写问题排查

核心错误点

你的代码存在两个基础逻辑问题,和Next.js/React框架无关,不需要额外引入类封装即可修复:

  1. service.getCharacteristic() 是异步方法,返回Promise对象。你连续调用该方法时没有等待所有异步请求执行完成,直接返回的是未resolve的Promise对象,不是实际可用的特征实例。
  2. 你使用了JS逗号操作符写返回值:return (shdn, heart_rate_measurement, temperature_measurement, stim, battery),该语法最终只会返回括号内最后一个值(即battery实例),前面的所有特征实例都会被丢弃,所以后续.then中你命名为shdn的参数实际是电池特征,调用写入方法自然会报错。
修复代码

使用Promise.all并行等待所有特征加载完成,再以对象形式返回所有实例,避免顺序错乱和值丢失:

.then(async (service) => {
  pushlog("Getting all required Characteristics...");
  // 并行拉取所有需要的特征,等待全部请求完成
  const [
    heart_rate_measurement,
    temperature_measurement,
    shdn,
    stim,
    battery
  ] = await Promise.all([
    service.getCharacteristic("heart_rate_measurement"),
    service.getCharacteristic("temperature_measurement"),
    service.getCharacteristic("33ca7a02-c95f-4bca-a8bb-6692930216d0"),
    service.getCharacteristic("b71ce29e-7353-40bf-a4dd-b0c03593e0ba"),
    service.getCharacteristic("battery_level")
  ]);

  // 返回对象存储所有特征实例,后续按需取用
  return { shdn, heart_rate_measurement, temperature_measurement, stim, battery };
})

后续调用对应特征时,从返回的对象中解构出需要的实例即可:

.then(({ shdn }) => {
  pushlog("Writing to Shutdown Characteristic...");
  const resetEnergyExpended = Uint8Array.of(0x01);
  return shdn.writeValue(resetEnergyExpended);
})
// 需要使用其他特征时同理解构即可
.then(({ heart_rate_measurement, battery }) => {
  // 在这里写心率、电池特征的通知监听、读写逻辑即可
})

如果你不想使用async/await语法,直接给Promise.all传入所有getCharacteristic返回的Promise实例,在.then里拿到按顺序排列的特征数组再返回即可,逻辑完全一致。

内容的提问来源于stack exchange,提问作者Dionysus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 18:42:37