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实例的操作
- 根据扫描到的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}`)
}
- 获取实例所有服务并筛选出需要的服务
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
楼主您好,使用的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设备特征值变化事件时,如果callback
为null
,可能是未正确初始化回调函数或未传入有效的回调函数。请确保在调用on
方法时,传入一个有效的Callback<BLECharacteristic>
实例。例如:
let callback: Callback<BLECharacteristic> = (characteristic: BLECharacteristic) => {
console.log("Characteristic changed:", characteristic);
};
BLE.on("BLECharacteristicChange", callback);
确保callback
不为null
,并且正确处理特征值变化事件。