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
有没有高人指点一下是什么问题
更多关于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 操作流程正确,包括:
- 初始化蓝牙适配器:
uni.openBluetoothAdapter
- 搜索设备:
uni.startBluetoothDevicesDiscovery
- 连接设备:
uni.createBLEConnection
- 获取服务:
uni.getBLEDeviceServices
- 获取特征值:
uni.getBLEDeviceCharacteristics
- 启用特征值通知:
uni.notifyBLECharacteristicValueChange
- 监听特征值变化:
onBLECharacteristicValueChange
如果流程不完整,可能会导致回调无效。
3. 确认特征值支持通知
确保设备的特征值支持通知(notify)或指示(indicate)属性。可以通过 uni.getBLEDeviceCharacteristics
获取特征值的属性,检查 properties
是否包含 notify
或 indicate
。
如果特征值不支持通知,无法触发 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