问题模块 框架类型 问题类型 API/组件名称 终端类型 微信版本 基础库版本
API和组件 微信小程序 Bug getBLEDeviceCharacteristics 客户端 6.7.3 2.4.0 [186]
- 当前 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;