<template> <view class="pages"> <u-navbar title="设备录入" :border-bottom="false" :background="bgc" title-size='38' title-color='#fff' back-icon-color="#fff" height='50' :custom-back="btnmy"></u-navbar> <view class="title"> <text>设备录入列表</text> <text style="font-size: 28rpx;width: 160rpx;height: 60rpx;border-radius: 20rpx;background-color: #48893B;text-align: center;color: #fff;line-height: 60rpx;margin-top: 20rpx;" @click="btnkzt">控制台</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: #48893B;margin-top: 10rpx;margin-bottom: 10rpx;text-align: left;"> 蓝牙强度:{{item.RSSI}} </view> <!-- <view @click="btnshows(item,index)" style="color: #48893B;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 v-if="item.sn" style="margin-bottom: 10rpx;margin-top: 30rpx;" @click.stop="btnkongzhi(item.sn)">控制</text> <!-- <text @click="scanQRCode(item)" style="margin-bottom: 10rpx;">扫码</text> <text :id="item.deviceId" @click="createBLEConnection(item)">录入</text> --> </view> </view> <view class="anniu" v-if="seachflag" @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: "#48893B", }, lurulist: [], arr: [], shows: false, arrname: '', valuexh: '', deviceId: '', arrs: '', sn: '输入SN', snname: '', qrResult:'', name:'', ver_data:null, seachflag:true } }, onLoad(option) { // console.log(option); this.getxingh() this.storeId = option.sn }, onShow() { this.Search() }, 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: { btnkzt(){ uni.reLaunch({ url:'/page_user/lurukz' }) }, btnmy(){ uni.reLaunch({ url:'/page_shanghu/index' }) }, // 扫码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, 'sn') 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.reLaunch({ url:'/page_user/lurulj?mac='+Bluetoothmac }) }, btnkongzhi(e){ console.log(e); uni.reLaunch({ url:'/page_user/lurukz?sn=' + e }) }, 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; }, // 点击重新搜索 Search() { // if (this.status) { this.seachflag = false 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 uni.hideLoading() // if (this.searching) { xBlufi.notifyStartDiscoverBle({ 'isStart': false }); setTimeout(()=>{ this.seachflag = true this.mengcflag = false },2000) }, 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; } .pages { padding: 0 32rpx; box-sizing: border-box; } .sm { color: #77808D; border-radius: 0rpx 0rpx 0rpx 0rpx; display: inline-block; } .title { margin-bottom: 84rpx; margin-top: 50rpx; display: flex; justify-content: space-between; 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 #48893B; filter: blur(0px); border-radius: 20rpx; text-align: center; line-height: 60rpx; color: #48893B; } } } .anniu { padding: 0 90rpx; width: 100%; box-sizing: border-box; position: fixed; left: 0; bottom: 112rpx; button { background: #48893B; 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: #48893B; border-radius: 52rpx 52rpx 52rpx 52rpx; color: #fff; text-align: center; line-height: 96rpx; } } </style>