Uniapp小程序蓝牙打印 打印遇到的坑和解决方案分享
资料
推荐方案
escpos-php 来生成指令集
强烈首推, 原因: 完善
你想要的功能都有,比如二维码 和 条码 中文字体调大等,调用也简单。
教程: www.jianshu.com/p/4c6cd7563759
这个作者已经写了,我就不重复写了。
修改:
// echo $printer->flushBase64(); 这是他的
$printer->flushHex()
演示数据:
前端
// 这是 ` $printer->flushHex()` 的输出,也就是要返给前端的内容。
var hex_str = `
1b401d57d0011b61011d21001d286b0400314132001d286b03003143061d286b03003145301d286b0e0031503068656c6c6f20776f726c641d286b03003151301c26c4e3bac31c2e0a1d683c1d77041d48021d6b430d363933373038323238303838311b6402
`
var toBuff = str => {
const hex_arr = str.match(/.{1,2}/g).map(byte => parseInt(byte,16))
return new Uint8Array(hex_arr).buffer
}
var buff = toBuff(hex_str) // 这个是要发送给蓝牙设备的数据
如何发送? 参考此代码 printbuff
打印机结果:
图片和文字同一行
我并未找到 esc/pos
设置图片到同行的指令,(水平定位和绝对定位我也试过了,都不行)。
估计只有 cpcl
才可以。
我的方案是需要同行的部分由后端生成,当作图片来打印。
(上面那个图 除了条码 都是后端生成的 )
php
方案:
- 图片合成:
intervention/image
- 二维码生成:
simplesoftwareio/simple-qrcode
如果你用的是xun-bluetoothPrint - printbuffs这种定时器发送,会偶尔乱码/缺少的,因为那个定时的延迟不能保证 100% 像单管道一样堵塞的执行。
xun-bluetoothPrint - printbuffs 修改为Promise 解决图片乱码情况
改两个方法
async subcontractSync(buffer,maxChunk = 20) {
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
);
await this.writeBLECharacteristicValue(subPackage)
// setTimeout(this.printbuff, 500, subPackage);
}
}
// 向蓝牙设备写入数据 并返回promise
printbuff(buffer) {
return new Promise(resolve => {
uni.writeBLECharacteristicValue({
deviceId: this.deviceId,
serviceId: this.serviceId,
characteristicId: this.characteristicId,
value: buffer,
success: (res) => {
resolve(1)
},
fail: (e) => this.handleError(e),
})
})
}
吐槽
一开始,我就走进了很大误区。
- 以为二维码和条码需要自己生成图片,其实打印机支持的。
- 看
esc/pos
组装条码和二维码数据(耗时2天左右)。
各位做打印的话,请访问: github.com/search?q=esc%2Fpos
本作品采用《CC 协议》,转载必须注明作者和本文链接
先收藏了,有需要再用,哈哈 :grin: 我之前搞了一个web 打印word 的服务
苦苦录觅打印电子面单的操作,有空看看
请问配套的打印机是啥牌子 型号 ,后面正好有个这种的需求。感谢。