diff --git a/App.vue b/App.vue index c67ca08..b1d4b27 100644 --- a/App.vue +++ b/App.vue @@ -1,16 +1,21 @@ - diff --git a/stores/bluetooth.js b/stores/bluetooth.js new file mode 100644 index 0000000..48fad3c --- /dev/null +++ b/stores/bluetooth.js @@ -0,0 +1,203 @@ +/** + * @description 蓝牙数据持久化 + */ +import { defineStore } from 'pinia' + +// 定时器 +let timer + +export const useBluetoothStore = defineStore('ble', { + state() { + return { + /* + * 蓝牙状态 + * -1 未知(初始状态) + * 0 正常 + * 1 系统蓝牙未打开 + * 2 小程序蓝牙功能被禁用 + * 3 系统蓝牙未打开且小程序蓝牙功能被禁用 + */ + bluetoothStatus: -1, + // 设备列表 + deviceList: [] + } + }, + actions: { + // 初始化蓝牙模块并监听蓝牙状态变化 + initBluetooth() { + const that = this + // 初始化蓝牙模块 + return new Promise(resolve => { + uni.openBluetoothAdapter({ + success() { + that.bluetoothStatus = 0 + console.log('蓝牙初始化成功') + resolve() + }, + fail(err) { + console.log('蓝牙初始化失败', err) + // 系统蓝牙未打开 + if(err.errCode === 10001) { + if(that.bluetoothStatus === 2) { + that.bluetoothStatus = 3 + } else { + that.bluetoothStatus = 1 + } + } + // 小程序蓝牙功能被禁用 + if(err.errno === 103) { + if(that.bluetoothStatus === 1) { + that.bluetoothStatus = 3 + } else { + that.bluetoothStatus = 2 + } + } + resolve() + } + }) + }) + }, + // 监听蓝牙状态变化 + onBluetoothState() { + const that = this + uni.onBluetoothAdapterStateChange((res) => { + console.log('蓝牙状态改变', res) + if(that.bluetoothStatus === 3 && res.available) { + that.bluetoothStatus = 2 + } else if (that.bluetoothStatus === 2 && !res.available) { + that.bluetoothStatus = 3 + } else if (that.bluetoothStatus === 1 && res.available) { + that.bluetoothStatus = 0 + } else if (that.bluetoothStatus === 0 && !res.available){ + that.bluetoothStatus = 1 + } else if (that.bluetoothStatus === -1) { + if(res.available) { + that.bluetoothStatus = 0 + } else { + that.bluetoothStatus = 1 + } + } + }) + }, + // 开始搜索蓝牙设备 + getBluetoothDevices() { + const that = this + if(this.bluetoothStatus !== 0) { + console.log('搜索未执行', this.bluetoothStatus) + this.getBluetoothStatus() + return + } + uni.startBluetoothDevicesDiscovery({ + success: function (res) { + setTimeout(() => { + that.searchBluetoothDevices() + }, 300) + }, + fail: async function (res) { + console.log('开始搜索失败', res) + if(res.errCode === 10000) { + // 重新初始化蓝牙适配器 + await that.initBluetooth() + that.getBluetoothDevices() + } + } + }) + }, + // 定时查询蓝牙设备 + searchBluetoothDevices() { + const that = this + if(this.bluetoothStatus !== 0) { + console.log('搜索未执行', this.bluetoothStatus) + this.getBluetoothStatus() + return + } + timer = setInterval(() => { + uni.getBluetoothDevices({ + success(res) { + const deviceList = res.devices + that.deviceList = [] + for(let i = 0; i < deviceList.length; i++) { + if(deviceList[i]?.advertisServiceUUIDs) { + const uuid = deviceList[i]?.advertisServiceUUIDs[0] + if(uuid && uuid.slice(2,8)==='758824' && uuid.slice(30,32)==='00') { + that.deviceList.push(deviceList[i]) + } + } + } + console.log('设备列表', that.deviceList) + }, + fail: async function (err) { + console.log('获取设备列表失败', err) + if(res.errCode === 10000) { + // 重新初始化蓝牙适配器 + await that.initBluetooth() + } + } + }) + }, 1000) + }, + // 停止搜索蓝牙设备 + stopGetBluetoothDevices() { + clearInterval(timer) + uni.stopBluetoothDevicesDiscovery() + }, + // 蓝牙状态提示 + getBluetoothStatus() { + if(this.bluetoothStatus === 1) { + uni.showModal({ + title: '提示', + content: '蓝牙尚未打开,请先打开蓝牙', + showCancel: false, + confirmText: '确定', + }) + } else if(this.bluetoothStatus === 2) { + uni.showModal({ + title: '提示', + content: '小程序蓝牙功能被禁用,请打开小程序蓝牙权限', + showCancel: false, + confirmText: '去设置', + success(res) { + if(res.confirm) { + uni.openSetting() + } + } + }) + } else if(this.bluetoothStatus === 3) { + uni.showModal({ + title: '提示', + content: '蓝牙尚未打开且小程序蓝牙功能被禁用,请先打开蓝牙并打开小程序蓝牙权限', + showCancel: false, + confirmText: '确定', + }) + } + }, + // 检查小程序设置 + checkSetting() { + const that = this + uni.getSetting({ + async success(res) { + const bluetooth = res.authSetting['scope.bluetooth'] + if(that.bluetoothStatus === -1) { + if(bluetooth) { + that.bluetoothStatus = 0 + } else { + that.bluetoothStatus = 2 + } + } else if(that.bluetoothStatus === 0 && !bluetooth) { + that.bluetoothStatus = 2 + } else if(that.bluetoothStatus === 1 && !bluetooth) { + that.bluetoothStatus = 3 + } else if(that.bluetoothStatus === 2 && bluetooth) { + that.bluetoothStatus = 0 + await that.initBluetooth() + } else if(that.bluetoothStatus === 3 && bluetooth) { + that.bluetoothStatus = 1 + await that.initBluetooth() + that.onBluetoothState() + } + console.log('蓝牙权限', bluetooth, that.bluetoothStatus) + } + }) + } + } +})