xiaokuaisong-shopapp/uniapp05/pages/distribution/distribution.vue
2024-10-31 18:57:19 +08:00

148 lines
4.4 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.

22.42
<template>
<view>
<button @click="startPrinting">打印订单</button>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue';
// 定义响应式变量
const deviceId = ref(uni.getStorageSync('deviceId')); // 从存储中获取设备ID
const serviceId = ref(uni.getStorageSync('serviceId')); // 打印机服务ID
const characteristicId = ref(uni.getStorageSync('characteristicId')); // 特征值ID
// 开始打印的方法
const startPrinting = () => {
if (!characteristicId.value) {
console.error('请先获取特征值ID');
return;
}
const orderNumber = '123456'; // 示例订单编号
const itemName = '麻辣烫'; // 示例商品名称
const price = '10.00'; // 示例价格
sendPrintCommand(orderNumber, itemName, price);
};
// 生成打印数据
const generatePrintData = (orderNumber, itemName, price) => {
try {
let priceString;
// 如果价格是负数,则添加负号
if (price < 0) {
priceString = (-Math.abs(price)).toFixed(2);
} else {
priceString = (price).toFixed(2);
}
const bufferLength = orderNumber.length + itemName.length + priceString.length + 7; // 包含额外的控制字符
const buffer = new ArrayBuffer(bufferLength);
const dataView = new DataView(buffer);
// 设置初始化指令
dataView.setUint8(0, 0x1B);
dataView.setUint8(1, 0x40);
// 设置订单编号
dataView.setUint8(2, 0x1B);
dataView.setUint8(3, 0x21);
dataView.setUint8(4, orderNumber.length);
for (let i = 0; i < orderNumber.length; i++) {
dataView.setUint8(i + 5, orderNumber.charCodeAt(i));
}
// 设置商品名称
dataView.setUint8(orderNumber.length + 5, 0x1B);
dataView.setUint8(orderNumber.length + 6, 0x29);
dataView.setUint8(orderNumber.length + 7, itemName.length);
for (let i = 0; i < itemName.length; i++) {
dataView.setUint8(i + orderNumber.length + 8, itemName.charCodeAt(i));
}
// 设置价格
dataView.setUint8(itemName.length + orderNumber.length + 8, 0x1B);
dataView.setUint8(itemName.length + orderNumber.length + 9, 0x2A);
dataView.setUint8(itemName.length + orderNumber.length + 10, priceString.length);
for (let i = 0; i < priceString.length; i++) {
dataView.setUint8(i + itemName.length + orderNumber.length + 10, priceString.charCodeAt(i));
}
return buffer;
} catch (error) {
console.error('生成打印数据出错', error);
return null;
}
};
// 发送打印指令
const sendPrintCommand = (orderNumber, itemName, price) => {
try {
const buffer = generatePrintData(orderNumber, itemName, price);
if (!buffer) {
return;
}
const dataView = new DataView(buffer);
uni.writeBLECharacteristicValue({
deviceId: deviceId.value,
serviceId: serviceId.value,
characteristicId: characteristicId.value, // 使用正确的变量名
value: Array.from(new Uint8Array(buffer)),
success: (res) => {
console.log('发送打印指令成功', res);
},
fail: (err) => {
console.error('发送打印指令失败', err);
}
});
} catch (error) {
console.error('发送打印指令出错', error);
}
};
// 获取特征值ID
const getCharacteristicId = async () => {
try {
await uni.getBLEDeviceCharacteristics({
deviceId: deviceId.value,
serviceId: serviceId.value,
success: (res) => {
const characteristics = res.characteristics;
for (let i = 0; i < characteristics.length; i++) {
// 假设你知道哪个特征值用于打印
if (characteristics[i].uuid === '已知的特征值UUID') {
characteristicId.value = characteristics[i].uuid;
console.log('找到特征值ID:', characteristicId.value);
// 获取到特征值后发送打印指令
sendPrintCommand(); // 使用正确的变量名
break;
}
}
},
fail: (err) => {
console.error('获取特征值失败', err);
}
});
} catch (error) {
console.error('获取特征值出错', error);
}
};
// 页面加载时尝试连接设备
onMounted(async () => {
if (deviceId.value && serviceId.value) {
// 如果已经知道特征值ID可以直接设置
if (characteristicId.value) {
console.log('已知特征值ID:', characteristicId.value);
} else {
// 否则获取特征值ID
await getCharacteristicId();
}
}
});
</script>