new-20250827 #26

Merged
dyf merged 8 commits from liubiao/APP:new-20250827 into main 2025-12-03 16:50:58 +08:00
13 changed files with 706 additions and 167 deletions

View File

@ -26,7 +26,7 @@
<view class="p100" :style="{backgroundColor:config.activeIndex==index?config.itemBgColor:'', <view class="p100" :style="{backgroundColor:config.activeIndex==index?config.itemBgColor:'',
justifyContent:config.textAlign justifyContent:config.textAlign
}"> }">
<view class="imgContent" :style="{ <view class="imgContent" v-if="item.icon" :style="{
height:config.itemHeight, height:config.itemHeight,
width:config.itemHeight width:config.itemHeight
}"> }">

View File

@ -24,8 +24,7 @@
"Geolocation" : {}, "Geolocation" : {},
"Maps" : {}, "Maps" : {},
"Record" : {}, "Record" : {},
"VideoPlayer" : {}, "VideoPlayer" : {}
"Push" : {}
}, },
/* */ /* */
"distribute" : { "distribute" : {

View File

@ -16,7 +16,7 @@
<view class="row"> <view class="row">
<image class="img" src="/static/images/6155/DeviceDetail/time.png" mode="aspectFit"></image> <image class="img" src="/static/images/6155/DeviceDetail/time.png" mode="aspectFit"></image>
<view class="txt"> <view class="txt">
<view class="bigTxt">{{formData.sta_charge?dic.sta_charge[formData.sta_charge]:"" }}</view> <view class="bigTxt">{{formData.sta_charge?dic.sta_charge[formData.sta_charge+'']:"未充电" }}</view>
<view class="smallTxt">设备状态</view> <view class="smallTxt">设备状态</view>
</view> </view>
</view> </view>
@ -46,10 +46,10 @@
</view> --> </view> -->
</view> </view>
<view class="warnnig" :class="{'displayNone':formData.sta_sosadd===''}"> <view class="warnnig" v-for="item,index in warnDevices">
<view>闯入报警</view> <view>闯入报警</view>
<view> <view>
{{getWarDevice(formData.sta_sosadd)}} {{item.name}}
</view> </view>
</view> </view>
@ -114,6 +114,7 @@
</view> </view>
<view class="rightTxt"> <view class="rightTxt">
<text class="bigTxt">{{item.name}}</text> <text class="bigTxt">{{item.name}}</text>
<text class="smallTxt" v-if="item.group==='sta_RadarType'">{{Distance}}</text>
</view> </view>
</view> </view>
@ -160,6 +161,10 @@
<global-loading ref="loading" /> <global-loading ref="loading" />
<BottomSlideMenuPlus :config="Status.BottomMenu" @itemClick="btnClick" @close="closeActionSheet">
</BottomSlideMenuPlus>
</view> </view>
</template> </template>
@ -218,9 +223,31 @@
show: false, show: false,
showHeader: true, showHeader: true,
menuItems: [{ menuItems: [{
text: '强光', text: '2M',
icon: '/static/images/6155/DeviceDetail/qiang.png' value:'status_2M',
}], icon: ''
},
{
text: '4M',
value:'status_4M',
icon: ''
},
{
text: '7M',
value:'status_7M',
icon: ''
},
{
text: '10M',
value:'status_10M',
icon: ''
},
{
text: '关闭',
value:'status_off',
icon: ''
}
],
activeIndex: -1, activeIndex: -1,
bgColor: '#2a2a2a', bgColor: '#2a2a2a',
itemBgColor: '#3a3a3a', itemBgColor: '#3a3a3a',
@ -254,12 +281,13 @@
statu: '', statu: '',
sta_address: '', sta_address: '',
bleStatu: false, bleStatu: false,
sta_charge:'',
sta_LedType: '', sta_LedType: '',
sta_RadarType: '', sta_RadarType: '',
sta_Online: '', sta_Online: '',
warnTime: '', warnTime: '',
sta_sosadd: "", sta_sosadd: "",
sta_sosName:'',
sta_IntrusTime: '' sta_IntrusTime: ''
}, },
@ -349,10 +377,7 @@
showConfirm: false showConfirm: false
}, },
groupDevices: [], groupDevices: [],
audioData: { warnDevices:[]
packetCtn: 0,
hexs: []
}
} }
}, },
@ -429,7 +454,28 @@
this.Status.pageHide = false; this.Status.pageHide = false;
}, },
computed: { computed: {
Distance:function(){
let f=this.Status.BottomMenu.menuItems.find((item,index)=>{
return item.value===this.formData.sta_RadarType;
});
if(f){
return f.text;
}
return '关闭';
},
activeIndex:function(){
let active=4;
let f=this.Status.BottomMenu.menuItems.find((item,index)=>{
if(item.value===this.formData.sta_RadarType){
active=index;
}
});
return active;
}
}, },
methods: { methods: {
@ -441,7 +487,8 @@
if (item.group == 'sta_RadarType') { if (item.group == 'sta_RadarType') {
this.toggleRedar(item, index); // this.toggleRedar(item, index);
this.showRedarSetting(item,index);
return; return;
} }
@ -507,6 +554,25 @@
} }
},
showRedarSetting(){
this.Status.BottomMenu.show=true;
this.Status.BottomMenu.showBtn=false;
this.Status.BottomMenu.title="感应距离设置";
this.Status.BottomMenu.textAlign="center";
this.Status.BottomMenu.showMask=true;
this.Status.BottomMenu.activeIndex=this.activeIndex;
},
btnClick(item,index){
this.Status.BottomMenu.show=false;
console.log("选中的项:"+index+",值:"+JSON.stringify(item));
this.toggleRedar(item,index);
},
closeActionSheet(){
this.Status.BottomMenu.show=false;
}, },
toggleRedar(item, index) { //雷达启停 toggleRedar(item, index) { //雷达启停
let f = this.getDevice(); let f = this.getDevice();
@ -521,7 +587,7 @@
deviceId: '12345' deviceId: '12345'
} }
// #endif // #endif
let val = item.key; let val = item.value;
if (this.formData.sta_RadarType === val) { if (this.formData.sta_RadarType === val) {
val = 'status_off'; val = 'status_off';
} }
@ -533,7 +599,9 @@
ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30) ble.sendString(f.deviceId, json, f.writeServiceId, f.wirteCharactId, 30)
.then(res => { .then(res => {
debugger;
this.formData.sta_RadarType = val; this.formData.sta_RadarType = val;
this.Status.BottomMenu.activeIndex=index;
these.setBleFormData(); these.setBleFormData();
resolve(); resolve();
}) })
@ -750,6 +818,31 @@
console.log("json=", json) console.log("json=", json)
let active=-1;
let f=this.Status.BottomMenu.menuItems.find((item,index)=>{
if(item.value===json.sta_RadarType){
active=index;
}
});
this.Status.BottomMenu.activeIndex=active;
let msg = [];
if (json.sta_PowerPercent <= 20 && (json.sta_charge===0 || json.sta_charge==='0')) {
msg.push("设备电量低");
}
if(json.sta_sosadd_off){//某个设备解除报警
this.warnDevices.filter((d,index)=>{
if(d.mac===json.sta_sosadd_off){
this.warnDevices.splice(index,1);
}
});
}
let keys = Object.keys(json); let keys = Object.keys(json);
keys.forEach(key => { keys.forEach(key => {
@ -759,24 +852,24 @@
} }
}); });
let msg = [];
if (this.formData.sta_PowerPercent <= 20) {
msg.push("设备电量低");
}
if (json.sta_sosadd_off == this.formData.sta_sosadd) {
this.formData.sta_sosadd = "";
let name=this.getWarDevice(json.sta_sosadd_off);
msg.push('"' + name + '"取消报警');
}
if (this.formData.sta_sosadd !== "") { if (json.sta_sosadd) {//某个设备闯入报警
console.log("查询设备中"); console.log("查询设备中",json.sta_sosadd);
this.searchDevice(this.formData.sta_sosadd).catch(ex => {}).then(dev => { this.searchDevice(json.sta_sosadd).catch(ex => {}).then(dev => {
console.log("dev=", dev); console.log("dev=", dev);
let d=this.warnDevices.find(v=>{return v.mac===json.sta_sosadd});
let deviceName="";
if (dev) { if (dev) {
// this.formData.sta_sosName=dev.deviceName;
msg.push('"' + dev.deviceName + '"闯入报警中'); msg.push('"' + dev.deviceName + '"闯入报警中');
deviceName=dev.deviceName;
} else { } else {
msg.push('闯入报警中'); msg.push('闯入报警中');
// this.formData.sta_sosName="";
}
if(!d){
this.warnDevices.push({mac:json.sta_sosadd,name:deviceName});
} }
this.showMsg(msg.join(',')); this.showMsg(msg.join(','));
}); });
@ -805,6 +898,7 @@
}, },
getWarDevice(macStr) { getWarDevice(macStr) {
console.log("macStr=",macStr);
if (macStr) { if (macStr) {
if (!macStr.includes(':')) { if (!macStr.includes(':')) {
@ -834,13 +928,13 @@
let f = this.groupDevices.find(v => { let f = this.groupDevices.find(v => {
return v.deviceMac === macStr; return v.deviceMac === macStr;
}); });
console.log("111111111"); // console.log("111111111");
if (f) { if (f) {
console.log("找到设备", f); console.log("找到设备", f);
resolve(f); resolve(f);
return; return;
} }
console.log("111111111"); // console.log("111111111");
if (macStr == this.device.deviceMac) { if (macStr == this.device.deviceMac) {
console.log("当前设备", this.device); console.log("当前设备", this.device);
resolve(this.device); resolve(this.device);
@ -1058,9 +1152,6 @@
buttonText: '确定', buttonText: '确定',
okCallback: null okCallback: null
}); });
},
btnClick() {
} }
} }
} }

View File

@ -256,6 +256,7 @@
colors as groupColors colors as groupColors
} from '@/api/4877/BJQ4877.js'; } from '@/api/4877/BJQ4877.js';
import MqTool from '@/utils/MqHelper.js'
const pagePath = "/pages/4877/BJQ4877"; const pagePath = "/pages/4877/BJQ4877";
@ -264,6 +265,7 @@
var recei = null; var recei = null;
var interval = null; var interval = null;
var slidTime = null; var slidTime = null;
var mq=null;
export default { export default {
data() { data() {
return { return {
@ -389,12 +391,19 @@
onUnload() { onUnload() {
console.log("页面卸载,释放资源"); console.log("页面卸载,释放资源");
ble.removeAllCallback(pagePath); ble.removeAllCallback(pagePath);
if(mq){
mq.unSubscribes();
mq.disconnect();
}
ble=null;
mq=null;
clearInterval(interval); clearInterval(interval);
}, },
onLoad: function() { onLoad: function() {
these = this; these = this;
recei = BleReceive.getBleReceive(); recei = BleReceive.getBleReceive();
ble = BleTool.getBleTool(); ble = BleTool.getBleTool();
mq=MqTool.getMqTool();
this.dic.gropus = []; this.dic.gropus = [];
@ -429,6 +438,14 @@
} }
var device = data.data; var device = data.data;
these.device = device; these.device = device;
let arr=[{topic:'C/4877_Groups_'+these.device.id,callback:these.getCheckedColors}];
mq.init().then(res=>{
mq.subscribes(arr).catch(ex=>{
console.error("ex=",ex);
});
})
let f = ble.data.LinkedList.find((v) => { let f = ble.data.LinkedList.find((v) => {
if (v.macAddress == device.deviceMac) { if (v.macAddress == device.deviceMac) {
// console.log("找到设备了", v); // console.log("找到设备了", v);
@ -477,6 +494,30 @@
}, },
methods: { methods: {
getCheckedColors(rec){
console.error("收到MQ消息:",rec);
try{
let str=rec.receive.payloadString;
let arr=JSON.parse(str);
let groups = groupColors.filter((v,index) => {
if(arr[index]===1){
return true;
}
return false;
});
these.dic.groups = groups;
}catch(err){
}
},
ShowChannelEdit() { ShowChannelEdit() {
this.Status.ShowEditChannel = true; this.Status.ShowEditChannel = true;
this.showPop({ this.showPop({
@ -596,7 +637,11 @@
return; return;
} }
mq.sendData('C/4877_Groups_'+these.device.id,JSON.stringify(arr),true).then(res=>{
console.log("发送成功,",res)
}).catch(err=>{
console.error("err=",err);
});
var json = { var json = {
ins_GroupType: arr ins_GroupType: arr
} }

View File

@ -834,7 +834,6 @@
initMQ() { initMQ() {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
if (mqttClient) { if (mqttClient) {
// console.log("无需再次初始化") // console.log("无需再次初始化")
resolve(); resolve();
@ -953,7 +952,7 @@
if ("sta_LightGrade" in json) { if ("sta_LightGrade" in json) {
let lightingLevelText = json.sta_LightGrade === 1 ? 'hight' : json.sta_LightGrade === 2 ? 'low' : let lightingLevelText = json.sta_LightGrade === 1 ? 'qiang' : json.sta_LightGrade === 2 ? 'ruo' :
'close'; 'close';
receiveData.lightCurr = lightingLevelText; receiveData.lightCurr = lightingLevelText;
} }

View File

@ -48,12 +48,17 @@
</view> </view>
<view class="lblTitle"> <view class="lblTitle">
<text>搜索设备</text> <text>发现设备:{{deviceCnt}}</text>
<view @click="refreshBleList()">刷新</view> <view @click="refreshBleList()">刷新</view>
</view> </view>
<view class="lblTitle">
<input class="uni-input" v-model="search" placeholder="名称筛选" />
<!-- <uni-easyinput :styles="{color:'#ffffffde',borderColor:'#cbcbcba8'}" :clearable="true" class="uni-mt-5" :trim="'both'"
prefixIcon="search" v-model="search" placeholder="名称筛选"></uni-easyinput> -->
</view>
<view class="list searchList"> <view class="list searchList">
<view class="item" v-on:click="Link(item,index)" v-for="item, index in EquipMents" <view class="item" v-on:click="Link(item,index)" v-for="item, index in EquipMents"
v-show="!item['linkStatu']"> v-show="item.name.indexOf(search)>-1">
<view class="before" v-if="item.isTarget"></view> <view class="before" v-if="item.isTarget"></view>
<view class="leftImg "> <view class="leftImg ">
<image src="/static/images/BLEAdd/bluetooth.png" class="titleIco" mode="heightFix"> <image src="/static/images/BLEAdd/bluetooth.png" class="titleIco" mode="heightFix">
@ -148,6 +153,7 @@
} }
}, },
search: '', //筛选
PairEquip: [], //已配对设备 PairEquip: [], //已配对设备
EquipMents: [], //搜索出来的设备 EquipMents: [], //搜索出来的设备
device: null, device: null,
@ -157,7 +163,12 @@
} }
}, },
computed: { computed: {
deviceCnt:function(){
let arr=this.EquipMents.filter(item=>{
return item.name.toLowerCase().indexOf(this.search.toLowerCase())>-1;
});
return arr.length;
}
}, },
onHide: function() { onHide: function() {
this.Status.isPageHidden = true; this.Status.isPageHidden = true;
@ -171,6 +182,7 @@
} }
}, },
onLoad(option) { onLoad(option) {
debugger;
let search = option.search; let search = option.search;
these = this; these = this;
eventChannel = this.getOpenerEventChannel(); eventChannel = this.getOpenerEventChannel();
@ -202,6 +214,67 @@
"linkStatu": false, "linkStatu": false,
"isTarget": true "isTarget": true
}, },
{
"RSSI": -69,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "4F0DAC91-4391-CB07-905E-72D7F03EFCD3",
"name": "4877-BF743D",
"linkStatu": false
},
{
"RSSI": -55,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "EBDA4E6F-3A28-FF65-A845-AE8CC7B78375",
"name": "HBY670-BF74EA",
"linkStatu": false
},
{
"RSSI": -61,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "EF4651",
"linkStatu": false,
"isTarget": true
},
{
"RSSI": -69,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "4F0DAC91-4391-CB07-905E-72D7F03EFCD3",
"name": "4877-BF743D",
"linkStatu": false
},{
"RSSI": -55,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "EBDA4E6F-3A28-FF65-A845-AE8CC7B78375",
"name": "HBY670-BF74EA",
"linkStatu": false
},
{
"RSSI": -61,
"advertisData": "",
"advertisServiceUUIDs": [
"0000FFE0-0000-1000-8000-00805F9B34FB"
],
"deviceId": "469FB381-B47E-1E40-8073-EF50B5704AAB",
"name": "EF4651",
"linkStatu": false,
"isTarget": true
},
{ {
"RSSI": -69, "RSSI": -69,
"advertisData": "", "advertisData": "",
@ -216,6 +289,7 @@
these.PairEquip = [this.EquipMents[0]]; these.PairEquip = [this.EquipMents[0]];
this.$forceUpdate();
return; return;
} }
let StartSubsrib = () => { let StartSubsrib = () => {
@ -277,7 +351,9 @@
let f = these.EquipMents.find((v, index) => { let f = these.EquipMents.find((v, index) => {
if (v.deviceId == device.deviceId) { if (v.deviceId == device.deviceId) {
console.log(`更新设备信号: ${device.name || device.deviceId}, RSSI: ${device.RSSI}`); console.log(
`更新设备信号: ${device.name || device.deviceId}, RSSI: ${device.RSSI}`
);
these.$set(these.EquipMents[index], 'RSSI', device.RSSI); these.$set(these.EquipMents[index], 'RSSI', device.RSSI);
return true; return true;
} }
@ -288,8 +364,10 @@
console.log("+++ 发现新设备,准备添加到列表:", JSON.stringify(device)); console.log("+++ 发现新设备,准备添加到列表:", JSON.stringify(device));
if (these.device && these.device.bluetoothName && device.name) { if (these.device && these.device.bluetoothName && device.name) {
if (these.device.bluetoothName === device.name || (device.name && device.name.indexOf(these if (these.device.bluetoothName === device.name || (device.name && device.name
.device.bluetoothName) > -1) || (device.name && this.device.bluetoothName.indexOf( .indexOf(these
.device.bluetoothName) > -1) || (device.name && this.device
.bluetoothName.indexOf(
device.name) > -1)) { device.name) > -1)) {
device.isTarget = true; device.isTarget = true;
} }
@ -367,6 +445,10 @@
eventChannel.on('detailData', function(rec) { eventChannel.on('detailData', function(rec) {
console.log("接收到父页面的参数:", rec); console.log("接收到父页面的参数:", rec);
these.device = rec.data; these.device = rec.data;
if (rec.data.bluetoothName) {
these.search = rec.data.bluetoothName.replace('JQZM-', '');
}
startValidDevice(); startValidDevice();
these.refreshBleList(); these.refreshBleList();
}); });
@ -418,7 +500,10 @@
}); });
}, },
async refreshBleList() { async refreshBleList() {
const systemInfo = uni.getSystemInfoSync();
if (systemInfo.uniPlatform == 'web') {
return;
}
const hasPermission = await this.checkAndRequestLocationPermission(); const hasPermission = await this.checkAndRequestLocationPermission();
if (!hasPermission) { if (!hasPermission) {
console.log("缺少定位权限,已中止蓝牙扫描。"); console.log("缺少定位权限,已中止蓝牙扫描。");
@ -517,7 +602,7 @@
} }
console.log("f=", f); console.log("f=", f);
if (f.macAddress) { if (f && f.macAddress) {
if (f.macAddress != these.device.deviceMac) { if (f.macAddress != these.device.deviceMac) {
@ -565,7 +650,7 @@
} }
return false; return false;
}); });
if (!f.macAddress) { if (!(f && f.macAddress)) {
removeLink(); removeLink();
updateLoading(these, { updateLoading(these, {
text: "出现错误,未收到设备Mac地址" text: "出现错误,未收到设备Mac地址"
@ -805,11 +890,12 @@
padding: 30rpx; padding: 30rpx;
box-sizing: border-box; box-sizing: border-box;
width: 100%; width: 100%;
height: calc(100% - 300rpx); height: calc(100% - 240rpx);
overflow-y: scroll; overflow-y: scroll;
position: absolute; position: absolute;
top: 300rpx; top: 240rpx;
left: 0rpx; left: 0rpx;
/* border: 1px solid #BBE600; */
} }
@ -830,17 +916,20 @@
align-content: center; align-content: center;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
margin-bottom: 20rpx; margin-bottom: 30rpx;
} }
.list { .list {
min-height: 120rpx; min-height: 120rpx;
} }
.searchList { .searchList {
width: 100%; width: 100%;
height: calc(100% - 186rpx); height: calc(100% - 300rpx);
overflow-y: scroll; overflow-y: scroll;
box-sizing: border-box;
/* border: 1px solid red; */
} }
.list .item { .list .item {
@ -1010,4 +1099,21 @@
filter: none !important; filter: none !important;
-webkit-filter: none !important; -webkit-filter: none !important;
} }
.uni-input{
background-color: #121212;
width:100%;
height: 60rpx;
color: #ffffffde;
border:1rpx solid #cbcbcbde;
border-radius: 8rpx;
font-size: 26rpx;
text-indent: 8rpx;
font-family: "PingFang SC";
line-height: 60rpx;
caret-color:#BBE600;
font-weight: 200;
}
</style> </style>

View File

@ -57,8 +57,9 @@
v-if="item.communicationMode==0 && item.onlineStatus==1 && item.alarmStatus==1"> v-if="item.communicationMode==0 && item.onlineStatus==1 && item.alarmStatus==1">
报警中</view> 报警中</view>
<view v-if="item.communicationMode==1"> <view v-if="item.communicationMode==1">
<view class="device-status online">已连接</view> <view class="device-status" :class="item.bleStatu?'online':'unline'">
<view class="device-status unline">未连接</view> {{item.bleStatu?'已连接':'未连接'}}
</view>
</view> </view>
</view> </view>
<image src="/static/images/common/cires.png" class="circle" mode="aspectFit"></image> <image src="/static/images/common/cires.png" class="circle" mode="aspectFit"></image>
@ -145,6 +146,7 @@
deviceReName deviceReName
} from '@/api/common/index.js' } from '@/api/common/index.js'
import BleHelper from '@/utils/BleHelper.js'; import BleHelper from '@/utils/BleHelper.js';
var pagePath = 'pages/common/index';
var ble = null; var ble = null;
export default { export default {
onPullDownRefresh() { onPullDownRefresh() {
@ -212,6 +214,69 @@
} }
}, },
methods: { 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() { allMore() {
this.showshare = !this.showshare; this.showshare = !this.showshare;
@ -291,6 +356,10 @@
// 如果是第一页或切换分类,替换数据 // 如果是第一页或切换分类,替换数据
this.deviceList = this.page === 1 ? newDevices : [...this.deviceList, ...newDevices]; this.deviceList = this.page === 1 ? newDevices : [...this.deviceList, ...newDevices];
this.updateBleStatu();
this.total = res.total; this.total = res.total;
// 判断是否加载完成 // 判断是否加载完成
if (res.rows.length < this.size || this.deviceList.length >= this.total) { if (res.rows.length < this.size || this.deviceList.length >= this.total) {
@ -329,9 +398,25 @@
// 处理新的扫码结果 // 处理新的扫码结果
const cleanedResult = res.result.trim(); const cleanedResult = res.result.trim();
console.log('扫码结果:', cleanedResult); console.log('扫码结果:', cleanedResult);
let url=`/pages/common/qrcode/qrcode?deviceId=${encodeURIComponent(cleanedResult)}`;
try{
let json=JSON.parse(cleanedResult);
if('imei' in json){
url=`/pages/common/qrcode/qrcode?deviceId=${encodeURIComponent(json.imei)}`;
}else if('blue' in json){
if(!json.blue.includes(':')){
json.blue=json.blue.replace(
/(.{2})/g, '$1:')
.slice(0, -1)
}
url=`/pages/common/addBLE/LinkBle?mac=${encodeURIComponent(json.blue)}`;
}
}catch(ex){
}
// 跳转并传递扫描结果 // 跳转并传递扫描结果
uni.navigateTo({ uni.navigateTo({
url: `/pages/common/qrcode/qrcode?deviceId=${encodeURIComponent(cleanedResult)}` url: url
}); });
}, },
fail: (err) => { fail: (err) => {
@ -392,7 +477,7 @@
// 关闭所有滑动项 // 关闭所有滑动项
this.$refs.swipeAction.closeAll(); this.$refs.swipeAction.closeAll();
ble && ble.DropDevice(data.id); ble && ble.DropDevice(null,data.id);
} else { } else {
uni.showToast({ uni.showToast({
title: res.msg, title: res.msg,
@ -506,7 +591,8 @@
deviceType: this.tabs[this.activeTab].id || '', deviceType: this.tabs[this.activeTab].id || '',
apiType: 'listA' //标识,根据这个参数,区分普通详情,分享跳转详情,查不一样的权限信息 apiType: 'listA' //标识,根据这个参数,区分普通详情,分享跳转详情,查不一样的权限信息
}); });
},fail(ex) { },
fail(ex) {
console.log("ex=", ex); console.log("ex=", ex);
} }
}) })
@ -560,13 +646,34 @@
this.onIntall() 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() { beforeDestroy() {
// 组件销毁前移除监听器 // 组件销毁前移除监听器
uni.$off('refreshDeviceList'); uni.$off('refreshDeviceList');
}, },
onUnload() { onUnload() {
uni.$off('deviceStatusUpdate'); uni.$off('deviceStatusUpdate');
ble && ble.removeAllCallback();
} }
} }
@ -889,6 +996,8 @@
margin-left: 15rpx; margin-left: 15rpx;
padding: 10rpx 0rpx; padding: 10rpx 0rpx;
font-size: 28rpx; font-size: 28rpx;
text-align: left;
text-indent: 5rpx;
} }
.svg { .svg {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 296 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -145,7 +145,7 @@ class BleHelper {
let item = this.data.LinkedList[i]; let item = this.data.LinkedList[i];
if (deviceId && item.device) { if (deviceId && item.device) {
if (item.device.id == deviceId) { if (item.device.id == deviceId) {
console.log("找到要删除的设备", item); console.error("找到要删除的设备", item);
this.data.LinkedList.splice(i, 1); this.data.LinkedList.splice(i, 1);
this.disconnectDevice(item.deviceId); this.disconnectDevice(item.deviceId);
flag = true; flag = true;
@ -154,7 +154,7 @@ class BleHelper {
} else { } else {
if (bleId && item.deviceId == bleId) { if (bleId && item.deviceId == bleId) {
console.log("找到要删除的设备1,", item) console.error("找到要删除的设备1,", item)
this.data.LinkedList.splice(i, 1); this.data.LinkedList.splice(i, 1);
this.disconnectDevice(item.deviceId); this.disconnectDevice(item.deviceId);
flag = true; flag = true;
@ -513,22 +513,31 @@ class BleHelper {
return bytes.map(byte => byte.toString(16).padStart(2, return bytes.map(byte => byte.toString(16).padStart(2,
'0')); '0'));
} }
let adapterStateTime=null;
uni.onBluetoothAdapterStateChange((state) => { uni.onBluetoothAdapterStateChange((state) => {
console.log('蓝牙状态发生变化:' + JSON.stringify(state)); clearTimeout(adapterStateTime);
setTimeout(()=>{
if(this.data.discovering === state.discovering && this.data.available===state.available){
console.error("专业给Uniapp填坑,适配器状态错误");
return;
}
console.log('蓝牙模块状态发生变化:' + JSON.stringify(state));
this.data.discovering = state.discovering; this.data.discovering = state.discovering;
if (this.data.available !== state.available) { if (this.data.available !== state.available) {
this.data.available = state.available; this.data.available = state.available;
if (this.data.available && this.data if (this.data.available && this.data
.isOpenBlue) { //蓝牙状态再次可用,重连所有设备 .isOpenBlue) { //蓝牙适配器再次可用
if (this.cfg.stateRecoveryCallback.length > 0) { if (this.cfg.stateRecoveryCallback.length > 0) {//执行适配器恢复的回调
console.log('蓝牙状态再次可用,执行恢复连接的回调');
this.cfg.stateRecoveryCallback.forEach( this.cfg.stateRecoveryCallback.forEach(
c => { c => {
try { try {
c.callback(); c.callback();
console.log("执行恢复连接的回调成功");
} catch (error) { } catch (error) {
console.error( console.error(
"蓝牙适配器已恢复,但回调函数发生错误", "蓝牙适配器已恢复,但回调函数发生错误",
@ -542,20 +551,22 @@ class BleHelper {
if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接 if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接
console.log("蓝牙模块不可用了,将所有设备标记为断开连接");
this.data.LinkedList.filter((v) => { this.data.LinkedList.filter((v) => {
v.Linked = false; v.Linked = false;
v.notifyState = false; v.notifyState = false;
return true; return true;
}); });
let keys = Object.keys(bleDeviceStates) // let keys = Object.keys(bleDeviceStates)
keys.filter(v => { // keys.filter(v => {
bleDeviceStates[v] = false; // bleDeviceStates[v] = false;
}); // });
this.cfg.stateBreakCallback.forEach(f => { this.cfg.stateBreakCallback.forEach(f => {
try { try {
f.callback(); f.callback();
console.log("执行断开连接的回调成功");
} catch (error) { } catch (error) {
console.error("蓝牙状态不可用了,执行回调异常", console.error("蓝牙状态不可用了,执行回调异常",
error) error)
@ -565,6 +576,8 @@ class BleHelper {
this.updateCache(); this.updateCache();
} }
},500);
}); });
@ -594,8 +607,8 @@ class BleHelper {
return false; return false;
}); });
this.updateCache(); this.updateCache();
if (f && f.device && f.device.id) { if (f && f.device && f.device.id && this.data.available) {
console.log("尝试5次恢复连接,", f console.log("蓝牙状态可用,尝试5次恢复连接,", f
.deviceId); .deviceId);
this.LinkBlue(res.deviceId, f this.LinkBlue(res.deviceId, f
.writeServiceId, f .writeServiceId, f
@ -609,6 +622,7 @@ class BleHelper {
(c) => { (c) => {
try { try {
c.callback(res); c.callback(res);
console.log("执行蓝牙断开连接的回调成功");
} catch (error) { } catch (error) {
console.error( console.error(
"执行蓝牙断开连接的回调出现异常,", "执行蓝牙断开连接的回调出现异常,",
@ -618,26 +632,13 @@ class BleHelper {
} }
} else { } else {
console.log("蓝牙连接已恢复", res); console.log("蓝牙连接已恢复",res);
if (this.cfg.recoveryCallback.length >
0) {
this.cfg.recoveryCallback.forEach((
c) => {
try {
c.callback(res);
} catch (error) {
console.error(
"执行蓝牙恢复连接的回调出现异常,",
error)
}
});
}
} }
}, 0); }, 0);
}); });
console.log("111111111")
uni.onBluetoothDeviceFound((res) => { uni.onBluetoothDeviceFound((res) => {
//console.log("发现新设备:" + JSON.stringify(res,'name')); //console.log("发现新设备:" + JSON.stringify(res,'name'));
let arr = []; let arr = [];
@ -815,7 +816,7 @@ class BleHelper {
str: str, str: str,
hexs: hexs hexs: hexs
}; };
// console.log("监听到特征值:" + JSON.stringify(recData)); console.log("监听到特征值:" + JSON.stringify(recData));
if (this.cfg.receivDataCallback) { if (this.cfg.receivDataCallback) {
if (this.cfg.receivDataCallback.length > 0) { if (this.cfg.receivDataCallback.length > 0) {
@ -1502,6 +1503,20 @@ class BleHelper {
// console.log("LinkedList=", this.data // console.log("LinkedList=", this.data
// .LinkedList); // .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 设置 // 处理 MTU 设置
if (plus.os.name === 'Android') { if (plus.os.name === 'Android') {
this.setMtu(deviceId).catch(ex=>{ this.setMtu(deviceId).catch(ex=>{
@ -1714,7 +1729,7 @@ class BleHelper {
let buffer = new ArrayBuffer(bufferSize); let buffer = new ArrayBuffer(bufferSize);
let dataView = new DataView(buffer); let dataView = new DataView(buffer);
for (let i = 0; i < array.length; i++) { for (let i = 0; i < array.length; i++) {
dataView.setUint8(i, array); dataView.setUint8(i, array[i]);
} }
return this.sendData(deviceid, buffer, writeServiceId, wirteCharactId, ms); return this.sendData(deviceid, buffer, writeServiceId, wirteCharactId, ms);
@ -1830,7 +1845,7 @@ class BleHelper {
Promise.race([timeOut(ms), promise]).then(resolve).catch((ex) => { Promise.race([timeOut(ms), promise]).then(resolve).catch((ex) => {
// console.error("ex=", ex); // console.error("ex=", ex);
if (ex.code == -1) { if (ex.code == -1) {
// console.error('专业给Uniapp填坑,发送消息永无回调'); console.error('专业给Uniapp填坑,发送消息永无回调');
resolve(ex); resolve(ex);
} else { } else {
reject(ex); reject(ex);

View File

@ -256,7 +256,7 @@ class BleReceive {
} }
Receive_670(receive, f, path, recArr) { Receive_670(receive, f, path, recArr) {
console.log("pagh=", path); // console.log("pagh=", path);
var todo = (bytes) => { var todo = (bytes) => {
// console.log("todo",receive); // console.log("todo",receive);
let receiveData = {}; let receiveData = {};
@ -283,8 +283,8 @@ class BleReceive {
// console.log("todo"); // console.log("todo");
// 解析照明档位 // 解析照明档位
let lightingLevelByte = bytes[2]; let lightingLevelByte = bytes[2];
let lightingLevelText = lightingLevelByte === 0x6d ? 'hight' : lightingLevelByte === 0x6e ? let lightingLevelText = lightingLevelByte === 0x6d ? 'qiang' : lightingLevelByte === 0x6e ?
'low' : 'close'; 'ruo' : 'close';
// 解析剩余照明时间(第三和第四字节,小端序) // 解析剩余照明时间(第三和第四字节,小端序)
let lightingTime = (bytes[3] << 8) | bytes[4]; let lightingTime = (bytes[3] << 8) | bytes[4];
@ -569,7 +569,7 @@ class BleReceive {
try { try {
console.log("str=",receive.str); // console.log("str=",receive.str);
receiveData = JSON.parse(receive.str); receiveData = JSON.parse(receive.str);
let recCnt = recArr.find(v => { let recCnt = recArr.find(v => {

169
utils/MqHelper.js Normal file
View File

@ -0,0 +1,169 @@
import MqttClient from '@/utils/mqtt.js';
class MqHelper {
constructor() {
this.instance = null;
this.subTopics=[];
}
timeout(ms) {
if (!ms) {
ms = 200;
}
return new Promise((succ, err) => {
setTimeout(() => {
err({
code: -1,
errMsg: '超时了'
})
}, ms);
});
}
//打开mq连接,topics:要订阅的主题列表格式{topic:'主题',callback:fn}或此格式的数组
init(topics) {
let connect = () => {
return new Promise((resolve, reject) => {
this.instance = new MqttClient();
this.instance.connect((res) => {
if(topics){
console.error("连接成功开始订阅消息",topics);
setTimeout(this.subscribes, 50, topics)
}
resolve();
});
});
}
let p1 = connect();
let p2 = this.timeout(500);
return new Promise((resolve, reject) => {
Promise.race([p1, p2]).then(()=>{
resolve()
}).catch(ex=>{
this.instance=null;
reject(ex);
});
});
}
//订阅消息
subscribes(topics) {
return new Promise((resolve,reject)=>{
if(!this.instance || !topics){
reject();
return;
}
if (!Array.isArray(topics)) {
topics = [topics];
}
for (let i = 0; i < topics.length; i++) {
let item = topics[i];
let f=this.subTopics.find(v=>{
return v.topic===item.topic;
});
if(!f){
this.subTopics.push(item);
}
this.instance.subscribe(item.topic, (payload, receive) => {
try {
console.log("开始处理回调")
item.callback({payload:payload,receive:receive});
console.log("处理回调成功")
} catch (err) {
console.error("订阅消息回调出现异常,",err);
}
});
console.error("订阅消息成功");
}
resolve();
});
}
//取消订阅消息 单个或者数组
unSubscribes(topics){
if(!this.instance || !topics){
return;
}
if (!Array.isArray(topics)) {
topics = [topics];
}
for (let i = 0; i < topics.length; i++) {
let item = topics[i];
this.instance.unsubscribe(item.topic);
this.subTopics.find((v,index)=>{
if(v.topic===item.topic){
this.subTopics.splice(index,1);
return true;
}
return false;
});
}
}
//发送消息,主题 消息内容 是否保留消息
sendData(topic,msg,retained){
return new Promise((resolve,reject)=>{
if(!this.instance || !topic){
reject("MQTT未连接或无主题无法发布消息")
return
}
if(msg===null || msg===undefined){
reject("msg无内容")
return;
}
if(!retained){
retained=false;
}else{
retained=true;
}
try {
let flag = this.instance.publish(topic, msg, retained);
if (flag) {
resolve({
code: 200,
msg: 'MQTT直连发送成功'
});
return;
}
reject("MQTT未连接无法发布消息");
} catch (error) {
reject(error);
}
});
}
//断开连接
disconnect(){
if(!this.instance){
return
}
this.instance.disconnect()
}
}
export default {
getMqTool: function(found, receive) {
let instance = new MqHelper();
return instance;
}
}

View File

@ -281,11 +281,17 @@ class MqttClient {
} }
} }
publish(topic, message) { publish(topic, message,retained) {
if (this.client && this.client.isConnected()) { if (this.client && this.client.isConnected()) {
const mqttMessage = new Paho.Message(message); const mqttMessage = new Paho.Message(message);
mqttMessage.destinationName = topic; mqttMessage.destinationName = topic;
mqttMessage.qos = 1; mqttMessage.qos = 1;
console.log("typeof(retained)=",typeof(retained))
if(typeof(retained)==='boolean'){
console.log("retained=",retained)
mqttMessage.retained=retained;
}
this.client.send(mqttMessage); this.client.send(mqttMessage);
console.log(`成功发布消息到主题 ${topic}: ${message}`); console.log(`成功发布消息到主题 ${topic}: ${message}`);
return true; return true;