xiaokuaisong-shopapp/uniapp05/pages/Printer/Printer.vue
2024-10-18 16:05:19 +08:00

348 lines
8.0 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>