xiaokuaisong-shopapp/uniapp05/pages/Printer/Printer.vue

348 lines
8.0 KiB
Vue
Raw Normal View History

2024-10-18 08:05:19 +00:00
<template>
<view class="printer_box">
<view>
<view>
<img src="http://110.42.248.235:866/images/system/666/XTiaCluc-1.png" class="printer_img"
v-if="state ==0">
<img src="http://110.42.248.235:866/images/system/666/XTiaCluc-1.png" class="printer_imgs"
v-if="state ==1">
</view>
<view>
<view class="printer_text" v-if="state ==0">
未连接设备
</view>
<view v-if="state ==1">
<view class="printer_text">
{{name}}
</view>
<view class="printer_text_tag">
已连接
</view>
</view>
</view>
</view>
</view>
<button class="printer_btn" @click="openBluetoothAdapter" v-if="!isConnected" :disabled="searching">开始搜索</button>
<button class="printer_btn" @click="stopBluetooth" v-else>断开当前蓝牙设备</button>
<view class="printer_under">
<view class="printer_under_title">
已配对
</view>
<view class="printer_under_content" v-for="(item,index) in devices" :key="index"
@click="createBLEConnection(item)">
{{item.name}}
</view>
<view class="printer_under_content no-devices" v-if="!devices.length">未搜索到蓝牙设备</view>
</view>
<view class="" @click="a">
跳转
</view>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
const searching = ref(false)
const devices = ref([])
const state = ref(0)
const isConnected = ref(false)
const name = ref('')
const deviceId = ref(null)
const a = () =>{
uni.navigateTo({
url:'/pages/distribution/distribution'
})
}
onLoad(() => {
console.log(uni.getStorageSync('deviceId'))
console.log(uni.getStorageSync('serviceId'))
if (uni.getStorageSync('deviceId') && uni.getStorageSync('serviceId')) {
isConnected.value = true
state.value = 1
name.value = uni.getStorageSync('blueTooothName')
}
})
const openBluetoothAdapter = () => {
console.log('初始化蓝牙模块 openBluetoothAdapter');
if (searching.value) return
if (!uni.openBluetoothAdapter) {
console.log('微信版本过低');
uni.showModal({
title: '提示',
content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
});
return;
}
searching.value = true;
uni.openBluetoothAdapter({
success: res => {
console.log('初始化成功openBluetoothAdapter success', res);
startBluetoothDevicesDiscovery();
},
fail: res => {
console.log('初始化失败openBluetoothAdapter fail', res);
uni.hideLoading();
if (res.errCode === 10001) {
// 当前蓝牙适配器不可用
uni.showModal({
title: '错误',
content: '未找到蓝牙设备, 请打开蓝牙后重试。',
showCancel: false
});
// 监听蓝牙适配器状态变化事件
uni.onBluetoothAdapterStateChange(res => {
console.log('监听蓝牙适配器状态 onBluetoothAdapterStateChange', res);
// available蓝牙适配器是否可用
if (res.available) {
// 开始搜寻附近的蓝牙外围设备
startBluetoothDevicesDiscovery();
}
});
}
}
})
}
const onBluetoothDeviceFound = () => {
console.log('进入查询设备');
uni.onBluetoothDeviceFound(res => {
if (res.devices[0].name) {
devices.value.push({
name: res.devices[0].name,
deviceId: res.devices[0].deviceId,
services: []
})
}
console.log(devices.value);
});
}
const startBluetoothDevicesDiscovery = () => {
console.log('开始搜寻附近的蓝牙设备');
uni.startBluetoothDevicesDiscovery({
allowDuplicatesKey: false,
interval: 0,
success: res => {
// 监听寻找到新设备的事件
onBluetoothDeviceFound();
},
fail: res => {
}
});
}
/**
* 点击连接
*/
const createBLEConnection = (e : any) => {
const deviceId = e.deviceId;
uni.showLoading({
title: '连接中'
})
uni.createBLEConnection({
deviceId: deviceId,
success: (res : any) => {
uni.hideLoading()
console.log(res);
name.value = e.name
state.value = 1
isConnected.value = true
searching.value = false;
uni.showToast({
title: '连接成功',
icon: 'success'
})
stopBluetoothDevicesDiscovery()
uni.setStorageSync('deviceId', deviceId)
uni.setStorageSync('blueTooothName', e.name)
setTimeout(() => {
getBLEDeviceServices(deviceId)
}, 2000)
},
fail: (res : any) => {
uni.hideLoading()
console.log(res);
uni.showToast({
title: '连接失败',
icon: 'error'
})
}
})
}
/**
* 连接完停止搜索
*/
const stopBluetoothDevicesDiscovery = () => {
uni.stopBluetoothDevicesDiscovery({
success: (res : any) => {
// console.log('stopBluetoothDevicesDiscovery')
console.log(res);
}
});
}
/**
* 获取所有蓝牙服务
*/
const getBLEDeviceServices = (deviceId ?: any) => {
console.log(deviceId)
uni.getBLEDeviceServices({
deviceId: deviceId,
success: (res : any) => {
console.log(res);
for (let i = 0; i < res.services.length; i++) {
let serviceId = res.services[i].uuid
getBLEDeviceCharacteristics(deviceId, serviceId);
}
}
})
}
/*
获取蓝牙设备某个服务中所有特征值(characteristic)
characteristic:
uuid:蓝牙设备特征值的 uuid
properties:该特征值支持的操作类型
*/
const getBLEDeviceCharacteristics = (deviceId : any, serviceId : any) => {
uni.getBLEDeviceCharacteristics({
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
deviceId: deviceId,
serviceId,
success: (res : any) => {
let result = JSON.parse(JSON.stringify(res))
console.log(result);
for (let i = 0; i < result.characteristics.length; i++) {
if (result.characteristics[i].properties.write == true) {
let uuid = result.characteristics[i].uuid
for (let index in devices.value) {
if (devices.value[index].deviceId === deviceId) {
devices.value[index].services.push({
serviceId: serviceId,
characteristicId: uuid
})
let obj = devices.value.find((item : any) => item.deviceId === deviceId)
uni.setStorageSync('serviceId', obj.services[0].serviceId)
uni.setStorageSync('characteristicId', obj.services[0].characteristicId)
break
}
}
}
}
}
})
}
const stopBluetooth = () => {
uni.closeBLEConnection({
deviceId: uni.getStorageSync('deviceId'),
success: (res : any) => {
console.log(res);
state.value = 0
name.value = ''
isConnected.value = false
devices.value = []
uni.showToast({
title: '成功断开连接',
icon: 'success'
})
uni.removeStorageSync('serviceId')
uni.removeStorageSync('characteristicId')
uni.closeBluetoothAdapter({
success: res => {
devices.value = []
},
fail: res => {
}
})
}
});
}
</script>
<style>
.printer_box {
display: flex;
align-items: center;
justify-content: center;
width: 750rpx;
height: 200rpx;
margin-top: 100rpx;
}
.printer_img {
width: 130rpx;
height: 130rpx;
background-color: darkgray;
padding: 27rpx;
box-sizing: border-box;
border-radius: 100rpx;
display: flex;
margin: 10rpx auto;
}
.printer_imgs {
width: 130rpx;
height: 130rpx;
background-color: #2588FF;
padding: 27rpx;
box-sizing: border-box;
border-radius: 100rpx;
display: flex;
margin: 10rpx auto;
}
.printer_text {
font-size: 34rpx;
font-weight: 500;
margin-top: 30rpx;
}
.printer_text_tag {
color: #A3A3A3;
font-size: 26rpx;
text-align: center;
margin-top: 10rpx;
}
.printer_btn {
width: 660rpx;
height: 88rpx;
border-radius: 60rpx;
background-color: #2588FF;
color: #fff;
font-size: 30rpx;
line-height: 88rpx;
margin-top: 70rpx;
}
.printer_under_title {
width: 100%;
height: 50rpx;
background-color: #F9FBFC;
font-size: 24rpx;
color: #333333;
line-height: 50rpx;
margin: 50rpx 0 0 30rpx;
}
.printer_under_content {
font-size: 28rpx;
width: 80%;
height: 60rpx;
border-bottom: 1rpx solid #f3f2f2;
margin: 30rpx auto;
}
</style>