smartmeter-app/pages/device/czDevice.vue
2024-04-27 17:20:50 +08:00

912 lines
22 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.remainingPower">
剩余电量 {{ (ver_data.remainingPower/1000).toFixed(2) }} KWH
</view>
<view class="text" v-else>
剩余电量 --
</view>
</view>
<view class="info_cont">
<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 &&czmoney}" @click="cz()">
充值
</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>
</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,
deviceIds: '',
name: '',
orderinfo: {},
dl: 0,
czmoney:true
}
},
onLoad(e) {
let orderinfo = JSON.parse(e.orderinfo);
this.orderinfo = orderinfo
console.log(this.orderinfo, 'aaa');
this.mac = orderinfo.deviceMac
xBlufi.initXBlufi(1);
console.log("xBlufi", xBlufi.XMQTT_SYSTEM);
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent);
xBlufi.notifyStartDiscoverBle({
'isStart': true
});
this.dl = ((this.orderinfo.deviceAmount / this.orderinfo.unitPrice)*1000).toFixed(2);
// 两秒后停止蓝牙搜索
setTimeout(() => {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
// 判断是否存在浇花器设备
if (this.devicesList.length == 0) {
uni.showToast({
title: '暂无发现对应设备,请靠近设备',
icon: 'none'
});
} else {
}
this.status = true
}, 2000)
},
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('对比失败');
}
});
}
},
isband(newValue) {
if (newValue === true) {
console.log('isband 的值变为 true开始监听 ver_data');
this.$watch('ver_data', this.verDataWatcher);
} else {
console.log('isband 的值变为 false取消监听 ver_data');
this.$off('ver_data', this.verDataWatcher);
}
}
},
mounted() {
this.videoContext = uni.createVideoContext('myVideo', this)
},
methods: {
verDataWatcher(newValue, oldValue) {
console.log('ver_data 变化了,新值:', newValue.remainingPower, ',旧值:', oldValue.remainingPower);
if (newValue.remainingPower && oldValue.remainingPower) {
let diff = newValue.remainingPower - oldValue.remainingPower;
if (diff >= this.dl - 5 && diff <= this.dl + 5) {
console.log('ver_data 变化符合条件');
uni.setStorageSync('billNo', this.orderinfo.billNo);
this.czmoney=false
this.$u.get(`app/device/bind/${this.orderinfo.billNo}`).then((res) => {
if (res.code == 200) {
uni.removeStorageSync('billNo');
} else {
}
})
setTimeout(()=>{
uni.switchTab({
url: '/pages/index/index'
})
},200)
// 变化符合条件,执行相应的操作
} else {
// console.log('ver_data 变化不符合条件');
}
}
},
btnyc() {
this.titleflag = false
},
cz() {
let vm = this; // 将外部的 this 绑定到 vm 上
uni.getNetworkType({
success(res) {
if (res.networkType !== 'none') {
uni.getConnectedBluetoothDevices({
success(res) {
console.log('已连接的蓝牙设备信息:', res);
// vm.dl = (vm.orderinfo.deviceAmount / vm.orderinfo.unitPrice).toFixed(2); // 使用 vm 访问 Vue 实例的属性
xBlufi.notifySendCustomData({
customData: "money@" + vm.dl
});
},
fail(err) {
console.error('获取已连接蓝牙设备信息失败:', err);
}
});
} else {
console.log('手机未连接网络');
}
}
});
},
bind() {
if (this.ishave && this.isband) {
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) {
// console.error('获取位置信息失败:', 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
devicesarr.forEach(device => {
const mac = device.name.substring(6);
if (device.name.substring(0, 5) === "CTPOW") {
// this.$u.get(`/app/device/${mac}/isBind`, data).then((res) => {
// if (res.data == false) {
this.devicesList.push(device);
console.log(this.devicesList,'devicesarrdevicesarr');
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'
}); {
xBlufi.notifyInitBleEsp32({
deviceId: this.deviceInfo.deviceId
});
xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvents);
this.deviceIds = options.data.deviceId
this.name = options.data.name
// 连接成功绑定设备
// 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, 5) ===
"CTPOW");
// 将过滤后的数组重新赋值给 this.devicesList
this.devicesList = filteredDevices;
filteredDevices.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.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.status = false
this.texts = '正在扫描蓝牙设备...'
setTimeout(() => {
this.statusflag = false
this.status = true
if (this.searching) {
xBlufi.notifyStartDiscoverBle({
'isStart': false
});
// 判断是否存在浇花器设备
if (this.devicesList.length == 0) {
uni.showToast({
title: '暂无发现对应设备,请靠近设备',
icon: 'none'
});
} else {
this.texts = '扫描到以下设备,请点击连接!'
}
} 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)
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.isband = true
this.ver_data = this.parseCustomData(options.data)
console.log("1收到设备发来的自定义数据结果", options.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">
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>