UniAPP 通过ESC/POS指令打印二维码

之前写了如何 通过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 intJava byte
0-1270 ~ 1270 ~ 127
128-255128 ~ 255-128 ~ -1

但是试了一下在把超过127长度的PL值调整成对应的 负值传入 又不生效

解决方案是如果code 长度在 125~252 可以将Code补全到253长度以上

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值