HarmonyOS鸿蒙Next中订阅BLE设备的特征值变化事件on(type: "BLECharacteristicChange", callback: Callback<BLECharacteristic>): void时callback为null(Arkts)

HarmonyOS鸿蒙Next中订阅BLE设备的特征值变化事件on(type: “BLECharacteristicChange”, callback: Callback<BLECharacteristic>): void时callback为null(Arkts) (*)

当我成功连接上了BLE设备,然后成功创建了GattClientDevice实例并获取了该实例的所有服务

然后按照官方文档的步骤,先调用了setNotifyCharacteristicChanged接口接收server端的通知,然后才订阅蓝牙低功耗设备的特征值变化事件,但是当我使用串口软件向BLE模块写入数据发送给手机端时,上述订阅事件可以被触发,但是callback却是null

监听事件创立和错误反馈如下

this.mGattClientDevice.on('BLECharacteristicChange', (data: bluetooth.BLECharacteristic) => {
  let serviceUuid = data.serviceUuid;
  let characteristicUuid = data.characteristicUuid;
  logger.info(TAG, `BLE Device data on BLECharacteristicChange ${serviceUuid}, ${characteristicUuid}`)
  let characteristicValue: ArrayBuffer = data.characteristicValue
  if (characteristicValue !== null && typeof(characteristicValue) === 'undefined') {
    return
  }
  let valueTemp = HexUtil.ab2hex(characteristicValue);
  let value = HexUtil.filterValue(valueTemp)
  let temp: string = HexUtil.hexToString(value)
  let tempStrs: string[] = temp.split(',')
  let count: number = tempStrs.length
  let curStr: string = tempStrs[count - 1] + '\n'
  // 解析设备基础信息
  this.mScanStr = curStr + '' + this.mScanStr
})

setNotifyCharacteristicChanged接口调用

  blueSetNotifyCharacteristicChanged() {
    logger.info(TAG, `BLE Device SetNotifyCharacteristicChanged`)
    let success1: boolean = this.mGattClientDevice.setNotifyCharacteristicChanged(this.mNotifyCharacteristic, true)
    logger.info(TAG, `BLE Device SetNotifyCharacteristicChanged success1=${success1}`)
    logger.info(TAG, `BLE Device blue send :  注册通知监听器 success1 =${success1}`)
    if (success1) { 
      let descriptor: bluetooth.BLEDescriptor = this.getDescriptor(this.mNotifyCharacteristic, this.mNotifyCharacteristic.characteristicUuid);
      if (descriptor != null) {
        descriptor.descriptorValue = this.ENABLE_NOTIFICATION_VALUE
        logger.info(TAG, `BLE Device SetNotifyCharacteristicChanged success2=${JSON.stringify(descriptor.descriptorValue)}`)
        let success2: boolean = this.mGattClientDevice.writeDescriptorValue(descriptor)
        logger.info(TAG, `BLE Device SetNotifyCharacteristicChanged success2=${success2}`)
      } else {
        logger.info(TAG, `BLE Device SetNotifyCharacteristicChanged descriptor is null`)
      }
    }
  }

以下是一些GattClientDevice实例的操作

  1. 根据扫描到的BLE创建对应的GattClientDevice实例,并连接BLE
servicescan(item) {
  this.mGattClientDevice = bluetooth.BLE.createGattClientDevice(item)
  this.connectStatus = this.mGattClientDevice.connect()
  this.mGattClientDevice.setBLEMtuSize(128);
  logger.info(TAG, `BLE Device connect = ${this.connectStatus}`)
}
  1. 获取实例所有服务并筛选出需要的服务
findservices() {
  if (this.connectStatus) {
    this.mGattClientDevice.getServices().then((result: Array<bluetooth.GattService>) => {
      for (let blueService of result) { //获取得到的Services中的每一个Services
        if (Suuid === blueService.serviceUuid||Suuid1===blueService.serviceUuid) { //对应两个不同BLE设备的uuid
          let curCharaceristics = blueService.characteristics
          logger.info(TAG, `Services uuid = ${JSON.stringify(blueService.serviceUuid)}`)
          for (let characteristics of curCharaceristics) {
            if (NOTIFY_uuid === characteristics.characteristicUuid||NOTIFY_uuid1===characteristics.characteristicUuid) {
              this.mNotifyCharacteristic = characteristics
              this.mNotifyCharacteristic.characteristicValue=this.ENABLE_NOTIFICATION_VALUE
              logger.info(TAG, `Notify uuid is = ${JSON.stringify(characteristics.characteristicUuid)}`)
              logger.info(TAG,`NOTIFY value is= ${JSON.stringify(this.mNotifyCharacteristic.characteristicValue)}`)
              this.servicefindresult = true
            }
            else if (WRITE_NO_RESPONSE_uuid === characteristics.characteristicUuid||WRITE_NO_RESPONSE_uuid1===characteristics.characteristicUuid) {
              this.mWriteCharacteristic = characteristics
              logger.info(TAG, `WRITE_NO_RESPONE uuid is = ${JSON.stringify(characteristics.characteristicUuid)}`)
              this.servicefindresult = true
            }
          }
        }
      }
    })
  }
}

同时,当我给BLE发送数据时,BLE可以接收到(我通过串口模块将其显示出来了)


更多关于HarmonyOS鸿蒙Next中订阅BLE设备的特征值变化事件on(type: "BLECharacteristicChange", callback: Callback<BLECharacteristic>): void时callback为null(Arkts)的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

楼主您好,使用的SDK版本和设备系统版本分别是多少?

更多关于HarmonyOS鸿蒙Next中订阅BLE设备的特征值变化事件on(type: "BLECharacteristicChange", callback: Callback<BLECharacteristic>): void时callback为null(Arkts)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


SDK使用的是HarmonyOS API8
设备系统版本是HarmonyOS3.0
apivision:8,

楼主您好,请提供下hilog日志,进一步定位。

在HarmonyOS鸿蒙Next中,订阅BLE设备特征值变化事件时,如果callbacknull,可能是未正确初始化回调函数或未传入有效的回调函数。请确保在调用on方法时,传入一个有效的Callback<BLECharacteristic>实例。例如:

let callback: Callback<BLECharacteristic> = (characteristic: BLECharacteristic) => {
    console.log("Characteristic changed:", characteristic);
};

BLE.on("BLECharacteristicChange", callback);

确保callback不为null,并且正确处理特征值变化事件。

回到顶部