- 当前 Bug 的表现(可附上截图)
我在做小程序和BLE模块的通信开发,在找到设备连接成功后,调试模式和非调试模式(直接在微信里打开开发版小程序)都可以获取到services列表,但在获取Characteristics时就产生了不同:调试模式可以正常获取到所有Characteristics,而非调试模式只能获取到个别Characteristics,每次获取到的Characteristics有时还不一样(有时这个能获取,有时另外的能获取),因为不能获取到全部或者自己关心的Characteristics,所以,非调试模式虽然能连接上BLE设备,但却无法实现正常通信。
顺便提另外一个现象:在调试模式获取不全Characteristics时(偶尔),若重新调用获取Services和Characteristics,感觉底层或有重复,因为在连接后向BLE模块发送指令时,发送一次会出现多次成功回调。
- 预期表现
期望无论在调试模式还是非调试正常运行模式,都能获取到所有Services和Characteristics.
- 复现路径
连接上BLE设备,获取其Services并对每一个Service获取其Characteristics
- 提供一个最简复现 Demo
// 获取连接设备的service服务
getServices: function (dev) {
var that = this;
var servindex = that.data.devicesT.servindex;
servindex.push(dev.index);
that.setData({
[“devicesT.servindex”]: servindex
})
wx.getBLEDeviceServices({
// 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: dev.deviceId,
success: function (res) {
var servindex = that.data.devicesT.servindex;
var dev = that.data.devicesT.devices[servindex.shift()];
console.log(‘device ‘+ dev.name +’ services found:’, JSON.stringify(res.services));
dev.services = res.services
that.setData({
[“devicesT.servindex”]: servindex,
[“devicesT.devices[” + dev.index + “].services”]: dev.services,
//msg: JSON.stringify(dev.services),
});
console.log(‘getBLEDeviceServices’, dev.nickName + ’ services:’ + res.services.length)
setTimeout(function(){
that.getCharactors(dev);
},100,dev)
},fail: function(res){
var servindex = that.data.devicesT.servindex;
var dev = that.data.devicesT.devices[servindex.shift()];
var sett_device = ‘devicesT.devices[’+dev.index+’]’;
that.setData({
[“devicesT.servindex”]: servindex,
gerrcode : res.errCode,
[sett_device+’.errCode’]: res.errCode
})
}
})
},
getCharactors: function (dev) {
var that = this;
var devId = dev.deviceId
var index = dev.index
//对所有预定义的服务通道进行初始化填充uuid
var defineChnls = that.data.devicesT.defineChnls;
for (var dch in defineChnls) {
var defChnl = defineChnls[dch];
for (var sv in dev.services) {
var serv = dev.services[sv];
if(that.data.gerrcode!=‘0’) {
return;
}
if (defChnl.servId != serv.uuid.substr(4, 4)){
continue;
}
console.log(“findingChL:”, “dev:”+ dev.nickName+","+defChnl.servId + “**” + serv.uuid + “**”);
var servchnls = { servUUID: serv.uuid, chnls: [] };
var devservidx = that.data.devicesT.devservidx;
devservidx.push({
device: dev,
defchnls: defChnl,
servchls: servchnls
})
var keyName = “devicesT.devices[” + index + “].channels”;
that.setData({
[“devicesT.devservidx”]: devservidx,
});
wx.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要在上面的 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
deviceId: devId,
// 这里的 serviceId 需要在上面的 getBLEDeviceServices 接口中获取
serviceId: serv.uuid,
success: function (res) {
//res里没有当初的deviceId和serviceId真是恶心人呀,得从根儿里自己匹配
var devservidx = that.data.devicesT.devservidx;
var idxOne = devservidx.shift()
var dev = idxOne.device;
var servchls = idxOne.servchls;
var defChnl = idxOne.defchnls;
console.log(‘getBLEDeviceCharacteristics’, dev.nickName + ‘,’ + servchls.servUUID+’,’+res.errMsg);
var channels = dev.channels;
if (channels == undefined) {
channels = new Array();
}
for (var fc in defChnl.chnls) {//只提取那些已经事先定义好的Channels
var defCh = defChnl.chnls[fc];
for (var cs in res.characteristics) {
var ch = res.characteristics[cs];
var shId = ch.uuid.substr(4, 4);
//定位目标通道
if (shId != defCh.chId) {
continue;
}
var chnl = { charUUID: ch.uuid }
var isExist = false;
for (var j in servchls.chnls){
var cl = servchls.chnls[j].charUUID
if (cl == ch.uuid) {
isExist = true;
break;
}
}
if(!isExist){
servchls.chnls.push(chnl);
console.log(“name:” + dev.name + “,servId:” + defChnl.servId + “,chnlId:” + ch.uuid);
}
break;
}
}
isExist = false;
for (var j in channels) {
var scId = channels[j].servUUID
if (scId == servchls.servUUID) {
isExist = true;
break;
}
}
if (!isExist) {
channels.push(servchls);
}
dev.channels = channels;
var sett_device = “devicesT.devices[” + dev.index + “]”;
that.setData({
[sett_device+’.channels’]: dev.channels,
[“devicesT.devservidx”]: devservidx,
//msg: JSON.stringify(channels),
});
console.log(JSON.stringify(dev.channels));
//这里确认我们定义的属性通道特征字是否已经获取齐全,如果齐全了,则配置使能事件通知
if(!that.channelsReady(dev)) return;
setTimeout(function () {
that.blecallbackinit(dev);//配置使能事件通知
}, 200, dev);
},fail: function(res){
var devservidx = that.data.devicesT.devservidx;
var idxOne = devservidx.shift()
var dev = idxOne.device;
var servchls = idxOne.servchls;
var sett_device = “devicesT.devices[” + dev.index + “]”;
console.log(dev.nickName + ‘,’ + servchls.servUUID + ‘,’ + JSON.stringify(res));
that.setData({
gerrcode: res.errCode,
[sett_device + ‘.errCode’]: res.errCode,
[sett_device+’.channels’]: dev.channels,
[“devicesT.devservidx”]: devservidx,
//msg: JSON.stringify(channels),
});
}
})
}
};
},
请提供出现问题的机型和微信版本、基础库版本,以及能复现问题的简单代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)