ct-mattress/pages/zhuce.vue
2024-09-26 17:35:25 +08:00

767 lines
20 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="pages">
<u-navbar title="设备录入" :border-bottom="false" :background="bgc" title-size='38' title-color='#fff'
back-icon-color="#fff" height='50'></u-navbar>
<view class="title">
<text>设备录入列表</text>
</view>
<view class="dblist" v-for="(item, index) in devicesLists" :key="index">
<view class="cen" :id="item.deviceId" @click="createBLEConnections(item)">
<view class="name">
<view class="">
状态<text v-if="item.flags == true" style="color: #e10328;">已录入</text> <text v-else
style="color:seagreen;">未录入</text>
</view>
<view class="" style="display: flex;width: 100%;">
SN码:{{item.sn == undefined ? '--' : item.sn}}
</view>
</view>
<view class="mac">
MAC{{item.name.substring(5)}}
</view>
<view class="" style="color: #8883F0;margin-top: 10rpx;margin-bottom: 10rpx;text-align: left;">
蓝牙强度:{{item.RSSI}}
</view>
<!-- <view @click="btnshows(item,index)"
style="color: #8883F0;margin-top: 10rpx;margin-bottom: 10rpx;text-align: left;">
型号选择:{{item.xuanz == undefined ? '--' : item.xuanz}}
</view> -->
</view>
<view class="rt" :id="item.deviceId" @click="createBLEConnections(item)">
<!-- <text style="margin-bottom: 10rpx;" :id="item.deviceId" @click="createBLEConnections(item)">{{item.lj}}</text> -->
<text style="margin-bottom: 10rpx;">选择</text>
<!-- <text @click="scanQRCode(item)" style="margin-bottom: 10rpx;">扫码</text>
<text :id="item.deviceId" @click="createBLEConnection(item)">录入</text> -->
</view>
</view>
<view class="anniu" @click="Search">
<button>重新扫描</button>
</view>
<view class="mask" v-if="titleflag">
<view class="titles">
温馨提示
</view>
<text>未扫描到附近未绑定设备:</text>
<text>1.确保待连接设备在附近且蓝牙处于打开状态。</text>
<text>2.确保设备未与其他设备进行蓝牙连接。</text>
<text>3.确保设备未被添加过。</text>
<button @click="btnyc">好的</button>
</view>
<view v-if="mengcflag" class="mengc"
style="width: 100%;height: 100vh;background-color: #000;opacity: .5;position: fixed;top: 0;left: 0;"></view>
<!-- 选择蓝牙型号 -->
<u-select v-model="shows" :list="arr" @confirm="confirm"></u-select>
</view>
</template>
<script>
const app = getApp();
var xBlufi = require("@/components/blufi/xBlufi.js");
export default {
data() {
return {
mengcflag: false,
titleflag: false, //提示隐藏
bgc: {
backgroundColor: "#F7FAFE",
},
devicesList: [
// {name:'110000',
// mac:'11111'}
],
devicesLists: [],
searching: false,
texts: '正在扫描设备...',
btnflag: true,
tishiflag: false,
option: '',
bluthlist: [], //蓝牙数组
status: 'loading',
statusflag: false,
Bluetoothmac: '',
gps: {},
mac: '',
status: false,
storeId: '',
bgc: {
backgroundColor: "#8883f0",
},
lurulist: [],
arr: [],
shows: false,
arrname: '',
valuexh: '',
deviceId: '',
arrs: '',
sn: '输入SN',
snname: '',
qrResult:'',
name:'',
ver_data:null
}
},
onLoad(option) {
// console.log(option);
this.getluru()
this.getxingh()
this.storeId = option.sn
},
onUnload: function() {
console.log("unload ");
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
wx.closeBLEConnection({
deviceId: this.deviceId,
})
},
// 分享到好友(会话)
onShareAppMessage: function() {
return {
title: '创想物联',
path: '/pages/shouye/index'
}
},
// 分享到朋友圈
onShareTimeline: function() {
return {
title: '创想物联',
query: '',
path: '/pages/shouye/index'
}
},
mounted() {
// this.videoContext = uni.createVideoContext('myVideo', this)
},
methods: {
// 扫码sn
scanQRCode(item) {
this.snname = item.name
uni.scanCode({
onlyFromCamera: true,
scanType: ['qrCode'],
success: res => {
function getQueryParam(url, paramName) {
let regex = new RegExp(`[?&]${paramName}=([^&]*)`)
let results = regex.exec(url);
return results ? decodeURIComponent(results[1].replace(/\+/g, ' ')) : null
}
let sceneValue = res.result
let decodedValue = decodeURIComponent(sceneValue)
let id = getQueryParam(decodedValue, 's')
this.storeId = id
this.devicesLists.forEach(item => {
if (item.name == this.snname) {
item.sn = id
}
})
},
fail: err => {
console.error('扫描失败:', err)
uni.showToast({
title: '扫描失败',
icon: 'none'
})
}
})
},
getxingh() {
this.$u.get(`/app/model/all`).then(res => {
if (res.code == 200) {
this.arr = res.data
this.arr.forEach(item => {
if (item.hasOwnProperty('modelId')) {
item.value = item.modelId;
}
if (item.hasOwnProperty('modelName')) {
item.label = item.modelName;
}
})
console.log(this.arr, '2121212')
}
})
},
btnshows(item, index) {
this.arrname = item.name
this.shows = true
},
// 选择型号
confirm(e) {
this.devicesLists.forEach(item => {
if (item.name == this.arrname) {
item.xuanz = e[0].label
this.valuexh = e[0].value
}
})
},
btnyc() {
this.titleflag = false
},
funListenDeviceMsgEvent: function(options) {
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA:
let loadPercent = options.data;
let loadText = '文件读取中'
break;
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA:
this.ver_data = this.parseCustomData(options.data)
console.log("1收到设备发来的自定义数据结果", this.ver_data)
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
this.devicesList = options.data
this.devicesList.forEach(device => {
const mac = device.name.substring(5)
if (device.name == this.qrResult) {
this.deviceId = device.deviceId
this.name = device.name
this.mac = device.name.slice(5, 17)
}
})
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
// console.log("连接回调:" + JSON.stringify(options))
if (options.result) {
setTimeout(()=>{
this.bluetoothflag = false
},3000)
{
console.log("连接回调options.data.deviceId" + options.data.deviceId,
"连接回调options.data.name" + options.data.name)
}
} else {
this.shibaiflag = true
this.bluetoothflag = false
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START:
if (!options.result) {
this.mengcflag = false
uni.hideLoading()
console.log("蓝牙未开启", options);
uni.showToast({
title: '蓝牙未开启,请打开手机蓝牙',
icon: 'none',
duration: 3000
})
} else {
this.searching = true
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP:
if (options.result) {
let uniqueDevicesList = Array.from(new Set(this.devicesList));
this.devicesLists = uniqueDevicesList.map(device => {
const deviceId = device.name.substring(5);
const newDevice = {
...device,
xuanz: "请选择",
}; // 直接在复制时添加 xuanz 字段
return newDevice;
})
let devicesarr = options.data
this.devicesList.forEach(device => {
if (device.name.substring(0, 4) == "CCYK") {
this.devicesList.push(device);
let uniqueDevicesList = Array.from(new Set(this.devicesList));
this.devicesLists = uniqueDevicesList.filter(device => {
const deviceId = device.name.substring(5);
return deviceId
})
}
})
// console.log('蓝牙停止搜索ok')
this.mengcflag = false
if (this.devicesLists.length == 0) {
this.titleflag = true
} else {
let arr = []
// console.log(this.devicesLists,'101010');
this.devicesLists.forEach(item => {
arr.push(item.name.slice(5))
})
this.arrs = arr.join(',')
this.$u.get(`/app/device/getExistMac/${this.arrs}`).then(res => {
if (res.code == 200 && Array.isArray(res.data)) {
const existingDevices = new Map(res.data.map(item => [item.mac, true])); // 使用Map来存储已找到的MAC
this.devicesLists = this.devicesLists.map(device => {
const trimmedName = device.name.slice(5); // 假设name中包含MAC地址的一部分
const mac = trimmedName; // 如果trimmedName直接就是MAC则不需要再处理
device.found = existingDevices.has(mac); // 添加一个found属性来标记是否找到
if (device.found) {
const sn = res.data.find(val => val.mac === mac)?.sn; // 从res.data中找到匹配的sn
if (sn) {
device.sn = sn; // 设置sn
}
device.flags = true; // 设置flags为true因为找到了匹配的MAC
} else {
device.flags = false; // 可选:如果你想要明确表示未找到
}
return device; // 但map函数仍然需要return来保持结构
});
this.devicesLists.sort((a, b) => {
if (a.found && !b.found) return 1; // b排在a前面即a在后面
if (!a.found && b.found) return -1; // a排在b前面
return 0;
});
}
})
setTimeout(()=>{
uni.hideLoading()
},2000)
}
} else {
//蓝牙停止搜索失败
this.mengcflag = false
setTimeout(()=>{
uni.hideLoading()
},2000)
console.log('蓝牙停止搜索失败');
}
this.searching = false
break
}
},
// 发送开关
createBLEConnections(e) {
let Bluetoothmac = e.name.substring(5)
uni.navigateTo({
url:'/pages/luru?mac='+Bluetoothmac
})
// this.arrs = ''
// this.qrResult = e.name //拿到所点击的mac号
// if (this.ver_data == null) { //判断是否有连接蓝牙
// xBlufi.initXBlufi(1)
// xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent)
// xBlufi.notifyStartDiscoverBle({
// 'isStart': true
// })
// this.devicesList.forEach(device => {
// if (device.name == this.qrResult) {
// this.deviceId = device.deviceId
// this.name = device.name
// this.mac = device.name.slice(5, 17)
// }
// })
// uni.showLoading({
// title: '连接准备中...'
// })
// // 停止蓝牙搜索
// setTimeout(() => {
// setTimeout(()=>{
// uni.showLoading({
// title: '连接中...'
// })
// setTimeout(()=>{
// uni.hideLoading()
// uni.showToast({
// title: '连接成功',
// icon: 'success',
// duration: 2000
// })
// this.devicesLists.forEach(item => {
// if (item.name == this.qrResult) {
// item.lj = '开关'
// }
// })
// },2000)
// },500)
// xBlufi.notifyStartDiscoverBle({
// 'isStart': false
// })
// xBlufi.notifyConnectBle({
// isStart: true,
// deviceId: this.deviceId,
// name: this.name
// })
// xBlufi.notifyInitBleEsp32({
// deviceId: this.deviceId
// })
// }, 1000)
// }else{ //有连接则发送命令
// uni.showLoading({
// title: '执行中...'
// })
// let that = this //改变this指向
// uni.getNetworkType({
// success(res) {
// if (res.networkType !== 'none') {
// uni.getConnectedBluetoothDevices({
// success(res) {
// setTimeout(() => { //一秒后发送开启命令
// xBlufi.notifySendCustomData({
// customData: 'open'
// })
// setTimeout(()=>{ //发送开启命令两秒后发送关闭命令
// xBlufi.notifySendCustomData({
// customData: 'close'
// })
// setTimeout(()=>{ //发送关闭命令后一秒后断开连接
// uni.hideLoading()
// that.ver_data = null
// xBlufi.listenDeviceMsgEvent(false, that.funListenDeviceMsgEvent);
// wx.closeBLEConnection({
// deviceId: that.deviceId,
// })
// that.devicesLists.forEach(item => {
// if (item.name == that.qrResult) {
// item.lj = '连接'
// }
// })
// // console.log('guanbi');
// },1000)
// },2000)
// }, 1000)
// },
// fail(err) {
// console.error('获取已连接蓝牙设备信息失败:', err)
// }
// })
// }
// }
// })
// }
},
// 请求已经录入设备的mac
getluru() {
// this.$u.get(`/app/device/listAllMac`).then(res => {
// if (res.code == 200) {
// this.lurulist = res.data
// if(this.lurulist){
xBlufi.initXBlufi(1);
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
// 两秒后停止蓝牙搜索
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
this.status = true
}, 1000)
// }
// }
// })
},
parseCustomData(data) {
const dataArray = data.split('@');
const parsedData = {};
const prefixMap = {
'V': 'voltage',
'S': 'switchState',
'A': 'current',
'P': 'power',
'M': 'remainingPower',
'T': 'setMode',
'W': 'temperature'
};
// 遍历数组并解析每个字段
for (let i = 0; i < dataArray.length; i++) {
const field = dataArray[i];
for (const prefix in prefixMap) {
if (field.startsWith(prefix)) {
const value = field.substring(1);
const propertyName = prefixMap[prefix];
parsedData[propertyName] = isNaN(parseFloat(value)) ? value : parseFloat(value);
break;
}
}
}
return parsedData;
},
//4、建立连接
createBLEConnection(e) {
// this.deviceId = e.name
this.mengcflag = true
uni.showLoading({
title: '录入中...'
})
this.mac = e.name.substring(5)
// 录入设备
let data = {
sn: this.storeId,
mac: this.mac,
modelId: this.valuexh
}
this.$u.post('/app/device', data).then((res) => {
if (res.code == 200) {
uni.showToast({
title: '设备:' + this.mac + '已录入成功',
icon: 'success',
duration: 2000
})
this.mengcflag = false
uni.hideLoading()
this.Search()
// setTimeout(() => {
// uni.navigateBack()
// }, 1000)
uni.removeStorageSync('mac');
} else {
this.mengcflag = false
uni.hideLoading()
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
});
}
})
},
// 点击重新搜索
Search() {
// if (this.status) {
this.mengcflag = true
uni.showLoading({
title: '请稍后...'
})
xBlufi.initXBlufi(1);
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': true
})
// 重新搜索清空蓝牙数组
this.bluthlist = []
this.devicesList = []
this.devicesLists = []
this.arrs = []
// 重新搜索
// this.startBluetoothDevicesDiscovery()
this.statusflag = true
this.texts = '正在扫描蓝牙设备...'
setTimeout(() => {
this.statusflag = false
// if (this.searching) {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
// 判断是否存在设备
if (this.devicesList.length == 0) {
this.tishiflag = true
this.texts = '扫描完毕,暂无发现设备'
} else {
this.texts = '扫描到以下设备,请点击录入!'
}
// } else {
// xBlufi.notifyStartDiscoverBle({
// 'isStart': true
// })
// }
}, 2000)
// }
},
// 点击隐藏没有设备提示
btnhd() {
this.tishiflag = false
}
}
}
</script>
<style lang="scss">
page {
background-color: #F7FAFE !important;
padding-bottom: 300rpx;
box-sizing: border-box;
}
.containers {
width: 100%;
height: 100vh;
position: fixed;
top: 0;
padding-top: 130rpx;
box-sizing: border-box;
left: 0;
z-index: 999 !important;
/* background-color: #fff; */
z-index: 99;
}
.pages {
// padding-top: 136rpx !important;
padding: 0 32rpx;
box-sizing: border-box;
}
// text{
// display: block;
// }
.sm {
color: #77808D;
border-radius: 0rpx 0rpx 0rpx 0rpx;
// margin-top: 48rpx;
display: inline-block;
}
.title {
margin-bottom: 84rpx;
margin-top: 50rpx;
image {
display: inline-block;
width: 48rpx;
height: 48rpx;
vertical-align: bottom;
margin-right: 10rpx;
}
text:nth-child(1) {
font-weight: 400;
font-size: 66rpx;
color: #262B37;
line-height: 88rpx;
text-align: left;
font-style: normal;
text-transform: none;
display: block;
margin-bottom: 48rpx;
}
}
.dblist {
display: flex;
justify-content: space-between;
width: 100%;
margin-top: 34rpx;
background: #FFFFFF;
box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08);
padding: 20rpx 20rpx 24rpx 18rpx;
box-sizing: border-box;
text-align: center;
border-radius: 10rpx;
.lt {
padding-left: 10rpx;
box-sizing: border-box;
margin-right: 18rpx;
image {
width: 120rpx;
height: 200rpx;
}
}
.cen {
width: 365rpx;
padding-left: 10rpx;
box-sizing: border-box;
.name {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 32rpx;
color: #262B37;
line-height: 40rpx;
text-align: left;
font-style: normal;
text-transform: none;
margin-top: 10rpx;
}
.mac {
font-family: AlibabaPuHuiTi, AlibabaPuHuiTi;
font-weight: 400;
font-size: 26rpx;
color: #262B37;
line-height: 32rpx;
text-align: left;
font-style: normal;
text-transform: none;
margin-top: 16rpx;
}
}
.rt {
margin-top: 32rpx;
box-sizing: border-box;
text {
display: block;
width: 108rpx;
height: 60rpx;
background: rgba(255, 255, 255, 0);
border: 2rpx solid #8883F0;
filter: blur(0px);
border-radius: 20rpx;
text-align: center;
line-height: 60rpx;
color: #8883F0;
}
}
}
.anniu {
padding: 0 90rpx;
width: 100%;
box-sizing: border-box;
position: fixed;
left: 0;
bottom: 112rpx;
button {
background: #8883F0;
border-radius: 52rpx 52rpx 52rpx 52rpx;
color: #fff;
}
}
.mask {
width: 622rpx;
height: 710rpx;
background: #FFFFFF;
filter: blur(0px);
border-radius: 20rpx;
position: fixed;
top: 475rpx;
left: 50%;
transform: translateX(-50%);
padding-top: 38rpx;
padding-left: 60rpx;
padding-right: 60rpx;
box-sizing: border-box;
.titles {
font-size: 48rpx;
color: #262B37;
line-height: 70rpx;
text-align: center;
margin-bottom: 24rpx;
}
text {
display: block;
font-size: 32rpx;
color: #262B37;
line-height: 56rpx;
text-align: left;
}
button {
margin-top: 46rpx;
width: 266rpx;
height: 96rpx;
background: #8883F0;
border-radius: 52rpx 52rpx 52rpx 52rpx;
color: #fff;
text-align: center;
line-height: 96rpx;
}
}
</style>