<template> <div id="device_container" class="padding-lr"> <div class="device"> <div class="head flex justify-between"> <div> <div class="line"></div> <div class="title">我的设备</div> </div> <!-- <div class="my_msg" @click="get_toy_list">--> <!-- <text class="cuIcon-mark"></text>--> <!-- <text class="under_line">获取设备列表</text>--> <!-- </div>--> </div> <div v-if="connect_toy==0"> <!-- 未连接部分--> <div class="connect_box" v-if="status == 0"> <device_unconnect @open_scan="open_scan"></device_unconnect> </div> <!-- 连接中--> <div class="connecting_box" v-if="status != 0 && connect_show == false"> <device_connecting :status="status"></device_connecting> </div> <!-- 已链接 --> <div class="connected_box" v-if="connect_show"> <device_connected @open_choose_toy="open_choose_toy" @change_brain_status="change_device_status"></device_connected> </div> </div> <div v-else> <!-- 玩具模块--> <!-- 玩具连接中--> <div class="connecting_toy"> <toy_connecting :connect_toy="connect_toy" :deviceId="_deviceId" @open_choose_toy="open_choose_toy" @change_toy_connect_status="change_toy_connect_status" @change_status="change_device_status" @game_start="game_start" ></toy_connecting> </div> </div> </div> <!-- 选择玩具--> <van-popup :show="choose_toy_window.show" @close="on_close" position="bottom" round closeable safe-area-inset-bottom > <div class="head padding"> <div> <div class="line"></div> <div class="title">选择玩具</div> </div> </div> <div class="padding toy_list"> <van-row gutter="8"> <van-col span="8" v-for="(toy,index) in toy_list" :key="index"> <div class="toy_item flex flex-direction justify-center align-center" @click="choose_toy(index)" :class="toy_action == toy.id?'toy_item_action_bg':'toy_item_normal_bg'"> <img :src="toy.img" alt="" class="toy_img"> <text class="toy_text padding-top">{{ toy.name }}</text> </div> </van-col> </van-row> </div> <div class="toy_actions padding text-center"> <view class="text-gray toy_action_text padding">选择你最感兴趣的项目,点击“选好了”以后将会自动连接</view> <button class="cu-btn lg cu-btn-primary text-white text-center padding" @click="choose_ok">选好了</button> </div> </van-popup> <van-toast id="van-toast"/> </div> </template> <script> //蓝牙未连接 import device_unconnect from "@/components/device/unconnect"; //蓝牙连接中 import device_connecting from "@/components/device/connecting"; //蓝牙完成链接 import device_connected from '@/components/device/connected'; //连接玩具 import toy_connecting from '@/components/device/toy/connecting' //获取个人信息 import Toast from '../../../static/vant/toast/toast'; import {game_devices} from "../../requests/game"; import game_store from '@/store/game' import bluetooth from "@/utils/bluetooth"; let $this; export default { name: "device", components: { device_unconnect, device_connecting, device_connected, toy_connecting }, data() { return { //设备状态 0为未连接,1:连接中,2:已连接 3:连接失败 status: 0, choose_toy_window: { show: false }, //'水柱音箱', '喷雾恐龙(大)', '喷雾恐龙(小)', '轨道车', '碰碰车', '小车(大)', '小车(中)', '小车(小)', '飞行器(大)', '飞行器(小)', '水母灯' toy_list: [ { id: 1, name: "水柱音箱", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 2, name: "喷雾恐龙(大)", img: "https://img.shuimuai.com/web/toy_dinasour.png" }, { id: 3, name: "喷雾恐龙(小)", img: "https://img.shuimuai.com/web/toy_dinasour.png" }, { id: 4, name: "轨道车", img: "https://img.shuimuai.com/web/toy_car_roat.png" }, { id: 5, name: "碰碰车", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 6, name: "小车(大)", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 7, name: "小车(中)", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 8, name: "小车(小)", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 9, name: "飞行器(大)", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 10, name: "飞行器(小)", img: "https://img.shuimuai.com/web/toy_car.png" }, { id: 11, name: "水母灯", img: "https://img.shuimuai.com/web/toy_car.png" }, ], toy_action: 1, connect_show: false, //连接玩具 0:未连接 1:连接中 2:已连接 3:连接失败 4:游戏中 connect_toy: 0, code: "jellyfish1234", device: {}, canWrite: false, _deviceId: '', _serviceId: "", _characteristicId: "", chs: [], _device_index: false } }, watch: { status($new, $old) { //成功连接的方法 if ($new == 2) { $this.connect_show = true } else if ($new == 0) { $this.connect_show = false } } }, methods: { //打开 扫描二维码 open_scan() { wx.openBluetoothAdapter({ success(res) { //判断已经打开连接了 if (res['errMsg'] == "openBluetoothAdapter:ok") { console.log('openBluetoothAdapter success', res) $this.startBluetoothDevicesDiscovery() } }, fail(err) { if (err['errCode'] == 10001) { Toast.fail({ message: "请连接蓝牙" }) } else { Toast.fail({ message: "蓝牙连接失败" }) } } }) // // wx.scanCode({ // onlyFromCamera: true, // success: (res) => { // let $data = res // if ($data.result) { // let url = decodeURIComponent($data.result) // let $code = url.match(/\?code=(.*)/)[1]; // console.log($code) // } // } // }) }, //关闭窗口的方法 on_close() { $this.choose_toy_window.show = false }, //选择玩具 choose_toy($index) { $this.toy_action = $this.toy_list[$index].id }, // 打开选择玩具窗口 open_choose_toy() { $this.choose_toy_window.show = true }, // 选好玩具 choose_ok() { $this.on_close() $this.change_toy_connect_status(1) $this._device_index = $this.toy_action - 1 $this.connect_toy = 2 }, //修改玩具连接状态 change_toy_connect_status($status = 0) { $this.connect_toy = $status }, // 修改设备连接状态 change_device_status($status = 0) { $this.status = $status //当蓝牙连接已断开 if ($status == 0) { $this.connect_toy = $status $this.connect_show = false wx.closeBLEConnection({ deviceId: $this._deviceId, success(res) { Toast.success('已成功断开') } }) } }, //开始蓝牙被发现 startBluetoothDevicesDiscovery() { wx.startBluetoothDevicesDiscovery({ allowDuplicatesKey: true, success: (res) => { console.log('startBluetoothDevicesDiscovery success', res) $this.onBluetoothDeviceFound() $this.change_device_status(1) }, fail(err) { $this.change_device_status(3) } }) }, //打开蓝牙搜索 onBluetoothDeviceFound() { wx.onBluetoothDeviceFound((res) => { res.devices.forEach(device => { if (!device.name && !device.localName) { return } console.log(device['name']) if (device['name'] == $this.code) { $this.stopBluetoothDevicesDiscovery() $this.device = device game_store.commit('setDeviceId', device.deviceId) $this._deviceId = device.deviceId $this.createBLEConnection() } }) }) setTimeout(() => { if (!$this.device.deviceId) { $this.stopBluetoothDevicesDiscovery() $this.status = 0 $this.connect_show = false Toast.fail('未连接到设备') } }, 7000) }, // 停止蓝牙搜索 stopBluetoothDevicesDiscovery() { wx.stopBluetoothDevicesDiscovery() }, //连接低功耗蓝牙设备。 createBLEConnection() { wx.createBLEConnection({ deviceId: $this.device.deviceId, success: (res) => { console.log('成功连接') //成功连接脑环蓝牙 $this.change_device_status(2) // $this.getBLEDeviceServices($this.device.deviceId) }, fail(err) { console.log('err', err) } }) }, // 获取游戏设备玩具 get_toy_list() { game_devices().then((res) => { let $data = res.data }) }, // 开始游戏的方法 game_start() { game_store.commit('setToyIndex', $this.toy_action - 1) // bluetooth.sendConnect($this.toy_action - 1, $this._deviceId, $this._serviceId, $this._characteristicId) console.log('device.vue', $this._deviceId) } }, mounted() { $this.get_toy_list() }, created() { $this = this }, onLoad(options) { // 原有的code let $_code = wx.getStorageSync('code') if (options.q) { let url = decodeURIComponent(options.q) let $code = url.match(/\?code=(.*)/)[1]; //判断新的code 和 旧的code 是否一致 不一致则重新登录 console.log('1---' + $_code, '2---' + $code) if ($_code && $_code != $code) { Toast.fail('该用户已绑定邀请码') } } } } </script> <style scoped> @import "../static/device.css"; </style>