<template> <view class="page"> <u-navbar title="设备设置" :border-bottom="false" :background="bgc" back-icon-color="000" title-color='#000' title-size='36' height='50'></u-navbar> <view class="card"> <!-- <view class="li" @click="btnwifi"> <view class="tit"> WiFi配网 </view> <view class="info"> <view class="txt"> {{listobj.wifi == null ? '' : listobj.wifi}} </view> <view class="iconfont icon-xiangyou1"></view> </view> </view> --> <view class="toptit"> WiFi版请先配网 </view> <view class="shebeiname"> <view class="icon_img"> <image src="https://api.ccttiot.com/smartmeter/img/static/ulslGIMYOEQlZoKAbXSq" mode="aspectFit"></image> <view class="">WiFi配网</view> </view> <view class="shebeitit"> 将设备配置网络,能更好的远程操作设备 </view> </view> <!-- <view class=""> --> <view class="info" @click="btnwifi"> <view class="tit"> 点击连接网络 </view> <view class=""> <view class="txt" style="display: flex;"> <text>{{wifi == null ? '' : wifi}} </text> <view class="iconfont icon-xiangyou1"></view> </view> </view> </view> <!-- </view> --> <view class="buttit"> <text>1.设备进行网络配置的时候,请务必打开蓝牙和WiFi</text> <text>2.配置网络的时候需靠近设备</text> <text>3.配置的过程中切勿离开范围,防止配置网络失败</text> <text>4.配置网络失败请重新进行配置</text> </view> <view class="btnxyb" @click="btnxia"> 下一步(2/3) </view> <!-- <view class="btntg" @click="btnxia"> 跳过 </view> --> </view> <!-- 蓝牙连接 --> <view class="bluetoothbox" v-if="bluetoothflag"> <view class="stop"> 正在连接该设备蓝牙 </view> <view class="xtop"> 请将手机与设备尽量靠近 </view> <image src="https://api.ccttiot.com/smartmeter/img/static/ucDphMKsozqwwllJTAKL" mode="aspectFit"></image> </view> <!-- 蓝牙连接失败 --> <view class="bluetoothbox" v-if="shibaiflag"> <image class="img" src="https://api.ccttiot.com/smartmeter/img/static/uTb3vSlbcHdPMFQMBjyL" mode="aspectFit"></image> <view class="one"> 蓝牙连接失败 </view> <view class="two"> 请确保手机足够靠近设备 </view> <view class="thr"> 并且设备处于上电状态 </view> <view class="anfour"> <view class="qx" @click="btnlyqx"> 取消 </view> <view class="cx" @click="btnwifi"> 重新连接 </view> </view> </view> </view> </template> <script> var xBlufi = require("@/page_components/blufi/xBlufi.js") export default { data() { return { qrResult: '', bluetoothflag: false, shibaiflag: false, bgc: { backgroundColor: "#fff", }, showloading: false, showfz: false, show: false, showshop: false, id: '', xgname: '', deviceInfo: {}, groupList: {}, showpopup: false, remake: '', price: '', showpeice: false, showremake: false, showmc: false, pagenum: 1, wateringList: [], pagesize: 10, isLoading: false, noMoreData: false, total: 0, storeId: '', devicesList: [], setMode: null, mac: '', name: '', deviceId: '', isMch: false, taocan: '', token: '', userImgs: '', url: '', wifi: '', sn:'' } }, onLoad(option) { let id = option.id this.id = id this.sn = option.sn }, onShow() { this.wateringList = [] this.setMode == null this.taocan = '' this.getshua() this.getuserinfo() this.getao() }, 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' } }, methods: { // 刷新设备信息 getshua(){ this.$u.get(`/app/device/${this.id}/refreshIot`).then((res) => { this.getlistobj(this.id) }) }, btnlyqx() { this.shibaiflag = false this.bluetoothflag = false }, getlistobj(id) { this.$u.get("/app/device/" + id).then((res) => { if (res.code == 200) { this.listobj = res.data this.qrResult = res.data.mac this.wifi = res.data.wifi } }) }, // 点击进行下一步 btnxia() { uni.navigateTo({ url: '/page_components/bindszthr?id=' + this.id + '&sn=' + this.sn }) }, btnlyqx() { this.shibaiflag = false this.bluetoothflag = false }, // 修改图片 getImage() { uni.chooseImage({ count: 1, success: (rst) => { this.url = rst.tempFilePaths[0]; } }) }, onok(ev) { this.url = ""; this.path = ev.path; let _this = this let math = 'static/' + _this.$u.guid(20) wx.uploadFile({ url: 'https://up-z2.qiniup.com', name: 'file', filePath: _this.path, formData: { token: _this.token, //后端返回的token key: 'smartmeter/img/' + math }, success: function(res) { let str = JSON.parse(res.data) _this.userImgs = 'https://api.ccttiot.com/' + str.key let data = { deviceId: _this.id, customPicture: _this.userImgs } _this.$u.put('/app/device', data).then((res) => { if (res.code == 200) { this.getDevice() uni.showToast({ title: '操作成功', icon: 'none', duration: 2000 }) } }) } }) }, oncancel() { // url设置为空,隐藏控件 this.url = "" }, // 获取上传七牛云token getQiniuToken() { this.$u.get("/common/qiniu/uploadInfo").then((res) => { if (res.code == 200) { this.token = res.token } }) }, getao() { this.$u.get(`/app/suit/listByDeviceId/${this.id}`).then(res => { if (res.code == 200) { if (res.data.length <= 1) { res.data.forEach(item => { this.taocan += item.name }) } else { res.data.forEach(item => { this.taocan += item.name + ',' }) } } }) }, // 点击设置套餐 btntc() { uni.navigateTo({ url: '/page_fenbao/statulist/taocanlist/index?id=' + this.id }) }, // 获取当前用户信息 getuserinfo() { this.$u.get("/app/user/userInfo").then((res) => { if (res.code == 200) { this.isMch = res.data.isMch } }) }, // 点击wifi进行配网 btnwifi() { this.shibaiflag = false this.bluetoothflag = true // console.log(this.deviceId,'idididididdidii'); if (this.setMode == null) { xBlufi.initXBlufi(1) xBlufi.listenDeviceMsgEvent(true, this.funListenDeviceMsgEvent) xBlufi.notifyStartDiscoverBle({ 'isStart': true }) // 停止蓝牙搜索 setTimeout(() => { xBlufi.notifyStartDiscoverBle({ 'isStart': false }) xBlufi.notifyConnectBle({ isStart: true, deviceId: this.deviceId, name: this.name }) xBlufi.notifyInitBleEsp32({ deviceId: this.deviceId }) let name = '' let index = this.name.indexOf('-') if (index !== -1) { name = this.name.slice(index + 1) } let data = { storeId: this.storeId, mac: this.mac } this.$u.put('/app/device/bind', data).then((res) => { if (res.code == 200) { uni.hideLoading(); this.shibaiflag = false this.bluetoothflag = false uni.removeStorageSync('mac'); let systemInfo = uni.getSystemInfoSync() if (systemInfo.platform == 'android') { // 当前设备是 Android uni.navigateTo({ url: '/page_components/wifilist/index?deviceId=' + this .deviceId + '&name=' + this.name }) } else if (systemInfo.platform == 'ios') { // 当前设备是 iOS uni.navigateTo({ url: '/page_fenbao/device/wifivideo?deviceId=' + this .deviceId + '&name=' + this.name }) } } else if (res.msg == '设备编号和mac不能同时为空') { this.shibaiflag = true this.bluetoothflag = false // uni.showToast({ // title: '连接失败', // icon: 'none', // duration: 2000 // }); } else { // uni.showToast({ // title: res.msg, // icon: 'none', // duration: 2000 // }); // uni.navigateBack() } }) }, 1000) } else { let name = '' let index = this.name.indexOf('-') if (index !== -1) { name = this.name.slice(index + 1) } let data = { storeId: this.storeId, mac: this.mac } this.$u.put('/app/device/bind', data).then((res) => { if (res.code == 200) { // uni.showToast({ // title: '绑定成功', // icon: 'none', // duration: 2000 // }) this.shibaiflag = false this.bluetoothflag = false uni.hideLoading(); uni.removeStorageSync('mac'); let systemInfo = uni.getSystemInfoSync() if (systemInfo.platform == 'android') { // 当前设备是 Android uni.navigateTo({ url: '/page_components/wifilist/index?deviceId=' + this.deviceId + '&name=' + this.name }) } else if (systemInfo.platform == 'ios') { // 当前设备是 iOS uni.navigateTo({ url: '/page_fenbao/device/wifivideo?deviceId=' + this.deviceId + '&name=' + this.name }) } } else { if (res.msg == '设备编号和mac不能同时为空') { this.shibaiflag = true this.bluetoothflag = false uni.hideLoading() // uni.showToast({ // title: '连接失败', // icon: 'none', // duration: 2000 // }) } else { this.shibaiflag = true this.bluetoothflag = false uni.hideLoading() uni.showToast({ title: res.msg, icon: 'none', duration: 2000 }) // uni.navigateBack() } } }) } }, sremakes() { if (this.wateringList.length == 0) { let that = this uni.showModal({ title: '提示', content: '未创建店铺,是否去创建店铺?', success: function(res) { if (res.confirm) { uni.navigateTo({ url: '/page_fenbao/statulist/myshop/shopxx/index?id=' + that.id }) } else if (res.cancel) { } } }) } else { this.showshop = true } }, // confirms(e) { // console.log(e); // let data = { // deviceId: this.id, // storeId: e[0].value // } // this.putdevice(data) // setTimeout(() => { // this.getlistobj(this.id) // }, 1000) // }, gettanc() { this.$u.get('/app/store/listCount').then((res) => { if (res.code == 200) { this.total = res.total if (res.data.length > 0) { // 有数据,追加到列表 let arr = res.data.map(row => ({ value: row.storeId, // 将storeId赋值给value label: row.name // 将name赋值给label })); this.wateringList = this.wateringList.concat(arr) this.wateringList = this.wateringList.slice(1) this.pagenum++ console.log(this.wateringList); } else { // 没有更多数据 this.noMoreData = true; } this.isLoading = false; } }) }, changeGp(item) { let data = { deviceId: this.id, groupId: item.groupId } this.putdevice(data) this.showfz = false setTimeout(() => { this.getgroup() }, 1000) }, tosetpage() { this.showfz = false uni.navigateTo({ url: '/page_user/fenzu' }) }, sub(num) { if (num == 1) { let data = { deviceId: this.id, remark: this.remake } this.showpopup = false this.showremake = false this.putdevice(data) } else if (num == 2) { let data = { deviceId: this.id, price: this.price, } this.showpopup = false this.showpeice = false this.showmc = false this.putdevice(data) } else if (num == 3) { console.log(this.xgname); let data = { deviceId: this.id, deviceName: this.xgname, } this.showpopup = false this.showpeice = false this.showmc = false this.putdevice(data) setTimeout(() => { this.getlistobj(this.id) }, 1000) } }, confirm(e) { let data = { deviceId: this.id, outageWay: e[0].value } this.putdevice(data) }, putdevice(data) { this.$u.put('/app/device', data).then((res) => { if (res.code == 200) { this.getDevice() uni.showToast({ title: '修改成功', icon: 'success', duration: 2000 }) } }) }, sremakemc() { console.log(1); this.showmc = true this.xgname = this.listobj.deviceName }, sremake() { this.showpopup = true this.showremake = true }, sprice() { this.showpopup = true this.showpeice = true }, close() { this.showpeice = false this.showremake = false this.showpopup = false this.showmc = false }, getDevice(id) { this.$u.get("/app/device/" + this.id).then((res) => { // this.$forceUpdate() if (res.code == 200) { this.deviceInfo = res.data this.storeId = res.data.storeId this.price = this.deviceInfo.price this.remake = this.deviceInfo.remark // this.qrResult = 'CTKG-' + res.data.mac this.qrResult = res.data.mac } }); }, getgroup() { this.$u.get("/app/store/listCount").then((res) => { // this.$forceUpdate() if (res.code == 200) { this.groupList = res.data // this.loadings=true // this.initChart() } }); }, funListenDeviceMsgEvent: function(options) { switch (options.type) { case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_MY_DATA: let loadPercent = options.data; let loadText = '文件读取中' // console.log("文件读取中", options.data) break; case xBlufi.XBLUFI_TYPE.TYPE_RECIEVE_CUSTON_DATA: let ver_data = this.parseCustomData(options.data) this.setMode = ver_data console.log("1收到设备发来的自定义数据结果:", ver_data, this.setMode) break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS: if (options.result) { let devicesarr = options.data // console.log(devicesarr,'devicesarrdevicesarr') devicesarr.forEach(device => { const mac = device.name.substring(5) if (device.name.slice(5, 17) == this.qrResult) { this.deviceId = device.deviceId this.name = device.name this.mac = device.name.slice(5, 17) // console.log(this.mac, 'macmacmac') // this.devicesList = uniqueDevicesList } }) } break; case xBlufi.XBLUFI_TYPE.TYPE_CONNECTED: // console.log("连接回调:" + JSON.stringify(options)) if (options.result) { this.bluetoothflag = false uni.hideLoading(); // uni.showToast({ // title: '连接成功', // icon: 'none' // }); { console.log("连接回调options.data.deviceId:" + options.data.deviceId, "连接回调options.data.name:" + options.data.name) } } else { this.shibaiflag = true this.bluetoothflag = false uni.hideLoading() // uni.showToast({ // title: '设备离线或不在范围内', // icon: 'none', // duration: 2000 // }) } break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_START: if (!options.result) { setTimeout(() => { uni.hideLoading() this.bluetoothflag = false }, 3000) console.log("蓝牙未开启", options) // uni.showToast({ // title: '蓝牙未开启', // icon: 'none', // duration: 3000 // }); return } else { // this.searching = true //蓝牙搜索开始 // _this.setData({ // searching: true // }); } break; case xBlufi.XBLUFI_TYPE.TYPE_GET_DEVICE_LISTS_STOP: if (options.result) { let uniqueDevicesList = Array.from(new Set(this.devicesList)) // 将去重后的数组重新赋值给 this.devicesList this.devicesList = uniqueDevicesList let list = [] uniqueDevicesList.forEach(device => { // 从设备名称中提取 MAC 地址(假设 MAC 地址是设备名称的后6个字符) let macFromName = device.name.substring(device.name.length - 12) this.$u.get(`/app/device/${macFromName}/isBind`).then((res) => { if (res.data == false) { list.push(device) } else { } }) }); setTimeout(() => { this.devicesList = list }, 200) console.log('蓝牙停止搜索ok') } else { //蓝牙停止搜索失败 console.log('蓝牙停止搜索失败') } this.searching = false break } }, 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(1) // 去除前缀 "T" // 返回解析后的数据对象 return { voltage, switchState, current, power, remainingPower, setMode }; }, } } </script> <style lang="scss"> /deep/ .u-flex { padding-top: 20rpx !important; box-sizing: border-box; } /deep/ .panel { position: fixed; width: 100%; height: 100%; top: 0; bottom: 0; left: 0; z-index: 99 !important; overflow: hidden; } /deep/ .u-title { padding-bottom: 22rpx; } /deep/ .u-icon__icon { padding-bottom: 22rpx; } .toptit { font-weight: 700; font-size: 44rpx; color: #3D3D3D; // padding-top: 18rpx; // padding-left: 58rpx; box-sizing: border-box; } .buttit { width: 100%; height: 280rpx; background-color: #fff; margin-top: 30rpx; padding: 28rpx 20rpx; box-sizing: border-box; border-radius: 20rpx; text { display: block; margin-top: 20rpx; font-size: 26rpx; } } .bluetoothbox { width: 100%; height: 100vh; background-color: #f4f1f6; position: fixed; top: 0; left: 0; z-index: 99; text-align: center; .img { margin-top: 400rpx; width: 320rpx; height: 320rpx; } .one { font-size: 36rpx; color: #000; // margin-top: 80rpx; } .two { margin-top: 30rpx; font-size: 24rpx; color: #ccc; } .thr { margin-top: 30rpx; font-size: 28rpx; color: #ccc; } .anfour { display: flex; margin-top: 30rpx; justify-content: space-between; padding: 0 220rpx; box-sizing: border-box; .qx { width: 100rpx; height: 70rpx; line-height: 70rpx; text-align: center; border: 1px solid #3D3D3D; border-radius: 10rpx; } .cx { width: 200rpx; height: 70rpx; line-height: 70rpx; text-align: center; background-color: #8883F0; color: #fff; border-radius: 10rpx; } } .stop { font-size: 36rpx; color: #000; margin-top: 380rpx; } .xtop { margin-top: 30rpx; font-size: 24rpx; color: #ccc; } .xqx { width: 530rpx; height: 90rpx; line-height: 90rpx; // border: 1px solid #808080; border-radius: 20rpx; text-align: center; background-color: #fff; margin: auto; margin-top: 200rpx; } image { width: 500rpx; height: 500rpx; margin-top: 100rpx; } } page { background-color: #F7FAFE; } .btnxyb { width: 636rpx; height: 100rpx; background: #8883F0; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); filter: blur(0px); text-align: center; line-height: 100rpx; font-size: 36rpx; color: #FFFFFF; border-radius: 10rpx; position: fixed; left: 50%; transform: translateX(-50%); bottom: 150rpx; } .btntg { font-size: 32rpx; color: #8883F0; margin-top: 20rpx; position: fixed; left: 50%; transform: translateX(-50%); bottom: 80rpx; } .page { width: 750rpx; .popcard { display: flex; justify-content: center; flex-wrap: wrap; width: 550rpx; height: 400rpx; border-radius: 20rpx; .tit { display: flex; justify-content: center; width: 100%; align-items: center; font-size: 28rpx; font-weight: 700; } .ipt { margin-top: 60rpx; width: 80%; .u-input::placeholder { font-size: 20px; color: red; } } .btnbox { width: 100%; display: flex; flex-wrap: nowrap; border-radius: 0 0 20rpx 20rpx; .btn2 { display: flex; align-items: center; justify-content: center; width: 50%; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #000; background-color: #fff; } .btn1 { display: flex; align-items: center; justify-content: center; width: 50%; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #fff; background-color: #8883F0; border: 1rpx solid #ccc; } } } .info { margin-top: 20rpx; display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; padding-right: 5rpx; box-sizing: border-box; width: 100%; background-color: #fff; border-radius: 20rpx; height: 100rpx; line-height: 100rpx; padding: 0 30rpx; .txt { font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #95989D; } .icon-xiangyou1 { margin-left: 6rpx; color: #95989D; } } .card { // padding: 16rpx 38rpx; margin: 60rpx auto 0; width: 654rpx; // background: #FFFFFF; border-radius: 30rpx; .shebeiname { width: 654rpx; height: 160rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); border-radius: 24rpx 24rpx 24rpx 24rpx; margin: auto; margin-top: 26rpx; padding-top: 26rpx; padding-left: 28rpx; box-sizing: border-box; .shebeitit { font-size: 28rpx; color: #606060; margin-top: 18rpx; } input { width: 580rpx; height: 66rpx; background: #EDEDED; border-radius: 10rpx 10rpx 10rpx 10rpx; margin-top: 22rpx; padding-left: 26rpx; box-sizing: border-box; } .icon_img { image { width: 50rpx; height: 45rpx; margin-right: 14rpx; } display: flex; align-items: center; view { font-size: 32rpx; color: #3D3D3D; } } } .li { display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; height: 94rpx; border-bottom: #E5E5E5 solid 2rpx; .tit { font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #000000; } } } .btn { display: flex; align-items: center; justify-content: center; margin: 52rpx auto 0; width: 654rpx; height: 100rpx; background: #FF4F4F; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); opacity: 1; border-radius: 30rpx; font-size: 32rpx; font-family: HarmonyOS Sans SC, HarmonyOS Sans SC; font-weight: 400; color: #FFFFFF; } .fz { position: fixed; bottom: 0; width: 750rpx; height: 1152rpx; background: #F7FAFE; border-radius: 30rpx 30rpx 0 0; z-index: 10071; .fz_top { margin: 18rpx 0 auto; display: flex; flex-wrap: nowrap; justify-content: space-between; .icon-shanchu { margin-left: 40rpx; font-size: 50rpx; } .tit { font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #000000; } .txt { margin-right: 40rpx; font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #8883F0; } } .card_cont { width: 750rpx; display: flex; flex-wrap: wrap; align-items: baseline; justify-content: center; height: 1030rpx; overflow-y: auto; overflow-x: hidden; .cards { margin-top: 32rpx; display: flex; flex-wrap: nowrap; align-items: center; justify-content: space-between; padding: 0 40rpx; width: 682rpx; border-radius: 30rpx; height: 114rpx; background: #FFFFFF; box-shadow: 0rpx 16rpx 40rpx 0rpx rgba(42, 130, 228, 0.1); .txt { font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #000000; } .num { font-size: 36rpx; font-family: Source Han Sans, Source Han Sans; font-weight: 400; color: #000000; } } } } } .icon { // display: flex; // flex-wrap: wrap; // align-items: center; margin-top: 40rpx; margin-bottom: 30rpx; .imgbox { // width: 33%; image { width: 142rpx; height: 142rpx; } } } </style>