You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

413 lines
12 KiB

import gbk from '@/components/kk-printer/utils/printUtil-GBK.js';
import * as blesdk from './utils/bluetoolth';
import util from './utils/util.js';
var bufferData = []
var deviceType = 'ios'
export default {
onPrint() {
let that = this
that.yNum = 10
let strCmd = blesdk.CreatCPCLPage(440, 1000, 1, 0);
strCmd += blesdk.addCPCLSETMAG(2, 2)
strCmd += blesdk.addCPCLLocation(2);
strCmd += blesdk.addCPCLSETBOLD('400');
// strCmd += blesdk.addCPCLText('0', that.yNum, '24', '2', 0, getApp().globalData.printData[0].order_id)
strCmd += blesdk.addCPCLText('0', that.yNum, '24', '2', 0, "#0112 外卖单")
strCmd += blesdk.addCPCLLocation(0);
strCmd += blesdk.addCPCLSETBOLD('0')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum+=60, '24', '0', 0, '七里香快餐明珠精品馆')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, "预计时间:2026-02-01 13:14:00")
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, "*********")
strCmd += blesdk.addCPCLSETMAG(2, 2)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '1', 0, '王 先生')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 50, '24', '0', 0, '联系电话: *******0775')
strCmd += blesdk.addCPCLSETMAG(2, 2)
strCmd += blesdk.addCPCLText('0', that.yNum += 50, '24', '0', 0, '地址:河北东川建设集团有限公司(河北省沧州市运河区)******')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 50, '24', '0', 0, '为保护隐私,顾客电话及地址已隐藏,')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '您可登陆商家端或骑手端查看')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '*******************************************')
strCmd += blesdk.addCPCLSETMAG(2, 2)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '1、红烧黛玉')
strCmd += blesdk.addCPCLSETMAG(2, 2)
strCmd += blesdk.addCPCLText('0', that.yNum += 50, '24', '0', 0, 'X1 16元')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 50, '24', '0', 0, '*******************************************')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '配送费: 1元')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '合计金额: 17元')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '*******************************************')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '商品取到后,如有任何商品问题,请')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '联系商家或平台,客服将为您服务客')
strCmd += blesdk.addCPCLSETMAG(1, 1)
strCmd += blesdk.addCPCLText('0', that.yNum += 30, '24', '0', 0, '服电话13521030702,谢谢您的惠顾')
strCmd += blesdk.addCPCLPrint();
bufferData.push(strCmd);
this.handlePrintTap()
},
//点击打印按钮
handlePrintTap() {
let that = this
uni.showLoading({
mask: true,
title: '打印中...'
});
uni.getSystemInfo({
success(res) {
console.log('设备类型',res.osName)
deviceType = res.osName
},fail(err){
console.log('getSystemInfo失败')
}
})
// 初始化蓝牙模块
uni.openBluetoothAdapter({ //111
mode: 'central',
success: (res2) => {
console.log('openBluetoothAdapter成功')
that.jiantingshebei()
},
fail: (res) => {
console.log('openBluetoothAdapter失败')
if (res.errCode == '10001') {
uni.showToast({
duration: 2000,
title: "请打开蓝牙后,再进行连接",
icon: 'none',
mask: true
})
} else {
that.tui.toast('连接失败,请重启蓝牙或删除小程序重新进入-1')
that.isShowSearch = true
}
setTimeout(res => {
uni.hideLoading();
}, 2000)
}
})
},
/**
* jiantingshebei方法,判断缓存中有没有deviceId等数据的时候,
* 有: 直接拿到缓存中的deviceId等,直接请求 uni.createBLEConnection
* 没有:才会调用 uni.onBluetoothDeviceFound 搜索
*/
jiantingshebei() {
let that = this;
console.log('jiantingshebei设备',uni.getStorageSync('deviceId'))
if (uni.getStorageSync('deviceId')) {
// that.huoqufuwu(uni.getStorageSync('deviceId'))
that.lianejieshebei(uni.getStorageSync('deviceId'))
} else {
uni.showToast({
duration: 2000,
title: "蓝牙连接失败,请去商家主页尝试重新连接",
icon: 'none',
mask: true
})
// uni.hideLoading();
// that.isShowSearch = true
// // 监听扫描到新设备事件
// uni.onBluetoothDeviceFound((res4) => { //333
// res4.devices.forEach((device) => {
// if (!device.name && !device.localName) {
// return
// }
// that.devicesList.push(device)
// })
// })
}
},
lianejieshebei(deviceId) {
let that = this;
uni.showLoading({
mask: true,
title: '加载中...'
});
// let timerId = setTimeout(() => {
// uni.closeBLEConnection({
// deviceId: deviceId,
// success(res2) {
// },fail(err1){
// }
// })
// uni.closeBluetoothAdapter({
// success(res) {
// },fail(err2){
// }
// })
// uni.removeStorageSync('deviceId')
// that.handlePrintTap()
// that.isShowSearch = true
// return
// }, 5000);
// 连接设备
uni.createBLEConnection({ //555
deviceId: deviceId, // 搜索到设备的 deviceId
success: () => {
console.log('createBLEConnection成功')
// 连接成功就清除定时器
// clearTimeout(timerId);
// that.isShowSearch = false
that.huoqufuwu(deviceId)
},
fail: (res) => {
uni.showToast({
duration: 2000,
title: "蓝牙连接失败,请查看打印机状态或重新连接",
icon: 'none',
mask: true
})
// console.log('deviceId对吗?',deviceId)
// console.log('createBLEConnection失败',res)
// clearTimeout(timerId);
// // if(res.errno == '1509007'){
// that.huoqufuwu(deviceId)
// // }
// if(res.errno == '1509003'){
// that.lianejieshebei(deviceId)
// }
}
})
},
huoqufuwu(deviceId) {
let that = this;
//获取服务
uni.getBLEDeviceServices({ //666
deviceId: deviceId, // 搜索到设备的 deviceId
success: (res5) => {
console.log('getBLEDeviceServices成功')
that.duxietezhengzhi(deviceId, res5)
},
fail: (res) => {
uni.showToast({
duration: 2000,
title: "蓝牙连接失败,请查看打印机状态或重新连接",
icon: 'none',
mask: true
})
// console.log('getBLEDeviceServices失败')
// that.tui.toast('连接失败,请重启蓝牙或删除小程序重新进入-4',res)
// uni.closeBLEConnection({
// deviceId: uni.getStorageSync('deviceId'),
// success(res1) {
// }
// })
// uni.removeStorageSync('deviceId')
// that.sousuo()
// that.isShowSearch = true
// setTimeout(res => {
// uni.hideLoading();
// }, 2000)
}
})
},
duxietezhengzhi(deviceId, res5) {
let that = this;
//读写特征值
uni.getBLEDeviceCharacteristics({ //777
deviceId: deviceId, // 搜索到设备的 deviceId
serviceId: res5.services[2].uuid, // 上一步中找到的某个服务
success: (res6) => {
console.log('getBLEDeviceCharacteristics成功',res6)
for (let i = 0; i < res6.characteristics.length; i++) {
let item = res6.characteristics[i]
if (item.properties.write) { // 该特征值可写
that.startNoticeBle(deviceId, res5.services[2].uuid, res6.characteristics[2].uuid)
uni.setStorageSync('deviceId', deviceId);
uni.setStorageSync('serviceId', res5.services[2].uuid);
uni.setStorageSync('characteristicId', item.uuid);
that.xierushuju()
return;
}
}
},
fail: (res) => {
uni.showToast({
duration: 2000,
title: "蓝牙连接失败,请查看打印机状态或重新连接",
icon: 'none',
mask: true
})
// console.log('getBLEDeviceCharacteristics失败')
// that.tui.toast('连接失败,请重启蓝牙或删除小程序重新进入-5',res)
// uni.closeBLEConnection({
// deviceId: uni.getStorageSync('deviceId'),
// success(res) {
// }
// })
// uni.removeStorageSync('deviceId')
// that.sousuo()
// that.isShowSearch = true
// setTimeout(res => {
// uni.hideLoading();
// }, 2000)
}
})
},
// 开启蓝牙数据监听
startNoticeBle(deviceId, serviceId, characteristicId) {
let that = this
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
deviceId: deviceId,
serviceId: serviceId,
characteristicId: characteristicId,
success(res) {
console.log("监听成功",res)
that.GetDataFromBle();
},
fail: function(err) {
console.log("监听失败了")
}
})
},
// 设备返回的数据接收
GetDataFromBle() {
var that = this;
console.log('哈希之前2222222222222222');
uni.onBLECharacteristicValueChange((res) => {
// 此时可以拿到蓝牙设备返回来的数据是一个ArrayBuffer类型数据,所以需要通过一个方法转换成字符串
console.log('哈希之前111111111111',res);
var bleData = that.ab2hex(res.value)
console.log('哈希了吗?',bleData)
uni.hideLoading()
setTimeout(res=>{
uni.closeBLEConnection({
deviceId: uni.getStorageSync('deviceId'),
success(res) {},
fail(err) {}
})
// that.getIsData("0")
bufferData = []
},1000)
})
},
ab2hex(buffer) {
return Array.from(new Uint8Array(buffer))
.map(byte => ('00' + byte.toString(16)).slice(-2))
.join('');
},
xierushuju() {
let that = this;
//写入数据
console.log("22222222222222",bufferData)
var dataStr = ''
for (let m = 0; m < bufferData.length; m++) {
dataStr += bufferData[m]
}
const maxChunk = deviceType == 'android' ? 20 : 180;
const delay = deviceType == 'android' ? 20 : 180;
let buffer = gbk.strToGBKByte(dataStr)
for (let i = 0, j = 0, length = buffer.byteLength; i < length; i += maxChunk, j++) {
let subPackage = buffer.slice(i, i + maxChunk <= length ? (i + maxChunk) : length);
setTimeout(that._writeBLECharacteristicValue, j * delay, subPackage);
}
return;
},
_writeBLECharacteristicValue(buffer) {
let that = this;
uni.writeBLECharacteristicValue({
deviceId: uni.getStorageSync('deviceId'),
serviceId: uni.getStorageSync('serviceId'),
characteristicId: uni.getStorageSync('characteristicId'),
value: buffer,
success(res) {
console.log("66666666666")
},
fail(res) {
console.log("777777777",res)
uni.showToast({
duration: 2000,
title: "打印失败,请查看打印机状态或重新连接",
icon: 'none',
mask: true
})
uni.closeBLEConnection({
deviceId: uni.getStorageSync('deviceId'),
success(res) {
}
})
// if (uni.getStorageSync('deviceId')) {
// // that.xierushuju()
// } else {
// that.jiantingshebei()
// }
// uni.hideLoading();
}
})
},
handleSearchClose() {
uni.closeBluetoothAdapter({
success(res) {
}
})
this.isShowSearch = false
},
getIsData(type){
if(type == 0){
// 删除数组中第一个元素
getApp().globalData.printData.shift();
}
if(getApp().globalData.printData.length>0){
this.onPrint()
}
}
}