蓝牙连接水务设备的时候,获取了2种服务,第一种就是获取设备自身的信息,特征值是只读的(properties: {indicate: false,notify: false,read: true,write: false}),但是在监听低功耗蓝牙设备的特征值变化的时候({"deviceId":"90E6E44A-C4A0-E62A-CBE5-7F17AFD93EC8","serviceId":"0000180A-0000-1000-8000-00805F9B34FB","characteristicId":"00002A50-0000-1000-8000-00805F9B34FB","value":{}}),value的值是空的,也是因为本身设备没有运行,我想问的问题是设备没有在运行的时候如何读取只读的特征值?在蓝牙助手的APP上是可以执行的,在uniapp中要如何实现??
//获取蓝牙设备所有服务(service)。
getBLEDeviceServices(deviceId,index){
setTimeout(()=>{
uni.getBLEDeviceServices({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:deviceId,
success:(res)=>{
console.log('device services:', res)
this.serverList = res.services
//获取的所有蓝牙服务
res.services.forEach((item)=>{
//0000180A-0000-1000-8000-00805F9B34FB 获取设备基本信息--第一个服务
//0000FFF0-0000-1000-8000-00805F9B34FB 发送相关字段--第二个服务
if(item.uuid=="0000180A-0000-1000-8000-00805F9B34FB"){
this.serviceId = item.uuid;
console.log('serverId:', this.serviceId)
this.getBLEDeviceCharacteristics(this.deviceId)
}
})
}
})
},5000)
},
// 获取蓝牙特征值
getBLEDeviceCharacteristics(deviceId){
setTimeout(()=>{
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:this.serviceId,
success:(res)=>{
console.log('获取蓝牙特征值',res)
console.log('获取蓝牙特征值',res.characteristics)
// [{properties: {notify: false, write: false, indicate: false, read: true}
// uuid: "00002A23-0000-1000-8000-00805F9B34FB"}] notify--false的时候是不能启用 notify 功能notifyBLECharacteristicValueChange
this.characteristics = res.characteristics
res.characteristics.forEach((item,index)=>{
this.characteristicId = item.uuid;
console.log('characteristicId:', this.characteristicId)
this.notifyBLECharacteristicValueChange(this.deviceId)
// this.readBLECharacteristicValue(this.deviceId)
})
},
fail:(res)=>{
console.log(res)
}
})
},2000)
},
// 启用 notify 功能
notifyBLECharacteristicValueChange(deviceId){
console.log('notify 功能')
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:this.serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId:this.characteristicId,
success:(res)=> {
console.log('success', res)
this.onBLECharacteristicValueChange(this.deviceId);
},
fail:(res)=> {
console.log('fail', res)
}
})
},
//010d0000001001 ArrayBuffer转16进度字符串示例
ab2hex(buffer) {
const hexArr = Array.prototype.map.call(
new Uint8Array(buffer),
function (bit) {
return ('00' + bit.toString(16)).slice(-2)
})
console.log('获取的转义文字',hexArr.join(''))
return hexArr.join('')
},
Uint8ArrayToString(fileData){
var dataString = "";
for (var i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i]);
}
return dataString
},
// 监听低功耗蓝牙设备的特征值变化
onBLECharacteristicValueChange(deviceId){
uni.onBLECharacteristicValueChange((res)=> {
console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
console.log(this.ab2hex(res.value))
console.log('监听低功耗蓝牙设备的特征值变化',JSON.stringify(res))
console.log('要转义的文字',res.value)
console.log('要转义的文字Uint8ArrayToString',this.Uint8ArrayToString(res.value))
console.log('要转义的文字stringify',JSON.stringify(res.value))
this.macAddress = res.deviceId;
this.macValue = this.ab2hex(res.value);
console.log('特征变化值',this.macAddress,this.macValue)
// this.readBLECharacteristicValue(this.deviceId)
})
},
// 读取设备二进制数据
readBLECharacteristicValue(){
console.log('进入读取');
// setTimeout(()=>{
uni.readBLECharacteristicValue({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId:this.deviceId,
// 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
serviceId:this.serviceId,
// 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
characteristicId:this.characteristicId,
success:(res)=> {
console.log('readBLECharacteristicValue:success', res)
this.readCode = res.errCode;
this.readCodeMsg = res.errMsg;
this.onBLECharacteristicValueChange(this.deviceId);
},
fail:(res)=> {
console.log('readBLECharacteristicValue:fail', res)
this.readCode = res.errCode;
this.readCodeMsg = res.errMsg;
this.onBLECharacteristicValueChange(this.deviceId);
}
})
// },200)
},