之前写了如何 通过ESCPOS指令打印文本、通过点阵数据 打印图片,参考
DCloud UniAPP Android 蓝牙连接ESCPOS打印机_plus.android.importclass("android.bluetooth.blueto-CSDN博客
UniAPP Android 蓝牙 ESCPOS打印机 打印图片和二维码_移动端打印二维码_xxjiangxx的博客-CSDN博客
这一篇 通过 文本直接 打印对应二维码方式(用字符串文本内容打印二维码):
适配设备 商米手持POS(非金融机)
function printQrCode_Old(code) { //打印二维码:将二维码对应的链接字符串传进来就可以打印
var mac_address = context.printer_mac;
if (!mac_address) {
return '蓝牙打印机未连接';
}
if (code) {
var main = plus.android.runtimeMainActivity();
var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
var UUID = plus.android.importClass("java.util.UUID");
var uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
var BAdapter = BluetoothAdapter.getDefaultAdapter();
var device = BAdapter.getRemoteDevice(mac_address);
plus.android.importClass(device);
var bluetoothSocket = device.createRfcommSocketToServiceRecord(uuid);
plus.android.importClass(bluetoothSocket);
if (!bluetoothSocket.isConnected()) {
console.log('#1 检测到设备未连接,尝试连接....');
bluetoothSocket.connect();
}
console.log('设备已连接');
if (bluetoothSocket.isConnected()) {
console.log('#3 开始打印');
var outputStream = bluetoothSocket.getOutputStream();
plus.android.importClass(outputStream);
var print = [0x0a]
var OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter')
var writer = new OutputStreamWriter(outputStream, 'gbk')
plus.android.importClass(writer)
var moduleSize = 8
var bytes = plus.android.invoke(code, 'getBytes', 'gbk')
var length = bytes.length
console.log('#4 ');
// 缓存二维码数据
writer.write(0x1D) // init
writer.write('(k') // adjust height of barcode
console.log("code 长度:", length + 3, (length + 3) % 256);
let pl = (length + 3) % 256;
if (pl > 127) {
pl = pl - 256;
}
console.log("code pl:", pl);
writer.write(pl) // pl
let ph = Math.floor((length + 3) / 256);
console.log("code ph长度:", ph);
writer.write(ph) // ph
console.log('#5 ');
writer.write(49) // cn
writer.write(80) // fn
writer.write(48) //
writer.write(code)
console.log('#6 ');
// 二维码纠错等级
writer.write(0x1D)
writer.write('(k')
writer.write(3)
writer.write(0)
writer.write(49)
writer.write(69)
writer.write(48)
console.log('#7 ');
// 设置二维码块大小
writer.write(0x1D)
writer.write('(k')
writer.write(3)
writer.write(0)
writer.write(49)
writer.write(67)
writer.write(moduleSize)
console.log('#8 ');
// 打印已缓存的数据二维码
writer.write(0x1D)
writer.write('(k')
writer.write(3) // pl
writer.write(0) // ph
writer.write(49) // cn
writer.write(81) // fn
writer.write(48) // m
console.log('#9 ');
writer.write(0x1B)
writer.write(0x64)
writer.write(3) // 行数
writer.flush()
console.log('#10 ');
device = null //这里关键
bluetoothSocket.close(); //必须关闭蓝牙连接否则意外断开的话打印错误
console.log('#11 ');
return "1";
} else {
console.log('#12 设备未连接 ');
}
} else {
return "没有输入打印内容";
}
}
经过测试上述代码 可以打印的code 最大长度在124位,
124+3位指令 刚好到了127 即 JavaScript Int 转 Java Byte最大值,
操作这个长度的二维码将无法打印,
后又测试 Code长度 在 124~252 无法打印
长度在 253~之后通过调整PL和PH 长度又可以打印了,问题就出在 uniapp的int 和Java的Byte转换上 JavaScript中的Int 0~255 对应到Java Byte上是 -128~127即:
数字范围 | JavaScript int | Java byte |
0-127 | 0 ~ 127 | 0 ~ 127 |
128-255 | 128 ~ 255 | -128 ~ -1 |
但是试了一下在把超过127长度的PL值调整成对应的 负值传入 又不生效
解决方案是如果code 长度在 125~252 可以将Code补全到253长度以上