//弹出框封装
function toast(content, showCancel = false) {
uni.showModal({
title: '提示',
content,
showCancel
});
}
//监听低功耗蓝牙设备的特征值变化事件。
//必须先启用 notifyBLECharacteristicValueChange 接口
//才能接收到设备推送的 notification。
function onBLECharacteristicValueChange() {
// 必须在这里的回调才能获取
uni.onBLECharacteristicValueChange(characteristic => {
console.log('监听低功耗蓝牙设备的特征值变化事件成功');
console.log(JSON.stringify(characteristic));
});
}
//订阅操作成功后需要设备主动更新特征值的 value
//才会触发 uni.onBLECharacteristicValueChange 回调。
function notifyBLECharacteristicValueChange(deviceId,serviceId,characteristicId) {
return new Promise((resolve,reject) =>{
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId,
success(res) {
resolve(res)
console.log(characteristicId.slice(4,8) + '---notifyBLECharacteristicValueChange success:' + res.errMsg);
},
fail(reason) {
reject(reason)
}
});
})
}
//读取低功耗蓝牙设备的特征值的二进制数据值。
//注意:必须设备的特征值支持 read 才可以成功调用
function readBLECharacteristicValue(deviceId,serviceId,characteristicId) {
uni.readBLECharacteristicValue({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId,
success: res => {
console.log('读取设备数据值成功');
console.log(JSON.stringify(res));
},
fail(e) {
console.log('读取设备数据值失败,错误码:' + e.errCode);
}
});
}
//获取某个服务下的所有特征值
function getBLEDeviceCharacteristics(deviceId, serviceId) {
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId,
success: res => {
console.log(serviceId + '获取特征值成功:' + res.errMsg);
if (res.characteristics.length <= 0) {
// toast('获取特征值失败,请重试!');
return;
}else{
for(let i = 0; i < res.characteristics.length; i++){
let characteristicId = res.characteristics[i].uuid;
let {notify} = res.characteristics[i].properties;
let {indicate} = res.characteristics[i].properties;
if(characteristicId == "00002AAE-0000-1000-8000-00805F9B34FB"){
// if(notify|indicate){
// let serviceId = Store.state.bleDevice.device.parimaryData.serviceList[0].serviceIdOfBond
// let characteristicId = "00002AA5-0000-1000-8000-00805F9B34FB"
// console.log(serviceId)
// console.log(characteristicId)
notifyBLECharacteristicValueChange(deviceId,"0000181E-0000-1000-8000-00805F9B34FB","00002AA5-0000-1000-8000-00805F9B34FB")
.then((res)=>{
console.log(res)
return notifyBLECharacteristicValueChange(deviceId,'0000181F-0000-1000-8000-00805F9B34FB',"00002AA7-0000-1000-8000-00805F9B34FB")
})
.then((res)=>{
console.log(res)
return notifyBLECharacteristicValueChange(deviceId,'0000181F-0000-1000-8000-00805F9B34FB',"00002AA9-0000-1000-8000-00805F9B34FB")
})
.then((res)=>{
console.log(res)
return notifyBLECharacteristicValueChange(deviceId,'0000180A-0000-1000-8000-00805F9B34FB',"00002AAA-0000-1000-8000-00805F9B34FB")
})
.then((res)=>{
console.log(res)
return notifyBLECharacteristicValueChange(deviceId,'0000180A-0000-1000-8000-00805F9B34FB',"00002AAC-0000-1000-8000-00805F9B34FB")
})
.then((res)=>{
console.log(res)
return notifyBLECharacteristicValueChange(deviceId,'0000180A-0000-1000-8000-00805F9B34FB',"00002AAE-0000-1000-8000-00805F9B34FB")
})
.then((res)=>{
console.log(res)
return new Promise((resolve,reject)=>{
onBLECharacteristicValueChange();
})
})
.catch((reason)=>{
console.log(reason)
})
}
}
}
},
fail: e => {
console.log('获取特征值失败,错误码:' + e.errCode);
}
});
}
//获取所有服务
function getBLEDeviceServices(deviceId) {
console.log('获取所有服务的 uuid:' + deviceId);
let timer = setInterval(()=>{
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
success: res => {
// console.log(JSON.stringify(res.services));
console.log('获取设备服务成功:' + res.errMsg);
if (res.services.length <= 0) {
toast('获取服务失败,请重试!');
return;
} else {
for (let i = 0; i < res.services.length; i++) {
let serviceId= res.services[i].uuid
getBLEDeviceCharacteristics(deviceId, serviceId);
clearInterval(timer)
}
}
},
fail: e => {
console.log('获取设备服务失败,错误码:' + e.errCode);
}
});
},1500)
}
//停止搜索蓝牙设备
function stopBluetoothDevicesDiscovery(types) {
uni.stopBluetoothDevicesDiscovery({
success: e => {
console.log('停止搜索蓝牙设备:' + e.errMsg);
},
fail: e => {
console.log('停止搜索蓝牙设备失败,错误码:' + e.errCode);
}
});
}
//连接低功耗蓝牙
function createBLEConnection(deviceId) {
uni.createBLEConnection({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId,
success: res => {
console.log(res);
console.log('连接蓝牙成功:' + res.errMsg);
// 连接设备后断开搜索 并且不能搜索设备
stopBluetoothDevicesDiscovery(true);
getBLEDeviceServices(deviceId)
uni.hideToast();
uni.showToast({
title: '连接成功',
icon: 'success',
duration: 2000
});
// let serviceId = Store.state.bleDevice.device.parimaryData.serviceList[0].serviceIdOfBond
// let characteristicId = Store.state.bleDevice.device.parimaryData.serviceList[0].characteristicList.characteristicIdOfAuthenticationResponse
// console.log(serviceId)
// console.log(characteristicId)
// notifyBLECharacteristicValueChange(deviceId,serviceId,characteristicId)
// onBLECharacteristicValueChange();
},
fail: e => {
console.log('连接低功耗蓝牙失败,错误码:' + e.errCode);
uni.hideToast();
uni.showToast({
title: '连接失败',
icon: 'success',
duration: 2000
});
}
});
}
//获取在蓝牙模块生效期间所有已发现的蓝牙设备。
//包括已经和本机处于连接状态的设备。
function getBluetoothDevices() {
uni.getBluetoothDevices({
success: res => {
let {devices} = res
const {deviceName} = Store.state.bleDevice.device.snInfo
for (let i = 0; i < devices.length; i++) {
// console.log(devices[i]['name'])
if (devices[i]['name'] == deviceName) {
const {deviceId} = devices[i]
console.log(devices[i])
createBLEConnection(deviceId)
}
}
},
fail: e => {
console.log('获取蓝牙设备错误,错误码:' + e.errCode);
}
});
}
//发现外围设备
function onBluetoothDeviceFound() {
uni.onBluetoothDeviceFound(devices => {
console.log('开始监听寻找到新设备的事件');
getBluetoothDevices();
});
}
//开始搜索蓝牙设备
function startBluetoothDevicesDiscovery() {
uni.showToast({
title: '连接蓝牙...',
icon: 'loading',
duration: 99999
});
uni.startBluetoothDevicesDiscovery({
success: e => {
console.log('开始搜索蓝牙设备:' + e.errMsg);
onBluetoothDeviceFound()
},
fail: e => {
console.log('搜索蓝牙设备失败,错误码:' + e.errCode);
}
});
}
function bleConnect() {
startBluetoothDevicesDiscovery()
}
export default {
bleConnect,
}

- 发布:2022-09-29 01:08
- 更新:2022-09-29 01:08
- 阅读:267
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win10
HBuilderX类型: 正式
HBuilderX版本号: 3.6.2
手机系统: Android
手机系统版本号: Android 11
手机厂商: 华为
手机机型: 华为Mate40Pro
页面类型: vue
vue版本: vue2
打包方式: 离线
项目创建方式: HBuilderX
示例代码:
操作步骤:
import 引入该文件
调用bleConnect函数
内部getBluetoothDevices扫描到的蓝牙名字和指定的蓝牙名字做匹配,匹配一致则连接
名字由扫码获得
import 引入该文件
调用bleConnect函数
内部getBluetoothDevices扫描到的蓝牙名字和指定的蓝牙名字做匹配,匹配一致则连接
名字由扫码获得
预期结果:
1.广播元数据:
···
0x0BFF491301321708052243430F094346434330353038313733323031
···
2.从机正确打印
···
<BMS NOTIFICATION ENABLED:1>
<CURRENT GLU EVT NOTIFICATION ENABLE:1>
<GLU EVT NOTIFICATION ENABLE:1>
<DIS WARNING EVT INDICATE ENABLED:2>
<DIS STATU EVT NOTIFICATION ENABLED:1>
<DIS CONFIGURE EVT NOTIFICATIO ENABLED:1>
···
3.OnBleCharacteristicValueChange监听到的数据为空:
···
{"deviceId":"E2:05:08:17:32:01","serviceId":"0000181E-0000-1000-8000-00805F9B34FB","characteristicId":"00002AA5-0000-1000-8000-00805F9B34FB","value":{}}
···
1.广播元数据:
···
0x0BFF491301321708052243430F094346434330353038313733323031
···
2.从机正确打印
···
<BMS NOTIFICATION ENABLED:1>
<CURRENT GLU EVT NOTIFICATION ENABLE:1>
<GLU EVT NOTIFICATION ENABLE:1>
<DIS WARNING EVT INDICATE ENABLED:2>
<DIS STATU EVT NOTIFICATION ENABLED:1>
<DIS CONFIGURE EVT NOTIFICATIO ENABLED:1>
···
3.OnBleCharacteristicValueChange监听到的数据为空:
···
{"deviceId":"E2:05:08:17:32:01","serviceId":"0000181E-0000-1000-8000-00805F9B34FB","characteristicId":"00002AA5-0000-1000-8000-00805F9B34FB","value":{}}
···
实际结果:
1.广播数据为空:
···
{
"deviceId": "E2:05:08:17:32:01",
"name": "CFCC0508173201",
"RSSI": -50,
"localName": "CFCC0508173201",
"advertisServiceUUIDs": [],
"advertisData": {}
}
···
2.notifyBleCharacteristicValueChange提示ok,实际上并没有
···
[Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:99 at common/ble.js:99
00:12:00.301 2AA7---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.302 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:103 at common/ble.js:103
00:12:00.305 2AA9---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.308 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:107 at common/ble.js:107
00:12:00.310 2AAA---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.311 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:111 at common/ble.js:111
00:12:00.313 2AAC---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.315 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:115 at common/ble.js:115
00:12:00.318 2AAE---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.322 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:119 at common/ble.js:119
而从机打印,会确实一些订阅,偶尔会重复订阅
<BMS NOTIFICATION ENABLED:1>
<CURRENT GLU EVT NOTIFICATION ENABLE:1>
<DIS WARNING EVT INDICATE ENABLED:2>
<DIS CONFIGURE EVT NOTIFICATIO ENABLED:1>
···
3.OnBleCharacteristicValueChange监听到的数据为空:
···
{"deviceId":"E2:05:08:17:32:01","serviceId":"0000181E-0000-1000-8000-00805F9B34FB","characteristicId":"00002AA5-0000-1000-8000-00805F9B34FB","value":{}}
···
1.广播数据为空:
···
{
"deviceId": "E2:05:08:17:32:01",
"name": "CFCC0508173201",
"RSSI": -50,
"localName": "CFCC0508173201",
"advertisServiceUUIDs": [],
"advertisData": {}
}
···
2.notifyBleCharacteristicValueChange提示ok,实际上并没有
···
[Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:99 at common/ble.js:99
00:12:00.301 2AA7---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.302 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:103 at common/ble.js:103
00:12:00.305 2AA9---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.308 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:107 at common/ble.js:107
00:12:00.310 2AAA---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.311 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:111 at common/ble.js:111
00:12:00.313 2AAC---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.315 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:115 at common/ble.js:115
00:12:00.318 2AAE---notifyBLECharacteristicValueChange success:notifyBLECharacteristicValueChange:ok at common/ble.js:40
00:12:00.322 [Object] {"errMsg":"notifyBLECharacteristicValueChange:ok"} at common/ble.js:119 at common/ble.js:119
而从机打印,会确实一些订阅,偶尔会重复订阅
<BMS NOTIFICATION ENABLED:1>
<CURRENT GLU EVT NOTIFICATION ENABLE:1>
<DIS WARNING EVT INDICATE ENABLED:2>
<DIS CONFIGURE EVT NOTIFICATIO ENABLED:1>
···
3.OnBleCharacteristicValueChange监听到的数据为空:
···
{"deviceId":"E2:05:08:17:32:01","serviceId":"0000181E-0000-1000-8000-00805F9B34FB","characteristicId":"00002AA5-0000-1000-8000-00805F9B34FB","value":{}}
···
bug描述:
您好,公司在开发一款BLE蓝牙设备,需要开发IOS和Android和华为的三端。因此算是一款物联网APP,因此综合考虑一下使用了uniapp。在使用官网的BLE API 时,坑很多。
第一:官网的API文档没有详细的描述怎么使用,条件是什么
第二:hello uniapp 中蓝牙BLE部分没有详细的展示Demo,只有连接和获取特征值的API使用,其他的API没有演示。
第三:使用手机是华为Mate40Pro,发现使用notifyBleCharacteristicValueChange 时灵时不灵
第四:OnBleCharacteristicValueChange监听到的value是空的
第五:扫描到设备的广播数据是空的
0 个回复