2***@qq.com
2***@qq.com
  • 发布:2022-09-29 01:08
  • 更新:2022-09-29 01:08
  • 阅读:267

【报Bug】BLE API 无法使用

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

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

HBuilderX类型: 正式

HBuilderX版本号: 3.6.2

手机系统: Android

手机系统版本号: Android 11

手机厂商: 华为

手机机型: 华为Mate40Pro

页面类型: vue

vue版本: vue2

打包方式: 离线

项目创建方式: HBuilderX

示例代码:

//弹出框封装  
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,  
}  

操作步骤:

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.广播数据为空:
···
{
"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是空的
第五:扫描到设备的广播数据是空的

2022-09-29 01:08 负责人:无 分享
已邀请:

该问题目前已经被锁定, 无法添加新回复