smartmeter-app/pages/device/joinDevice.vue
2024-08-31 18:01:17 +08:00

972 lines
23 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-color='#262B37' title-size='38'
height='50'></u-navbar>
<view class="card">
<view class="card_left">
<image src="https://api.ccttiot.com/smartmeter/img/static/uoQO0pUZ1UHcW5uVKkuR" mode=""></image>
</view>
<view class="card_cent">
<view class="info_top">
创特电表蓝牙版
</view>
<view class="info_cont">
<view class="text" v-if="ver_data.current">
电流 {{ver_data.current}}
</view>
<view class="text" v-else>
电流 --
</view>
<view class="text" style="margin-left: 20rpx;" v-if="ver_data.voltage">
电压 {{ver_data.voltage}}
</view>
<view class="text" style="margin-left: 20rpx;" v-else>
电压 --
</view>
</view>
<view class="info_bot">
MAC号{{mac}}
</view>
</view>
<view class="card_right" :class="{ 'act1': ishave && isband }" @click="bind()">
绑定
</view>
</view>
<!-- <view class="title">
<text>设备列表</text>
<image src="https://api.ccttiot.com/smartmeter/img/static/uCfe9273aC89tGOT7n1G" mode="widthFix"></image>
<text class="sm"> 正在扫描蓝牙设备...... </text>
</view>
<view class="dblist" v-for="(item, index) in devicesList" :key="index">
<view class="lt">
<image src="https://api.ccttiot.com/smartmeter/img/static/uoQO0pUZ1UHcW5uVKkuR" mode=""></image>
</view>
<view class="cen">
<view class="name">
智能电表
</view>
<view class="mac">
MAC{{item.localName.substring(6)}}
</view>
</view>
<view class="rt">
<text :id="item.deviceId" @tap="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>确保设备未被添加过</text>
<text>...</text>
<button @click="btnyc">好的</button>
</view> -->
<!-- 加载状态 -->
<view class="containers" v-show="statusflag">
<uni-section>
<uni-load-more :status="status" />
</uni-section>
</view>
<!-- v-if="showConfirmModal" -->
<view v-if="showConfirmModal" class="modal-overlay">
<view class="modal">
<view class="modal-content">
<view class="modal-title">确认绑定</view>
<view class="modal-body">是否确认绑定设备?</view>
<view class="modal-footer">
<view class="btn" @click="closeConfirmModal" style="background: #ccc;">取消</view>
<view class="btn" @click="confirmBind">确定</view>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
const app = getApp();
var xBlufi = require("@/utils/blufi/xBlufi.js");
let _this = null;
export default {
data() {
return {
titleflag: false, //提示隐藏
bgc: {
backgroundColor: "#F7FAFE",
},
devicesList: [
// {name:'110000',
// mac:'11111'}
],
searching: false,
texts: '正在扫描蓝牙设备...',
btnflag: true,
tishiflag: false,
option: '',
bluthlist: [], //蓝牙数组
status: 'loading',
statusflag: false,
Bluetoothmac: '',
mac: '',
ishave: false,
ver_data: null,
deviceInfo: {},
gps: {},
isband: false,
status: false,
showConfirmModal: false, // 控制弹窗显示的标志
sn:'',
gps: {},
}
},
onLoad(e) {
console.log(e);
if(e.mac){
this.sn=e.mac
this.$u.get(`/app/device/${ e.mac}/isBind`).then((res) => {
if (res.data == false) {
this.getmacInfo()
} else {
uni.showToast({
title: '改设备已经被绑定',
icon: 'none',
duration: 3000
});
}
})
}
},
onShow: function() {
// this.openBluetoothAdapter()
},
onUnload: function() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
},
onHide() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
},
onBeforeUnmount() {
xBlufi.listenDeviceMsgEvent(false, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
},
watch: {
ishave(newValue) {
if (newValue === true) {
// 当 ishave 的值变为 true 时执行相应的操作
// 这里可以放置你想要执行的代码
console.log('ishave 的值变为 true');
this.devicesList.forEach(device => {
// 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符
let macFromName = device.name.substring(device.name.length - 12);
// console.log(macFromName);
// 与 this.mac 进行比较
if (macFromName == this.mac) {
// 如果相同,则将 this.ishave 设置为 true
console.log(device);
this.deviceInfo = device
// this.ishave = true;
this.createBLEConnection(device)
console.log('对比正确');
} else {
console.log('对比失败');
}
});
}
}
},
mounted() {
this.videoContext = uni.createVideoContext('myVideo', this)
},
methods: {
getmacInfo(){
this.$u.get(`/app/device/sn/${ this.sn}`).then((res) => {
if (res.code == 200) {
this.mac=res.data.mac
xBlufi.initXBlufi(1);
console.log("xBlufi", xBlufi.XMQTT_SYSTEM);
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': true
});
// 两秒后停止蓝牙搜索
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
// 判断是否存在浇花器设备
if (this.devicesList.length == 0) {
uni.showToast({
title: '暂无发现对应设备,请靠近设备',
icon: 'none'
});
} else {
this.texts = '扫描到以下设备,请点击连接!'
}
this.status = true
}, 2000)
} else {
uni.showToast({
title: '改设备已经被绑定',
icon: 'none',
duration: 3000
});
}
})
},
openConfirmModal() {
this.showConfirmModal = true;
},
btnyc() {
this.titleflag = false
},
closeConfirmModal() {
this.showConfirmModal = false;
},
confirmBind() {
this.closeConfirmModal();
this.bind();
},
towifi() {
let systemInfo = uni.getSystemInfoSync();
if (systemInfo.platform === 'android') {
// 当前设备是 Android
} else if (systemInfo.platform === 'ios') {
// 当前设备是 iOS
uni.navigateTo({
url: '/pages/wifilist/index?deviceId=' + options
.data.deviceId + '&name=' + options.data.name
})
}
},
bind() {
if (this.ishave && this.isband) {
uni.setStorageSync('mac', this.mac);
let that = this
// setTimeout(() => {
// uni.switchTab({
// url: '/pages/index/index'
// })
// }, )
uni.getLocation({
type: 'wgs84',
success: function (lb) {
that.gps.lat = lb.latitude;
that.gps.lon = lb.longitude;
that.$u.put(`/app/device/bind/${that.mac}`, that.gps).then((res) => {
if(res.code==200){
uni.showToast({
title: '绑定成功',
icon: 'none',
duration: 2000
});
uni.removeStorageSync('mac');
setTimeout(()=>{
uni.switchTab({
url:'/pages/index/index'
})
},)
}else{
}
})
}, fail: function (error) {
that.gps.lat = 0;
that.gps.lon = 0;
that.$u.put(`/app/device/bind/${that.mac}`, that.gps).then((res) => {
if(res.code==200){
uni.showToast({
title: '绑定成功',
icon: 'none',
duration: 2000
});
uni.removeStorageSync('mac');
setTimeout(()=>{
uni.switchTab({
url:'/pages/index/index'
})
},)
}else{
setTimeout(()=>{
uni.switchTab({
url:'/pages/index/index'
})
},)
}
})
// 在这里处理获取位置信息失败的情况
}
})
}
},
// 解析自定义数据
parseCustomData(data) {
// 将字符串按照 "@" 分割成数组
const dataArray = data.split('@');
// 根据约定,解析各个字段的值
const voltage = parseFloat(dataArray[0].substring(1)); // 去除前缀 "V",并将字符串转换为浮点数
const switchState = dataArray[1].substring(1); // 去除前缀 "S"
const current = parseFloat(dataArray[2].substring(1)); // 去除前缀 "A",并将字符串转换为浮点数
const power = parseFloat(dataArray[4].substring(1)); // 去除前缀 "P",并将字符串转换为浮点数
const remainingPower = parseFloat(dataArray[5].substring(1)); // 去除前缀 "M",并将字符串转换为浮点数
const setMode = dataArray[6].substring(3); // 去除前缀 "SET"
// 返回解析后的数据对象
return {
voltage,
switchState,
current,
power,
remainingPower,
setMode
};
},
funListenDeviceMsgEvent: function(options) {
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS:
if (options.result) {
let devicesarr = options.data
// this.devicesList = options.data
// console.log(devicesarr, 'devicesarrdevicesarr');
devicesarr.forEach(device => {
const mac = device.name.substring(6);
// console.log(device.name);
if (device.name.indexOf("CTPO") != -1) {
// this.$u.get(`/app/device/${mac}/isBind`).then((res) => {
// if (res.data == false) {
this.devicesList.push(device);
let uniqueDevicesList = Array.from(new Set(this.devicesList));
// 将去重后的数组重新赋值给 this.devicesList
this.devicesList = uniqueDevicesList;
// }
// })
}
// getisband(mac).then(res => {
// console.log(res);
// if (res.data == true) {
// console.log(`MAC 地址 ${mac} 已经绑定`);
// } else {
// this.devicesList.push(device)
// }
// }).catch(error => {
// console.error(`检查 MAC 地址 ${mac} 是否绑定的过程中出错:`, error);
// });
});
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED:
console.log("连接回调:" + JSON.stringify(options));
if (options.result) {
uni.hideLoading();
uni.showToast({
title: '连接成功',
icon: 'none'
}); {
console.log("连接回调options.data.deviceId" + options.data.deviceId,
"连接回调options.data.name" + options.data.name);
uni.setStorageSync('deviceIds', options.data.deviceId);
uni.setStorageSync('name', options.data.name);
xBlufi.notifyInitBleEsp32({
deviceId: this.deviceInfo.deviceId
});
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvents);
this.isband = true
// 连接成功绑定设备
// let params = {
// mac: this.Bluetoothmac,
// userId: this.$store.state.user.userId
// }
let systemInfo = uni.getSystemInfoSync();
if (systemInfo.platform === 'android') {
// 当前设备是 Android
} else if (systemInfo.platform === 'ios') {
// 当前设备是 iOS
// uni.navigateTo({
// url: '/pages/wifilist/index?deviceId=' + options
// .data.deviceId + '&name=' + options.data.name
// })
}
}
}
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_STOP:
if (options.result) {
let uniqueDevicesList = Array.from(new Set(this.devicesList));
// 过滤出名称字段的前五个字母为 "CTPOW" 的项
let filteredDevices = uniqueDevicesList.filter(device => device.name.substring(0, 4) ===
"CTPO");
// 将过滤后的数组重新赋值给 this.devicesList
this.devicesList = filteredDevices;
filteredDevices.forEach(device => {
// 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符
let macFromName = device.name.substring(device.name.length - 12);
console.log(macFromName,'macFromName',this.mac);
// 与 this.mac 进行比较
if (macFromName == this.mac) {
// 如果相同,则将 this.ishave 设置为 true
console.log(device);
this.ishave = true;
// this.createBLEConnection(device)
// console.log('对比正确');
} else {
uni.showToast({
title: '未搜索到对应设备,请靠近设备重新扫描',
icon: 'none',
duration: 2000
});
}
});
// console.log('蓝牙停止搜索ok',this.devicesList);
} else {
//蓝牙停止搜索失败
// console.log('蓝牙停止搜索失败');
}
this.searching = false
// _this.setData({
// searching: false
// });
break;
}
},
//4、建立连接
createBLEConnection(e) {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
console.log(e, '蓝牙信息')
const deviceId = e.deviceId
this.Bluetoothmac = e.localName.substring(5) //从第七位开始截取 只取后面的mac号
console.log(this.Bluetoothmac, '11111');
let name = e.name;
console.log('点击了蓝牙准备连接的deviceId:' + e.deviceId);
xBlufi.notifyConnectBle({
isStart: true,
deviceId: e.deviceId,
name
});
// for (var i = 0; i < this.devicesList.length; i++) {
// if (e.deviceId === this.devicesList[i].deviceId) {
// uni.showLoading({
// title: '连接蓝牙设备中...'
// });
// }
// }
},
// 点击重新搜索
Search() {
if (this.status) {
xBlufi.notifyStartDiscoverBle({
'isStart': true
});
// 重新搜索清空蓝牙数组
this.bluthlist = []
this.devicesList = []
// 重新搜索
// this.startBluetoothDevicesDiscovery()
this.statusflag = true
this.texts = '正在扫描蓝牙设备...'
setTimeout(() => {
this.statusflag = false
if (this.searching) {
// 判断是否存在浇花器设备
if (this.devicesList.length == 0) {
this.tishiflag = true
this.texts = '扫描完毕,暂无发现浇花器设备'
} else {
this.texts = '扫描到以下设备,请点击连接!'
}
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
} else {
xBlufi.notifyStartDiscoverBle({
'isStart': true
});
}
}, 2000)
}
},
funListenDeviceMsgEvents: function(options) {
let that = this;
switch (options.type) {
case xBlufi.XBLUFI_TYPE.TYPE_STATUS_CONNECTED: {
console.log('状态', options.result)
if( options.result==false){
uni.showModal({
title: '很抱歉提醒你!',
content: '小程序与设备异常断开',
showCancel: false,
success: function(res) {
// uni.navigateBack({
// url: '../search/search'
// });
}
});
this.statusflag = false
uni.hideLoading();
}
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_CONNECT_ROUTER_RESULT:
uni.hideLoading();
if (!options.result)
this.statusflag = false,
uni.hideLoading(),
uni.showModal({
title: '温馨提示',
content: '配网失败,请重试',
showCancel: false //是否显示取消按钮
});
else {
if (options.data.progress == 100) {
let ssid = options.data.ssid;
this.statusflag = false
uni.hideLoading();
uni.showModal({
title: '温馨提示',
// content: `连接成功路由器【${options.data.ssid}】`,
content: `连接成功路由器`,
showCancel: false,
success: function(res) {
let ids = that.$store.state.user.deviceId
getwifi(ids).then(res => {
console.log(res);
uni.switchTab({
url: '/pages/index'
})
})
}
})
// 连接成功进行跳转
// setTimeout(()=>{
// },1000)
}
}
break;
case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA:
this.loadPercent = options.data;
this.loadText = '文件读取中'
console.log("文件读取中", options.data);
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_INIT_ESP32_RESULT:
uni.hideLoading();
if (options.result) {
console.log('初始化成功');
} else {
console.log('初始化失败');
uni.showModal({
title: '温馨提示',
content: `设备初始化失败`,
showCancel: false,
//是否显示取消按钮
success: function(res) {
// uni.redirectTo({
// url: '../search/search'
// });
}
});
}
break;
}
},
// 点击隐藏没有设备提示
btnhd() {
this.tishiflag = false
}
}
}
</script>
<style lang="scss">
.modal-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal {
width: 300px;
background: #fff;
border-radius: 8px;
overflow: hidden;
}
.modal-content {
padding: 20px;
}
.modal-title {
font-size: 18px;
margin-bottom: 10px;
text-align: center;
}
.modal-body {
font-size: 16px;
margin-bottom: 20px;
text-align: center;
}
.modal-footer {
display: flex;
justify-content: space-around;
}
.modal-footer button {
width: 80px;
height: 60rpx;
padding: 10px;
background: #8883F0;
color: #fff;
border: none;
border-radius: 4px;
}
.btn {
display: flex;
align-items: center;
justify-content: center;
background: #8883F0;
width: 80px;
height: 60rpx;
color: #fff;
border-radius: 4px;
}
.modal-footer button:first-of-type {
background: #ccc;
}
page {
background-color: #F7FAFE !important;
}
.card {
margin-top: 50rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
// justify-content: space-between;
width: 658rpx;
// height: 282rpx;
padding: 54rpx 48rpx;
background: #fff;
box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(255, 255, 255, 0);
border-radius: 24rpx 24rpx 24rpx 24rpx;
.card_left {
image {
width: 63rpx;
height: 169rpx;
}
}
.card_cent {
margin-left: 56rpx;
width: 304rpx;
display: flex;
flex-wrap: wrap;
.info_top {
font-weight: 500;
font-size: 42rpx;
color: #8883F0;
}
.info_cont {
display: flex;
flex-wrap: nowrap;
margin-top: 24rpx;
.text {
font-weight: 400;
font-size: 24rpx;
color: #95989D;
}
}
.info_bot {
margin-top: 24rpx;
font-weight: 400;
font-size: 24rpx;
color: #95989D;
}
}
.card_right {
margin-left: 38rpx;
width: 108rpx;
height: 60rpx;
display: flex;
align-items: center;
justify-content: center;
border: 2rpx solid #ccc;
border-radius: 20rpx;
font-weight: 400;
font-size: 28rpx;
color: #ccc;
}
.act1 {
color: #8883F0;
border: 2rpx solid #8883F0;
}
}
.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 66rpx;
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;
image {
display: inline-block;
width: 48rpx;
height: 48rpx;
vertical-align: bottom;
margin-right: 10rpx;
}
text:nth-child(1) {
font-weight: 400;
font-size: 96rpx;
color: #262B37;
line-height: 88rpx;
text-align: left;
font-style: normal;
text-transform: none;
display: block;
margin-bottom: 48rpx;
}
}
.dblist {
display: flex;
width: 100%;
margin-top: 34rpx;
background: #FFFFFF;
box-shadow: 0rpx 10rpx 64rpx 0rpx rgba(0, 0, 0, 0.08);
padding: 20rpx 0 24rpx 18rpx;
box-sizing: border-box;
text-align: center;
border-radius: 10rpx;
.lt {
padding-left: 10rpx;
box-sizing: border-box;
margin-right: 38rpx;
image {
width: 42rpx;
// height: 112rpx;
}
}
.cen {
width: 370rpx;
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: 24rpx;
color: #262B37;
line-height: 32rpx;
text-align: left;
font-style: normal;
text-transform: none;
margin-top: 16rpx;
}
}
.rt {
margin-top: 22rpx;
text {
display: inline-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 {
margin-top: 50rpx;
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>