问题:微信版本由8.0.58更新到8.0.60后,用微信小程序调用wx.connectWifi配置硬件ESP8266网络时出现第一次连接时可以成功连接并提示`要保存此网络吗`选择保存后可以连接成功,手机连接上的wifi也可以切换成功,但是在保存这个网络后第二次及之后连接这个ESP8266网络时就连不上了,并且wx.connectWifi的fail回调中会出现错误:err: {"errno": 1505042, "errCode": 12015, "errMsg": "connectWifi:fail:wifi config already exist"}。
补充问题:
TCPSocket.connect(Object options)接口在更新后也出现了连接建立不上的问题。
出问题的机型:目前已知 小米、红米、vivo 品牌的所有手机都有此问题。只有苹果和华为未出现这个问题。
特别说明:手机微信版本更新到8.0.58及之前安卓和苹果手机都未出现过此问题,因为我们测试时将微信8.0.60版本切换回8.0.58版本后可以正常使用。
怀疑问题所在点:在微信8.0.58版本调用wx.connectWifi接口时,弹出的提示框内容为微信要与某个设备搭配使用(选项是取消/连接),但在微信8.0.60版本调用wx.connectWifi接口时,弹出的提示框内容为要保存此网络吗(选项是取消/保存)`。
操作步骤为(在第二步出现问题了):
1. 连接指定 Wi-Fi 设备
如果知道 Wi-Fi 设备名称和密码,并确认设备在附近,可以直接在小程序中连接指定 Wi-Fi。
接口调用时序为:
- startWifi: 初始化 Wi-Fi 模块
- connectWifi: 连接 Wi-Fi(iOS 需 11 及以上版本支持)
- onWifiConnected: 连接上 Wi-Fi 的事件回调
/** 确定按钮前置操作 //连接wifi初始化wifi */
initWifiConfirmTwo(){
const _this = this;
this.loading = true;
this.wifiFlag = false;//重置连接wifi标志
this.tcpFlag = false;//重置连接tcp标志
if(!this.getsysStatus()) return; // 检查 Wi-Fi 和 定位状态
wx.startWifi({
success (res) {
_this.initWifiFlag = true;
_this.loading = false;
_this.confirmConnectWifi();
},
fail(err){
_this.loading = false;
_this.initWifiFlag = false;
}
})
},
/**确定按钮真正操作 连接wifi */
async confirmConnectWifi(){
console.log("A1");
this.loading = true;
// 调用设备重新进行wifi的服务
// await this.autoReSetNetService();
console.log("A2");
if(!this.wifiName){
this.loading = false;
this.showAlert("WiFi名称不能为空!");
return;
}
uni.setStorageSync("historyWifiInfo",{'wifiName':this.wifiName,'wifiPassword':this.wifiPassword})//缓存上次的名称密码
if(!this.wifiPassword){
this.loading = false;
const res = await this.showModalSc();
if (res.confirm) {
this.connects();// 执行tcp连接操作
} else if (res.cancel) {
this.loading = false;
}
}else{
//如果 Wi-Fi 密码不为空,直接执行连接
this.loading = false;
this.connects();
}
},
showModalSc(){
return new Promise((resolve,reject) => {
uni.showModal({
title: '提示',
content: `WiFi密码为空,是否继续`,
cancelText: '取消',
confirmText: '继续',
success: function (res) {
resolve(res)
}
});
})
},
/** 连接设备 */
async connects(attempt = 1){
if (this.isUnloaded) return;
console.log("B1",attempt);
const _this = this;
this.loading = true;
if(this.wifiFlag == false){
try{
console.log("B2",attempt);
const res = await this.connwifi(this.deviceBSSID);//页面退出前进入了这个方法
console.log("B3",attempt);
if (this.isUnloaded) return;
console.log("B4",attempt);
console.log('结果:',res);// {errCode:0,errMsg:"connectWifi:ok",errno:0}
if((this.userPhoneOS == 'ios' || res.errCode==0) && res.errMsg == 'connectWifi:ok'){
console.log("B5",attempt);
this.wifiFlag=true;
console.log("B6",attempt);
// 连接成功后开始建立 TCP 连接
this.timers.timerB = setTimeout(()=>{
console.log("B7",attempt);
try{
this.loading = false;
console.log("B8",attempt);
if (this.isUnloaded) return;
console.log("B9",attempt);
this.createTcpEsp();
console.log("B10",attempt);
}catch(e){
console.log("B11",attempt);
this.loading = false;
console.log("B12",attempt);
}
},500)
}
} catch(err){
console.log("B101",attempt);
console.log('catch结果:',err);
console.log("B102",attempt);
this.wifiFlag=false;
console.log("B103",attempt);
if (this.isWifiActive && attempt < 3) {
console.log("B104",attempt);
this.timers.timerC = setTimeout(() => {
console.log("B105",attempt)
if (this.isUnloaded) return;
console.log("B106",attempt);
this.connects(attempt + 1);
console.log("B107",attempt);
}, 2000 * attempt);
console.log("B108",attempt);
} else {
console.log("B109",attempt);
this.loading = false;
console.log("B110",attempt);
if (this.isUnloaded) return;
console.log("B111",attempt);
this.handleWifiConnectionError(err);//但是页面退出后这个方法依旧被执行了
console.log("B112",attempt);
}
console.log("B113",attempt);
}
}else{
console.log("B114",attempt);
console.log("this.wifiFlag 为 true");
this.loading = false;
console.log("B115",attempt);
}
console.log("B116",attempt);
},
/** 连接设备wifi */
connwifi(deviceBSSID){
console.log("C1",deviceBSSID);
return new Promise((resolve,reject) => {
console.log("C2",deviceBSSID);
wx.connectWifi({
SSID: deviceBSSID,
password:'88888888',
forceNewApi: true,
success(res) {
console.log("C3",deviceBSSID);
console.log('res:',res);
resolve(res);
},
fail(err){
console.log("C4",deviceBSSID);
console.log('err:',err);
reject(err)
},
})
console.log("C5",deviceBSSID);
})
console.log("C6",deviceBSSID);
},
已知问题,后续修复
我们也碰到了相同的问题,请官方同学关注一下