js连接蓝牙打印机打印一维码和二维码

JavaScript使用原生JS(native.JS)连接蓝牙打印机,打印一维码、二维码

使用说明:

  1. 代码已经过测试,可正常使用
  2. 测试蓝牙打印机为 商米(SUNMI)V2S plus打印机,此设备为一体机,与PDA连接
  3. 打印出的一维码和二维码中包含汉字与字母,使用其他设备扫描时可能会出现乱码的情况,出现此现象的原因为扫描设备的配置太低,无法解析包含汉字的二维码,使用手机扫描时即可正常显示
  4. 代码中的MAC地址一定要改为自己蓝牙打印机的蓝牙Mac地址
<!DOCTYPE html>
<html lang="zh">
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title></title>
		<link rel="stylesheet" type="text/css" href="../../css/mui.css" />
		<script src="../../js/mui.js" type="text/javascript" charset="utf-8"></script>
	</head>
	<body>
		<header class="mui-bar mui-bar-nav" style="background-color: #007AFF;">
			<a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left" style="color: #fff;"></a>
			<h1 class="mui-title" style="color: #fff;">蓝牙打印</h1>
		</header>
		<div class="mui-content" style="padding-top: 50px;">
			<button type="button" class="mui-btn mui-btn-blue mui-btn-block" id="print1">打印条形码</button>
			<button type="button" class="mui-btn mui-btn-blue mui-btn-block" id="print2">打印二维码</button>
		</div>
		<script type="text/javascript">
			var bluetoothSocket = null;
			var bluetoothPrinterMac = "00:11:22:33:44:55"; //蓝牙打印机的MAC地址
			window.onload = function() {
				concatBlue();
			};
			//打印条形码
			document.getElementById("print1").addEventListener("tap", () => {
				printTM();
			});
			//打印二维码
			document.getElementById("print2").addEventListener("tap", () => {
				printQrcode();
			});
			//连接蓝牙
			function concatBlue() {
				mui.plusReady(function() {
					main = plus.android.runtimeMainActivity();
					BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
					UUID = plus.android.importClass("java.util.UUID");
					uuid = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); //不需更改
					BAdapter = BluetoothAdapter.getDefaultAdapter();
					BAdapter.cancelDiscovery(); //停止扫描
					device = BAdapter.getRemoteDevice(bluetoothPrinterMac);
					plus.android.importClass(device);
					bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
					plus.android.importClass(bluetoothSocket);
				});
			};

			/**
			 * @Description:打印初始化
			 */
			function initPrinter() {
				console.log('打印初始化开始');
				var outputStream = bluetoothSocket.getOutputStream();
				plus.android.importClass(outputStream);
				OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter')
				writer = new OutputStreamWriter(outputStream, 'GBK')
				plus.android.importClass(writer)
				writer.write(0x1B)
				writer.write(0x40)
				writer.flush()
				console.log('打印初始化结束');
			}


			/**
			 * @Description: 打印条码
			 */

			function printTM() {
				var byteStr = '这是条形码Demo';
				if (!bluetoothSocket.isConnected()) {
					console.log('断开了,需要重新连接,连接中');
					bluetoothSocket.connect();
				}

				initPrinter();

				var bytes = plus.android.invoke(byteStr, 'getBytes', 'gbk')
				var length = bytes.length
				outputStream = bluetoothSocket.getOutputStream()
				plus.android.importClass(outputStream)
				OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter')
				writer = new OutputStreamWriter(outputStream, 'GBK')
				plus.android.importClass(writer)

				writer.write(0x1B); //打印复位
				writer.write(0x40); //打印复位
				writer.flush();
				var vstr = '{B' + byteStr;
				var bytes = plus.android.invoke(vstr, 'getBytes', 'gbk');
				var length = bytes.length



				writer.write(0x1D);
				writer.write(0x6B);
				writer.write(73);
				writer.write(length);
				writer.write(vstr);
				writer.flush();
				//换行
				writer.write("\n");
				writer.flush();
				writer.write(byteStr);
				writer.flush();
				setAlignPosition(1);
				console.log('条码打印成功');
				ff(2);
			}

			/**
			 * 方法说明 设置文本对齐方式
			 * @param align 打印位置  0:居左(默认) 1:居中 2:居右
			
			 */
			function setAlignPosition(align) {
				writer.write(0x1B);
				writer.write(0x61);
				writer.write(1);
				writer.flush();
			}



			/**
			 * @Description: 二维码打印
			
			 */
			function printQrcode() {
				var byteStr = '这是二维码Demo';
				if (!bluetoothSocket.isConnected()) {
					console.log('断开了,需要重新连接,连接中');
					bluetoothSocket.connect();
				}
				// init
				initPrinter();
				var moduleSize = 8
				var bytes = plus.android.invoke(byteStr, 'getBytes', 'gbk')
				var length = bytes.length
				outputStream = bluetoothSocket.getOutputStream()
				plus.android.importClass(outputStream)
				OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter')
				writer = new OutputStreamWriter(outputStream, 'GBK')
				plus.android.importClass(writer)
				// 缓存二维码数据
				writer.write(0x1D) // init
				writer.write('(k') // adjust height of barcode
				writer.write(length + 3) // pl
				writer.write(0) // ph
				writer.write(49) // cn
				writer.write(80) // fn
				writer.write(48) //
				writer.write(byteStr)
				// 二维码纠错等级
				writer.write(0x1D)
				writer.write('(k')
				writer.write(3)
				writer.write(0)
				writer.write(49)
				writer.write(69)
				writer.write(48)
				// 设置二维码块大小
				writer.write(0x1D)
				writer.write('(k')
				writer.write(3)
				writer.write(0)
				writer.write(49)
				writer.write(67)
				writer.write(moduleSize)
				// 打印已缓存的数据二维码
				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

				writer.flush()
				// 二维码打印 结束
				ff(2);
				console.log('二维码打印结束')
			}


			/**
			 * @Description:走纸
			 */

			function ff(n) {

				// bluetoothSocket.close();
				if (!bluetoothSocket.isConnected()) {
					console.log('断开了,需要重新连接,连接中');
					bluetoothSocket.connect();
				}

				if (bluetoothSocket.isConnected()) {
					console.log('连接成功');
					//initPrinter();
					const line = n || 1;
					var outputStream = bluetoothSocket.getOutputStream();
					plus.android.importClass(outputStream);
					outputStream.write(0x1B);
					outputStream.write(0x64);
					outputStream.write(line); // 行数
					outputStream.flush();
				}
			}
		</script>
	</body>
</html>

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
好的,下面是一个简单的 Swift 代示例,可以连接蓝牙打印机,并根据输入的字符串生成二维码打印。同时,代中也包含了设置二维码位置的功能。 需要注意的是,这个代示例依赖于第三方库 `CoreBluetooth` 和 `QRCodeGenerator`,请确保已经正确安装这些库。 ```swift import UIKit import CoreBluetooth import QRCodeGenerator class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate { // 蓝牙设备的名称 let DEVICE_NAME = "Your Bluetooth Printer Name" // 蓝牙相关变量 var centralManager: CBCentralManager! var targetPeripheral: CBPeripheral? var writeCharacteristic: CBCharacteristic? override func viewDidLoad() { super.viewDidLoad() // 初始化蓝牙中央设备管理器 centralManager = CBCentralManager(delegate: self, queue: nil) } // 扫描到蓝牙设备后的回调函数 func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) { if peripheral.name == DEVICE_NAME { targetPeripheral = peripheral // 连接蓝牙设备 centralManager.connect(targetPeripheral!, options: nil) } } // 连接蓝牙设备成功后的回调函数 func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) { targetPeripheral?.delegate = self targetPeripheral?.discoverServices(nil) } // 发现蓝牙服务后的回调函数 func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) { if let services = peripheral.services { for service in services { // 找到可写的特征值 peripheral.discoverCharacteristics([CBUUID(string: "FFF1")], for: service) } } } // 发现蓝牙特征值后的回调函数 func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) { if let characteristics = service.characteristics { for characteristic in characteristics { if characteristic.properties.contains(.write) { writeCharacteristic = characteristic // 生成二维码打印 let qrCode = QRCode("Hello, world!") let imageData = qrCode?.image(size: CGSize(width: 200, height: 200)) let data = UIImagePNGRepresentation(UIImage(data: imageData!)!) peripheral.writeValue(data!, for: characteristic, type: .withResponse) // 设置二维码位置 let position = Data([0x1B, 0x24, 0x00, 0x00, 0x1B, 0x61, 0x01]) peripheral.writeValue(position, for: characteristic, type: .withResponse) } } } } // 开始扫描蓝牙设备 func startScanning() { centralManager.scanForPeripherals(withServices: nil, options: nil) } // 蓝牙状态发生变化时的回调函数 func centralManagerDidUpdateState(_ central: CBCentralManager) { if central.state == .poweredOn { startScanning() } } } ``` 这个代示例中,我们使用了 `QRCodeGenerator` 库来生成二维码,并使用了 `CoreBluetooth` 库来连接蓝牙设备和发送数据。其中,我们通过 `peripheral(_:didDiscoverCharacteristicsFor:error:)` 函数来发现蓝牙特征值,并找到可写的特征值来发送数据。同时,我们也在这个函数中生成二维码,并设置了二维码在纸张上的位置。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值