diff --git a/manifest.json b/manifest.json index e142c32..9058167 100644 --- a/manifest.json +++ b/manifest.json @@ -24,8 +24,7 @@ "Geolocation" : {}, "Maps" : {}, "Record" : {}, - "VideoPlayer" : {}, - "Push" : {} + "VideoPlayer" : {} }, /* 应用发布信息 */ "distribute" : { diff --git a/pages/common/addBLE/addEquip.vue b/pages/common/addBLE/addEquip.vue index 31992f0..2de8664 100644 --- a/pages/common/addBLE/addEquip.vue +++ b/pages/common/addBLE/addEquip.vue @@ -48,7 +48,7 @@ - 搜索设备 + 发现设备:{{deviceCnt}} 刷新 @@ -163,7 +163,12 @@ } }, computed: { - + deviceCnt:function(){ + let arr=this.EquipMents.filter(item=>{ + return item.name.toLowerCase().indexOf(this.search.toLowerCase())>-1; + }); + return arr.length; + } }, onHide: function() { this.Status.isPageHidden = true; diff --git a/pages/common/index/index.vue b/pages/common/index/index.vue index 0f008ac..c189f71 100644 --- a/pages/common/index/index.vue +++ b/pages/common/index/index.vue @@ -57,8 +57,9 @@ v-if="item.communicationMode==0 && item.onlineStatus==1 && item.alarmStatus==1"> 报警中 - 已连接 - 未连接 + + {{item.bleStatu?'已连接':'未连接'}} + @@ -145,7 +146,8 @@ deviceReName } from '@/api/common/index.js' import BleHelper from '@/utils/BleHelper.js'; - var ble=null; + var pagePath = 'pages/common/index'; + var ble = null; export default { onPullDownRefresh() { // 执行下拉刷新时的操作,比如重新获取数据 @@ -212,6 +214,69 @@ } }, methods: { + bleStateRecovery() { + console.log("蓝牙适配器恢复可用,重连断开的设备"); + ble.linkAllDevices(); + // if (ble.data && ble.data.LinkedList) { + // for (var i = 0; i < this.deviceList.length; i++) { + // if (this.deviceList[i].communicationMode !== '0' || this.deviceList[i].communicationMode !== 0) { + // ble.data.LinkedList.find(v => { + + // if (v.macAddress && v.device && v.device.id && v.device.id == this.deviceList[i] + // .id) { + // ble.LinkBlue(v.deviceId); + // return true; + // } + // }); + // } + // } + // } + }, + bleBreak(res) { + console.log("蓝牙断开连接", res); + if (res.deviceId) { + this.updateBleStatu(res.deviceId); + } + + }, + bleRecovery(res) { + console.log("蓝牙连接成功", res); + if (res.deviceId) { + this.updateBleStatu(res.deviceId); + } + + }, + + updateBleStatu(deviceId) {//更新列表的蓝牙连接状态 + if (ble) { + + for (var i = 0; i < this.deviceList.length; i++) { + + let bleStatu = false; + if (ble.data && ble.data.LinkedList) { + ble.data.LinkedList.find(v => { + if (deviceId && v.deviceId != deviceId) { + return false; + } + if (v.macAddress && v.device && v.device.id) { + if (v.device.id == this.deviceList[i].id && v.Linked) { + + bleStatu = true; + return true; + } + + } + }); + } + this.$set(this.deviceList[i], 'bleStatu', bleStatu); + + + + } + return; + } + console.error("ble is null") + }, // 更多 allMore() { this.showshare = !this.showshare; @@ -291,6 +356,10 @@ // 如果是第一页或切换分类,替换数据 this.deviceList = this.page === 1 ? newDevices : [...this.deviceList, ...newDevices]; + + + this.updateBleStatu(); + this.total = res.total; // 判断是否加载完成 if (res.rows.length < this.size || this.deviceList.length >= this.total) { @@ -390,8 +459,8 @@ }, 500); this.deleteShow = false // 关闭所有滑动项 - this.$refs.swipeAction.closeAll(); - + this.$refs.swipeAction.closeAll(); + ble && ble.DropDevice(data.id); } else { uni.showToast({ @@ -492,7 +561,7 @@ let url = item.detailPageUrl; // console.log("url=",url); // if(!url){ - //url="/pages/670/HBY670" + //url="/pages/670/HBY670" // } uni.navigateTo({ url: url, @@ -506,8 +575,9 @@ deviceType: this.tabs[this.activeTab].id || '', apiType: 'listA' //标识,根据这个参数,区分普通详情,分享跳转详情,查不一样的权限信息 }); - },fail(ex) { - console.log("ex=",ex); + }, + fail(ex) { + console.log("ex=", ex); } }) }, @@ -559,14 +629,35 @@ console.log('列表收到消息了么'); this.onIntall() }); - ble=BleHelper.getBleTool(); + ble = BleHelper.getBleTool(); + + //蓝牙连接成功的回调 + ble.addRecoveryCallback((res) => { + console.log("11111"); + this.bleRecovery(res); + }, pagePath); + + //蓝牙断开连接的回调 + ble.addDisposeCallback((res) => { + console.log("2222222"); + this.bleBreak(res); + }, pagePath); + + //蓝牙适配器恢复可用的回调,一般是重连设备 + ble.addStateRecoveryCallback(res => { + this.bleStateRecovery(); + }, pagePath); + + }, + beforeDestroy() { // 组件销毁前移除监听器 uni.$off('refreshDeviceList'); }, onUnload() { uni.$off('deviceStatusUpdate'); + ble && ble.removeAllCallback(); } } diff --git a/utils/BleHelper.js b/utils/BleHelper.js index 04faebb..496a01d 100644 --- a/utils/BleHelper.js +++ b/utils/BleHelper.js @@ -513,58 +513,71 @@ class BleHelper { return bytes.map(byte => byte.toString(16).padStart(2, '0')); } - + let adapterStateTime=null; uni.onBluetoothAdapterStateChange((state) => { - console.log('蓝牙状态发生变化:' + JSON.stringify(state)); - this.data.discovering = state.discovering; - - if (this.data.available !== state.available) { - this.data.available = state.available; + clearTimeout(adapterStateTime); + setTimeout(()=>{ - if (this.data.available && this.data - .isOpenBlue) { //蓝牙状态再次可用,重连所有设备 - - if (this.cfg.stateRecoveryCallback.length > 0) { - this.cfg.stateRecoveryCallback.forEach( - c => { - try { - c.callback(); - } catch (error) { - console.error( - "蓝牙适配器已恢复,但回调函数发生错误", - error); - } - }) - } - + if(this.data.discovering === state.discovering && this.data.available===state.available){ + console.error("专业给Uniapp填坑,适配器状态错误"); + return; } - } - - - if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接 - - this.data.LinkedList.filter((v) => { - v.Linked = false; - v.notifyState = false; - return true; - }); - let keys = Object.keys(bleDeviceStates) - keys.filter(v => { - bleDeviceStates[v] = false; - }); - - this.cfg.stateBreakCallback.forEach(f => { - try { - f.callback(); - } catch (error) { - console.error("蓝牙状态不可用了,执行回调异常", - error) + console.log('蓝牙模块状态发生变化:' + JSON.stringify(state)); + this.data.discovering = state.discovering; + + if (this.data.available !== state.available) { + this.data.available = state.available; + + if (this.data.available && this.data + .isOpenBlue) { //蓝牙适配器再次可用 + + if (this.cfg.stateRecoveryCallback.length > 0) {//执行适配器恢复的回调 + console.log('蓝牙状态再次可用,执行恢复连接的回调'); + this.cfg.stateRecoveryCallback.forEach( + c => { + try { + c.callback(); + console.log("执行恢复连接的回调成功"); + } catch (error) { + console.error( + "蓝牙适配器已恢复,但回调函数发生错误", + error); + } + }) + } + } - - }) - - this.updateCache(); - } + } + + + if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接 + console.log("蓝牙模块不可用了,将所有设备标记为断开连接"); + this.data.LinkedList.filter((v) => { + v.Linked = false; + v.notifyState = false; + + return true; + }); + // let keys = Object.keys(bleDeviceStates) + // keys.filter(v => { + // bleDeviceStates[v] = false; + // }); + + this.cfg.stateBreakCallback.forEach(f => { + try { + f.callback(); + console.log("执行断开连接的回调成功"); + } catch (error) { + console.error("蓝牙状态不可用了,执行回调异常", + error) + } + + }) + + this.updateCache(); + } + },500); + }); @@ -594,8 +607,8 @@ class BleHelper { return false; }); this.updateCache(); - if (f && f.device && f.device.id) { - console.log("尝试5次恢复连接,", f + if (f && f.device && f.device.id && this.data.available) { + console.log("蓝牙状态可用,尝试5次恢复连接,", f .deviceId); this.LinkBlue(res.deviceId, f .writeServiceId, f @@ -609,6 +622,7 @@ class BleHelper { (c) => { try { c.callback(res); + console.log("执行蓝牙断开连接的回调成功"); } catch (error) { console.error( "执行蓝牙断开连接的回调出现异常,", @@ -618,20 +632,7 @@ class BleHelper { } } else { - console.log("蓝牙连接已恢复,", res); - if (this.cfg.recoveryCallback.length > - 0) { - this.cfg.recoveryCallback.forEach(( - c) => { - try { - c.callback(res); - } catch (error) { - console.error( - "执行蓝牙恢复连接的回调出现异常,", - error) - } - }); - } + console.log("蓝牙连接已恢复",res); } }, 0); @@ -1501,6 +1502,20 @@ class BleHelper { this.updateCache(); // console.log("LinkedList=", this.data // .LinkedList); + + //执行连接成功的回调 + if (this.cfg.recoveryCallback.length >0) { + this.cfg.recoveryCallback.forEach(( + c) => { + try { + c.callback({deviceId:deviceId,connected:true}); + } catch (error) { + console.error( + "执行蓝牙恢复连接的回调出现异常,", + error) + } + }); + } // 处理 MTU 设置 if (plus.os.name === 'Android') { @@ -1830,7 +1845,7 @@ class BleHelper { Promise.race([timeOut(ms), promise]).then(resolve).catch((ex) => { // console.error("ex=", ex); if (ex.code == -1) { - // console.error('专业给Uniapp填坑,发送消息永无回调'); + console.error('专业给Uniapp填坑,发送消息永无回调'); resolve(ex); } else { reject(ex);