uni-app 蓝牙notifyBLECharacteristicValueChange无法订阅

uni-app 蓝牙notifyBLECharacteristicValueChange无法订阅

信息项 内容
产品分类 uniapp/App
PC开发环境 Mac
PC版本号 M1
HBuilderX 正式
版本号 4.29
手机系统 Android
版本号 Android 10
手机厂商 OPPO
手机机型 A72n 5G
页面类型 vue
vue版本 vue3
打包方式 云端
项目创建方式 HBuilderX

操作步骤:

  <view>  
    <uni-popup ref="popup" type="dialog">  
        <uni-popup-dialog mode="input" v-model="bobaoContent" message="成功消息" :duration="2000" :before-close="true" @close="closePopup" @confirm="confirmPopup"></uni-popup-dialog>  
    </uni-popup>  
    <button @click="startBluetooth">启动蓝牙</button>  
    <button @click="closeBluetooth">关闭蓝牙</button>  
    <button @click="scanBluetooth" :disabled="isScanning">扫描蓝牙设备</button>  

    <scroll-view scroll-y="true" style="height: 400px;">  
      <view v-for="device in devices" :key="device.deviceId" class="device-item">  
        <text>{{ device.name || device.localName || '未知设备' }}</text>  
        <button @click="connectToDevice(device)">连接</button>  
      </view>  
    </scroll-view>  

    <view v-if="connectedDevice">  
      <text>已连接到蓝牙设备: {{ connectedDevice }}</text>  
      <button @click="disconnectDevice">断开连接</button>  
    </view>  

    <view v-if="receivedData">  
      <text>接收到的数据: {{ receivedData }}</text>  
    </view>  
  </view>  
</template>  

预期结果:

1


### 实际结果:


1

bug描述:

{ “errMsg”: “notifyBLECharacteristicValueChange:fail no descriptor”, “code”: 10008 } 报错提示,换了好几个设备都是一样的


![图片](https://www.itying.com/uniimg.php?url=https://img-cdn-tc.dcloud.net.cn/uploads/questions/20241203/95e21270e118ad76329b942a54f96c0b.png)

更多关于uni-app 蓝牙notifyBLECharacteristicValueChange无法订阅的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

查找特定的特征值才可以,通过characteristics[].properties.notify / characteristics[].properties.indicate 属性判断

更多关于uni-app 蓝牙notifyBLECharacteristicValueChange无法订阅的实战教程也可以访问 https://www.itying.com/category-93-b0.html


[ { “uuid”: “00002A05-0000-1000-8000-00805F9B34FB”, “properties”: { “read”: true, “write”: true, “notify”: true, “indicate”: true } } ]都有的哈

在uni-app中,如果你遇到notifyBLECharacteristicValueChange无法订阅蓝牙特征值变化的问题,可能是由于几个常见的原因:服务或特征值未正确识别、权限问题、或者代码实现有误。以下是一个完整的代码示例,以及可能的解决思路,来帮助你确保蓝牙订阅功能正常工作。

代码示例

// 初始化蓝牙适配器
uni.openBluetoothAdapter({
  success: function (res) {
    console.log('蓝牙适配器初始化成功', res)
    // 开始扫描蓝牙设备
    uni.startBluetoothDevicesDiscovery({
      allowDuplicatesKey: false,
      success: function (devicesRes) {
        console.log('开始扫描设备', devicesRes)
        // 假设已经找到了目标设备,并且连接成功
        const deviceId = '目标设备的ID'; // 替换为实际设备ID
        uni.createBLEConnection({
          deviceId: deviceId,
          success: function (connectRes) {
            console.log('连接设备成功', connectRes)
            // 获取服务
            uni.getBLEDeviceServices({
              deviceId: deviceId,
              success: function (servicesRes) {
                const serviceId = '目标服务的UUID'; // 替换为实际服务UUID
                // 获取特征值
                uni.getBLEDeviceCharacteristics({
                  deviceId: deviceId,
                  serviceId: serviceId,
                  success: function (charsRes) {
                    const characteristicId = '目标特征值的UUID'; // 替换为实际特征值UUID
                    // 启用notify
                    uni.notifyBLECharacteristicValueChange({
                      state: true, // 启用通知
                      deviceId: deviceId,
                      serviceId: serviceId,
                      characteristicId: characteristicId,
                      success: function (notifyRes) {
                        console.log('启用notify成功', notifyRes)
                        // 监听特征值变化
                        uni.onBLECharacteristicValueChange(function (changeRes) {
                          console.log('特征值变化', changeRes)
                          // 处理变化的数据
                        })
                      },
                      fail: function (err) {
                        console.error('启用notify失败', err)
                      }
                    })
                  }
                })
              }
            })
          }
        })
      }
    })
  },
  fail: function (err) {
    console.error('蓝牙适配器初始化失败', err)
  }
})

可能的解决思路

  1. 确保UUID正确:确保服务UUID和特征值UUID正确无误,并且设备支持这些UUID。
  2. 检查设备连接状态:在调用notifyBLECharacteristicValueChange之前,确保设备已经成功连接。
  3. 权限管理:检查应用是否有足够的权限访问蓝牙设备,特别是在Android平台上,需要在manifest.json中声明蓝牙权限。
  4. 设备兼容性:某些设备可能不支持notify功能,或者需要特定的设置才能启用。

通过上述代码和检查点,你应该能够诊断并解决notifyBLECharacteristicValueChange无法订阅的问题。如果问题仍然存在,建议查看uni-app的官方文档或社区论坛,获取更多帮助。

回到顶部