uni-app android平台 onBLECharacteristicValueChange 回调无效

uni-app android平台 onBLECharacteristicValueChange 回调无效

产品分类:

uniapp/App

PC开发环境操作系统:

Windows

PC开发环境操作系统版本号:

Microsoft Windows 10 家庭中文版

HBuilderX类型:

正式

HBuilderX版本号:

3.4.7

手机系统:

Android

手机系统版本号:

Android 12

手机厂商:

小米

手机机型:

小米11

页面类型:

vue

vue版本:

vue2

打包方式:

离线

项目创建方式:

HBuilderX

示例代码:

<template>
<div>
<view class="">
<view class="">
蓝牙 :{{deviceId}}
</view>
<view class="">
服务 :{{fuwu_uuid}}
</view>
</view>
<button type="default" @click="openBluetoothAdapter">1.初始化蓝牙模块</button>
<button type="default" @click="startBluetoothDevicesDiscovery">2.开始搜寻附近的蓝牙外围设备</button>
<button type="default" @click="stopBluetoothDevicesDiscovery">停止搜寻附近的蓝牙外围设备</button>
<button type="default" @click="getConnectedBluetoothDevices">根据 uuid 获取处于已连接状态的设备</button>
<button type="default" @click="closeBLEConnection">断开与低功耗蓝牙设备的连接</button>
<button type="default" @click="getBLEDeviceServices" v-if="deviceId">3.获取蓝牙设备所有服务</button>
<scroll-view scroll-y="true" class="list_box">
蓝牙列表
<view v-for="(item,index) in list" :key="index">
<text>蓝牙设备名称:{{item.name}};</text>
<text>设备的id:{{item.deviceId}};</text>
<text>信号强度:{{item.RSSI}};</text>
<button size="mini" @click="createBLEConnection(item)">连接蓝牙设备</button>
</view>
</scroll-view>
<view class="">
<input type="text" v-model="text_val" style="background-color: red;">
<button size="mini" @click="writeBLECharacteristicValue">写入</button>
<button size="mini" @click="readBLECharacteristicValue(tezheng_uuid)">读取</button>
</view>
</div>
</template>
<script>
// ArrayBuffer转16进度字符串示例
function ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
(bit) => {
return ('00' + bit.toString(16)).slice(-2)
}
)
return hexArr.join('')
}

function ab2Str(arrayBuffer) {  
let unit8Arr = new Uint8Array(arrayBuffer);  
let encodedString = String.fromCharCode.apply(null, unit8Arr);  
return encodedString  
}  
export default {  
data() {  
return {  
// 蓝牙  
list: [],  
deviceId: "",  
// 服务  
services: [],  
fuwu_uuid: "",  
// 特征  
characteristics: [],  
tezheng_uuid: "",  

//   
text_val: "",  
}  
},  
onLoad() {  
// this.openBluetoothAdapter()  
},  
methods: {  
// 初始化蓝牙模块  
openBluetoothAdapter() {  
uni.openBluetoothAdapter({  
success(res) {  
uni.showToast({  
title: "初始化成功",  
})  
},  
fail: (err) => {  
console.log(22, err)  
uni.showModal({  
title: "初始化失败",  
content: err.errMsg  
})  
}  
})  
},  
// 开始搜寻附近的蓝牙外围设备  
startBluetoothDevicesDiscovery() {  
let that = this  
uni.startBluetoothDevicesDiscovery({  
success(res) {  
uni.showToast({  
title: "成功",  
})  
that.onBluetoothDeviceFound()  
},  
fail: (err) => {  
console.log(22, err)  
uni.showToast({  
title: "失败",  
icon: "none"  
})  
}  
})  
},  
// 监听寻找到新设备的事件  
onBluetoothDeviceFound() {  
uni.onBluetoothDeviceFound((devices) => {  
console.log(JSON.parse(JSON.stringify(devices.devices[0])))  
devices.devices[0].rui_ab2hex = ab2hex(devices.devices[0].advertisData)  
this.list = this.list.concat(devices.devices)  
// console.log(ab2hex(devices.devices[0].advertisData))  
})  
},  
// 停止搜寻附近的蓝牙外围设备  
stopBluetoothDevicesDiscovery() {  
uni.stopBluetoothDevicesDiscovery({  
success(res) {  
uni.showToast({  
title: "成功",  
})  
},  
fail: (err) => {  
uni.showToast({  
title: "失败",  
icon: "none"  
})  
}  
})  
},  
// 连接蓝牙设备  
createBLEConnection(item) {  
let deviceId = item.deviceId  
uni.createBLEConnection({  
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
deviceId,  
success: (res) => {  
uni.showToast({  
title: "连接成功",  
})  
console.log(res, deviceId)  
this.deviceId = deviceId  
// 自动获取  
this.getBLEDeviceServices()  
},  
fail: (err) => {  
console.log(22, err)  
uni.showToast({  
title: "连接失败",  
icon: "none"  
})  
}  
})  
},  
// 根据 uuid 获取处于已连接状态的设备  
getConnectedBluetoothDevices() {  
uni.getConnectedBluetoothDevices({  
services: this.list,  
success: (res) => {  
console.log(11, res)  
},  
fail: (err) => {  
console.log(22, err)  
uni.showToast({  
title: "获取失败",  
icon: "none"  
})  
}  
})  
},  
// 断开与低功耗蓝牙设备的连接  
closeBLEConnection() {  
uni.closeBLEConnection({  
deviceId: "",  
success(res) {  
console.log(res)  
}  
})  
},  
// 获取蓝牙设备所有服务(service)  
getBLEDeviceServices() {  
uni.getBLEDeviceServices({  
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
deviceId: this.deviceId,  
success: (res) => {  
console.log('获取蓝牙设备所有服务:', res)  
res.services = res.services || []  
this.services = res.services  
res.services.forEach(v => {  
if (v.uuid == "0000FFE0-0000-1000-8000-00805F9B34FB") {  
console.log("自动获取特征", v)  
this.fuwu_uuid = v.uuid  
this.getBLEDeviceCharacteristics(v)  
}  
})  
}  
})  
},  
// 获取特征值  
getBLEDeviceCharacteristics(item) {  
let deviceId = this.deviceId  
let serviceId = item.uuid  
uni.getBLEDeviceCharacteristics({  
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
deviceId,  
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取  
serviceId,  
success: (res) => {  
console.log('获取特征值成功', res)  
res.characteristics = res.characteristics || []  
// 必须在这里的回调才能获取  
this.onBLECharacteristicValueChange()  
res.characteristics.forEach(v => {  
if (v.properties.read) {  
console.log("自动读取数据", v)  
this.readBLECharacteristicValue(v.uuid)  
}  
if (v.properties.notify || v.properties.indicate) {  
console.log("特征值变化", v)  
this.notifyBLECharacteristicValueChange(v.uuid)  
}  
})  
// res.characteristics = res.characteristics.filter(v => {  
//  // read 读取  notify 通知  indicate 表明  
//  return v.properties.notify || v.properties.indicate  
// })  
// this.characteristics = res.characteristics  

},  
})  
},  
set_tezheng_uuid(item) {  
this.tezheng_uuid = item.uuid  
if (item.properties.read) {  
console.log(this.tezheng_uuid, "支持读取")  
}  
},  
// 写入数据  
writeBLECharacteristicValue() {  
// 向蓝牙设备发送一个0x00的16进制数据  
const buffer = new ArrayBuffer(this.text_val)  
const dataView = new DataView(buffer)  
dataView.setUint8(0, 0)  
let deviceId = this.deviceId  
let serviceId = this.fuwu_uuid  
let characteristicId = this.tezheng_uuid  

uni.writeBLECharacteristicValue({  
// 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取  
deviceId,  
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取  
serviceId,  
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取  
characteristicId,  
// 这里的value是ArrayBuffer类型  
value: buffer,  
success: (res) => {  
console.log('写入成功', res)  
}  
})  
},  
// 读取数据  
readBLECharacteristicValue(characteristicId) {  
let deviceId = this.deviceId  
let serviceId = this.fuwu_uuid  
// let characteristicId = characteristicId  
console.log(222, {  
deviceId,  
serviceId,  
characteristicId,  
})  
if (!serviceId) {  
return console.log("没有服务")  
} else if (!characteristicId) {  
return console.log("没有特征值")  
}  

uni.readBLECharacteristicValue({  
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
deviceId,  
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取  
serviceId,  
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取  
characteristicId,  
success: (res) => {  
console.log('读取成功', res)  
}  
})  
},  
// 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值  
notifyBLECharacteristicValueChange(characteristicId) {  
let deviceId = this.deviceId  
let serviceId = this.fuwu_uuid  
uni.notifyBLECharacteristicValueChange({ //开启通知  
deviceId,  
serviceId,  
characteristicId: characteristicId,  
state: true,  
success: (res) => {  
console.warn('特征值变化成功', res)  
},  
fail: (err) => {  
console.log(err)  
}  
})  
},  
// 监听低功耗蓝牙设备的特征值变化事件  
onBLECharacteristicValueChange() {  
// #ifdef APP-PLUS  
// 监听低功耗蓝牙设备的特征值变化   
plus.bluetooth.onBLECharacteristicValueChange(function(characteristic) {  
console.log('监听读取数据', characteristic)  
let aa = ab2Str(characteristic.value)  
if (aa) {  
uni.showModal({  
content: aa,  
})  
}  
// console.log('onBLECharacteristicValueChange: ' + JSON.stringify(e));  
// var value = buffer2hex(e.value);  
// console.log('value(hex) = ' + value);  
// if (characteristicId == e.characteristicId) {    
//  // 更新到页面显示  
//  alert('特征值变化: ' + value);  
// }  
});  
// #endif  
// #ifndef APP-PLUS  
uni.onBLECharacteristicValueChange((characteristic) => {  
console.log('监听读取数据', characteristic)  
// console.log(111, new Uint8Array(characteristic.value))  
// console.log(333, ab2hex(characteristic.value))  
let aa = ab2Str(characteristic.value)  
if (aa) {  
uni.showModal({  
content: aa,  
})  
}  
})  
// #endif  
}  

}  
</script>
.list_box {
height: 750rpx;
width: 750rpx;
box-sizing: border-box;
padding: 20rpx;
}

操作步骤:

onBLECharacteristicValueChange


### 预期结果:


能一直监听到变化值

实际结果:

监听到,串口发送消息,接受不到


### bug描述:


android 使用 onBLECharacteristicValueChange 获取不到蓝牙的数据,小程序测试是可以的,但android 试了好多次 都不行,无论 使用 plus.bluetooth.onBLECharacteristicValueChange  还是 uni.onBLECharacteristicValueChange 都不行,想知道是什么原因?


更多关于uni-app android平台 onBLECharacteristicValueChange 回调无效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

9 回复

有没有高人指点一下是什么问题

更多关于uni-app android平台 onBLECharacteristicValueChange 回调无效的实战教程也可以访问 https://www.itying.com/category-93-b0.html


解决了我也遇见这个问题了

您好,能分享下您咋样解决的吗?

回复 7***@qq.com: 我也还没解决啊 打错了 是问你解决了没有

回复 g***@gmail.com: 用原生插件吧,

回复 7***@qq.com: 可以教教吗怎么搞

回复 阿_怪: 去插件市场,找蓝牙原生插件,以后混合 app 还是用 flutter 了,uni 坑太多 解决的也不是很及时。

回复 7***@qq.com: 你用的是插件市场解决的吗

在 uni-app 中,onBLECharacteristicValueChange 是用于监听低功耗蓝牙(BLE)设备特征值变化的回调函数。如果在 Android 平台上发现该回调无效,可能是由于以下几个原因导致的。你可以按照以下步骤进行排查和解决:


1. 检查权限和配置

确保在 Android 平台下已经正确配置了蓝牙权限和相关设置:

  • AndroidManifest.xml 中添加蓝牙权限:
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    
  • 在 uni-app 的 manifest.json 中添加权限:
    "permission": {
      "scope.userLocation": {
        "desc": "需要定位权限以扫描蓝牙设备"
      }
    }
    

2. 检查 BLE 流程是否正确

确保 BLE 操作流程正确,包括:

  1. 初始化蓝牙适配器:uni.openBluetoothAdapter
  2. 搜索设备:uni.startBluetoothDevicesDiscovery
  3. 连接设备:uni.createBLEConnection
  4. 获取服务:uni.getBLEDeviceServices
  5. 获取特征值:uni.getBLEDeviceCharacteristics
  6. 启用特征值通知:uni.notifyBLECharacteristicValueChange
  7. 监听特征值变化:onBLECharacteristicValueChange

如果流程不完整,可能会导致回调无效。


3. 确认特征值支持通知

确保设备的特征值支持通知(notify)或指示(indicate)属性。可以通过 uni.getBLEDeviceCharacteristics 获取特征值的属性,检查 properties 是否包含 notifyindicate

如果特征值不支持通知,无法触发 onBLECharacteristicValueChange


4. 启用特征值通知

在监听特征值变化之前,必须调用 uni.notifyBLECharacteristicValueChange 启用通知:

uni.notifyBLECharacteristicValueChange({
  deviceId: deviceId,
  serviceId: serviceId,
  characteristicId: characteristicId,
  state: true, // 启用通知
  success: () => {
    console.log('启用通知成功');
  },
  fail: (err) => {
    console.error('启用通知失败', err);
  }
});

如果未启用通知,onBLECharacteristicValueChange 不会被触发。


5. 检查设备是否发送数据

确保 BLE 设备确实发送了数据。如果设备没有发送数据,onBLECharacteristicValueChange 也不会被触发。


6. 检查回调函数是否正确注册

确保 onBLECharacteristicValueChange 回调函数已正确注册:

uni.onBLECharacteristicValueChange((res) => {
  console.log('特征值变化', res);
});

7. 调试和日志

在开发过程中,可以通过 console.log 打印日志,检查每一步是否成功执行。如果某一步失败,可以根据错误信息进行排查。


8. Android 系统版本问题

某些 Android 系统版本可能存在兼容性问题。可以尝试在不同的设备或系统版本上测试。


9. uni-app 版本问题

确保使用的 uni-app 版本是最新的,旧版本可能存在 BLE 相关的 bug。可以通过以下命令更新 uni-app:

npm update [@dcloudio](/user/dcloudio)/uni-app
回到顶部