H5 +蓝牙打印机 CPCL和ESC

@[搜索蓝牙打印机函数]
var SearchBluetooth = function() {
/dom变量定义/
var BluetoothBtn = document.getElementById(“BluetoothBtn”), //最下边的按钮
unpairedList = document.getElementById(“unpairedList”), //未配对设备列表
pairedList = document.getElementById(“pairedList”), //已配对设备列表
loadImgHtml = ‘’; //加载图像HTML

/*plus变量定义*/
var main, BluetoothAdapter, BAdapter, IntentFilter, BluetoothDevice, receiver; //有些我也不知道是啥意思-_-!;

/*其他定义*/
var isSearchDevices = false, //是否处于搜索状态
	savedBleId = localStorage.getItem("bleId"), //缓存的设备ID
	IntervalObj, //定时器对象
	BleDeviceObjAry = [], //BleDevice对象数组 
	debug = false; //调试模式

return {
	//初始化方法
	Init: function() {
		main = plus.android.runtimeMainActivity(),
			BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter"),
			IntentFilter = plus.android.importClass('android.content.IntentFilter'),
			BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice"),
			BAdapter = new BluetoothAdapter.getDefaultAdapter();

		this.CheckBluetoothState();
		this.EventInit();
	},

	//事件绑定
	EventInit: function() {
		var self = this,
			bdevice = new BluetoothDevice();

		//搜索
		BluetoothBtn.addEventListener("tap", function() {
			if(!isSearchDevices) {
				self.SearchDevices();
			}
		});

		/*未配对列表点击事件*/
		mui("#unpairedList").on("tap", "li", function() {
			var id = this.getAttribute("data-id"),
				state = true;
			self.SetButtonStatus("正在配对...", true);
			for(var i = 0, l = BleDeviceObjAry.length; i < l; i++) {
				var BleDeviceItem = BleDeviceObjAry[i];
				main.unregisterReceiver(receiver); //取消监听

				if(BleDeviceItem.getAddress() === id) {
					BleDeviceItem.createBond();

					self.SetButtonStatus("正在配对...", true);

					var testBondState = setInterval(function() {
						if(BleDeviceItem.getBondState() === bdevice.BOND_BONDED) {
							mui.toast("配对成功");
							self.SetButtonStatus("配对成功正在尝试连接打印机...", true);
							localStorage.setItem("bleId", id);
							
							var bleObj = new ConnectPrinter(id);
							bleObj = null;
							window.clearInterval(testBondState);
							mui.back();
						} else if(BleDeviceItem.getBondState() === bdevice.BOND_NONE) {
							mui.toast("配对失败");
							window.clearInterval(testBondState);
							self.SetButtonStatus("重新搜索设备", false);
						}
					}, 1000);
					state = false;
					break;
				}
			}

			if(state) {
				mui.toast("配对失败请重新搜索设备");
				self.SetButtonStatus("重新搜索设备", false);
			}
		});

		/*已配对列表点击事件*/
		mui("#pairedList").on("tap", "li", function() {
			var id = this.getAttribute("data-id");
			if(id) {
				self.SetButtonStatus("配对成功正在尝试连接打印机...", true);
				localStorage.setItem("bleId", id);
				var bleObj = new ConnectPrinter(id);
				
					bleObj = null;
				mui.back();
			}
		});
	},

	//检测蓝牙状态
	CheckBluetoothState: function() {
		var self = this;
		if(!BAdapter.isEnabled()) {
			plus.nativeUI.confirm("蓝牙处于关闭状态,是否打开?", function(e) {
				if(e.index == 0) {
					BAdapter.enable();
				}
			});
			debug && console.log("蓝牙处于关闭状态,正在打开...");
		} else {
			self.SearchDevices();
			debug && console.log("蓝牙处于开启状态,准备搜索蓝牙设备...");
		}
	},

	//搜索设备
	SearchDevices: function() {
		var self = this;
		isSearchDevices = true;
		self.SetButtonStatus("正在搜索蓝牙设备...", true);
		debug && console.log("开始搜索蓝牙设备...");

		var filter = new IntentFilter(),
			bdevice = new BluetoothDevice();

		BleDeviceObjAry = []; //清空BleDeviceObjAry
		unpairedList.innerHTML = '';
		pairedList.innerHTML = '';
		BAdapter.startDiscovery(); //开启搜索

		receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
			onReceive: onReceiveFn
		});
		filter.addAction(bdevice.ACTION_FOUND);
		filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
		filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);
		filter.addAction(BAdapter.ACTION_STATE_CHANGED);
		main.registerReceiver(receiver, filter); //注册监听事件

		//监听回调函数
		function onReceiveFn(context, intent) {
			plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作

			//开始搜索改变状态
			intent.getAction() === "android.bluetooth.device.action.FOUND" && (isSearchDevices = true);

			//判断是否搜索结束
			if(intent.getAction() === 'android.bluetooth.adapter.action.DISCOVERY_FINISHED') {
				main.unregisterReceiver(receiver); //取消监听
				isSearchDevices = false;
				BleDeviceObjAry = [];
				self.SetButtonStatus("重新搜索设备", false);
				return false;
			}

			var BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE),
				bleName = BleDevice.getName(), //设备名称
				bleId = BleDevice.getAddress(); //设备mac地址

			if(!bleName || !bleId) {
				return false;
			}

			//判断是否配对
			if(BleDevice.getBondState() === bdevice.BOND_BONDED) {
				debug && console.log("已配对蓝牙设备:" + bleName + '    ' + bleId);

				self.SetpairedListHtml(pairedList, bleName, bleId);
				//如果缓存保存的设备ID和该ID一致则配对
				if(savedBleId == bleId) {
					BleDevice.createBond();
				}

			} else {
				debug && console.log("未配对蓝牙设备:" + bleName + '    ' + bleId);

				BleDeviceObjAry.push(BleDevice);
				self.SetpairedListHtml(unpairedList, bleName, bleId);
			}

		}

	},

	//设置设备列表HTML
	SetpairedListHtml: function(parentEl, bleName, bleId) {
		var li = document.createElement('li');
		li.setAttribute("data-id", bleId);
		li.innerHTML = bleName + "<span>" + bleId + "</span>";
		parentEl.appendChild(li);
	},

	//更改按钮状态
	SetButtonStatus: function(tipText, isDisabled) {
		if(isDisabled) {
			BluetoothBtn.innerHTML = loadImgHtml + tipText;
			BluetoothBtn.classList.add("mui-disabled");
		} else {
			BluetoothBtn.innerHTML = tipText;
			BluetoothBtn.classList.remove("mui-disabled");
		}
	}
}

}();
//连接打印机和打印
//打印命令
// 导入的java包
//var Context, BluetoothAdapter, BluetoothDevice;
// 蓝牙服务与适配 54
(function(window) {
window.ConnectPrinter = function(bleId) {
var plusMain = 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();
device = BAdapter.getRemoteDevice(bleId);
plus.android.importClass(device);
bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
// createInsecureRfcommSocketToServiceRecord
plus.android.importClass(bluetoothSocket);
if(!bluetoothSocket.isConnected()) {
bluetoothSocket.connect();
}
//mui.toast(‘打印机已就绪,可正常打印!’);
this.gotoPrint = function(a,b,c,d,e) {
if(!bluetoothSocket.isConnected()) {
bluetoothSocket.connect();
}
if(bluetoothSocket.isConnected()) {

				var outputStream = bluetoothSocket.getOutputStream();
				plus.android.importClass(outputStream);		
				var printCmd="! 0 200 200 300 1 \n\r";//建立页面 8点=1mm
				 var pn="型号:"+a; 
				 var brand="品牌:"+b;
				 var dcode="批次:"+c;
				 var qty="数量:"+d;					 
				 var box="订单号:"+e;
				 var kfname="圣和堂";
				//内容
				printCmd+="PAGE-WIDTH 600 \n\r";//打印型号 超过不显示
				//printCmd+="TEXT 12 2 10 40 "+pn+"\n\r" ;//打印型号 超过不显示 文字 
				//printCmd+="TEXT 12 2 10 40 测试\n\r" ;//打印型号 超过不显示 文字 
				//printCmd+="CENTER \n\r";
				printCmd+="SETMAG 2 2\n\r";
				printCmd+="SETBOLD 2\n\r"; 
				printCmd+="TEXT 24 0 250 10 "+kfname+" \n\r";   
				printCmd+="SETMAG 0 0\n\r"; 
				printCmd+="SETBOLD 0\n\r";  
				//printCmd+="LEFT \n\r";
				printCmd+="TEXT 24 0 10 70 "+pn+" \n\r";         
				printCmd+="TEXT 24 0 10 120 "+brand+"\n\r" ;//打印型号 超过不显示 文字 
				printCmd+="TEXT 24 0 10 170 "+dcode+"\n\r" ;//打印型号 超过不显示 文字 
				printCmd+="TEXT 24 0 10 220 "+qty+"\n\r" ;//打印型号 超过不显示 文字  
				printCmd+="TEXT 24 0 10 270 "+box+"\n\r" ;//打印型号 超过不显示 文字  
				//一维码
			    //printCmd+="BARCODE 128 1 1 50 10 160 "+a+"\n\r";//打印条码  超过不显示
			    //printCmd+="TEXT 24 0 50 210 "+a+" \n\r";    
			    printCmd+="BARCODE QR 300 160 M 2 U 6\r\n";//打印二维条码  超过不显示BARCODE \n\r  
			    printCmd+="MA,"+a+"\r\n";           
			    printCmd+="ENDQR\n\r";           
			    //开始打印     
				printCmd+="FORM \n\r"; // 型号:       
				printCmd+="PRINT \n\r"; 
				//console.log(printCmd);
				var arrayBuffer=plus.android.invoke(printCmd, 'getBytes', 'gbk');//stringToByte(printCmd);  
			
				//outputStream.write(plus.android.invoke(printCmd, 'getBytes', 'gbk'));   
				outputStream.write(arrayBuffer);
				//outputStream.write(plus.android.invoke(cmd, 'getBytes', 'gbk'));
				//outputStream.write(stringToByte(printCmd)); 
				outputStream.flush();    

// outputStream.write([0x1B,0x40]);//打印复位
// outputStream.write(plus.android.invoke(“测试打印”, ‘getBytes’, ‘gbk’));
// outputStream.write(plus.android.invoke("\n", ‘getBytes’, ‘gbk’));
// outputStream.write(plus.android.invoke(“测试打印”, ‘getBytes’, ‘gbk’));
// outputStream.flush();

				device = null; 
				
				bluetoothSocket.close(); 
		   }
		};
		this.closePrint=function(){
			device = null;
			bluetoothSocket.close();
	};
};

})(window);
function getLowHighByte(data)
{
var lowHighByte=[];
var dataLen = data.length;
lowHighByte[0] = 0xFF&dataLen;
lowHighByte[1] = (0xFF00&dataLen)>>8;
return lowHighByte;
}
//现有的数组连上后面字符串
function setAddStr(arr,str){
var arr1=stringToByte(str);
for(var i=0;i<arr1.length;i++){
arr.push(arr1[i]);
}
return arr;
}
//现有的数组连上后面字符串 低高位字节
function setAddLowHighByte(arr,arr1){
var arr2=getLowHighByte(arr1);
arr.push(arr2[0]);
arr.push(arr2[1]);
return arr;
}
//(function($, owner) {
// owner.OutputStream = null;
//
// owner.init = function(BluetoothSocket) {
// owner.OutputStream = BluetoothSocket.getOutputStream();
// plus.android.importClass(owner.OutputStream);
// }
//
// // 设置字体大小
// owner.SetFontSize = function(n) {
// var font = [0x1D, 0X21, n]
// owner.OutputStream.write(font);
// };
//
// // 打印字符串
// owner.PrintString = function(string) {
// var bytes = plus.android.invoke(string, ‘getBytes’, ‘gbk’);
// owner.OutputStream.write(bytes);
// };
//
// // 重置打印机
// owner.Reset = function() {
// var reset = [0x1B, 0X40];
// owner.OutputStream.write(reset);
// };
//
// // 打印下划线
// owner.Underline = function() {
// // 下划线指令
// var underline = [0x1b, 0x2d, 0x01];
// owner.OutputStream.write(underline);
// };
// // 左对齐
// owner.ALIGN_LEFT = function() {
// var align_left = [0x1b, 0x61, 0x00];
// owner.OutputStream.write(align_left);
// };
// // 中间对齐
// owner.ALIGN_CENTER = function() {
// var align_center = [0x1b, 0x61, 0x01];
// owner.OutputStream.write(align_center);
// };
// //加粗BOLD
// owner.BOLD = function() {
// var bold = [0x1b, 0x45, 0x01];
// owner.OutputStream.write(bold);
// };
// //取消加粗BOLD
// owner.BOLD_CANCEL = function() {
// var bold = [0x1d, 0x21, 0x11];
// owner.OutputStream.write(bold);
// };
// // 右对齐
// owner.ALIGN_RIGHT = function() {
// var align_right = [0x1b, 0x61, 0x02];
// owner.OutputStream.write(align_right);
// };
// // 结束打印
// owner.End = function() {
// owner.OutputStream.flush();
// var end = [0x1d, 0x4c, 0x1f, 0x00];
// owner.OutputStream.write(end);
// };
//
// // 打印图片(暂不可用)
// owner.Picture = function() {
// var picture = [0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x40, 0x1B, 0x33, 0x00];
// // var picture = [0x1B, 0x2A];
// owner.OutputStream.write(picture);
// };
//
// // 切纸(暂不可用)
// owner.CutPage = function() {
// // 发送切纸指令
// var end = [0x1B, 0x69];
// owner.OutputStream.write(end);
// };
//
// // 条形码打印(暂不可用)
// owner.PrintBarcode = function(n) {
// var barcode = [0x1D, 0x6B, 65, 5, 11, 12, 3, 6, 23];
// owner.OutputStream.write(barcode);
// };
//}(mui, window.PrintUtil = {}))

// var maxBit=200;////每次最多传200个
// var isContinue=true;
//while(isContinue){
// var count = arrayBuffer.length;
// console.log(count);
// if (count > maxBit) {
// arrayBuffer=arrayBuffer.slice(200);
// outputStream.write(arrayBuffer.slice(0, maxBit));
// }else{
// isContinue=false;
// outputStream.write(arrayBuffer);
// }
// }
function arrApply(a,b){
for(var i in b){
a.push(b[i]);
}
return a;
}
function stringToByte(str) {
var bytes = new Array();
var len, c;
len = str.length;
for(var i = 0; i < len; i++) {
c = str.charCodeAt(i);
if(c >= 0x010000 && c <= 0x10FFFF) {
bytes.push(((c >> 18) & 0x07) | 0xF0);
bytes.push(((c >> 12) & 0x3F) | 0x80);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000800 && c <= 0x00FFFF) {
bytes.push(((c >> 12) & 0x0F) | 0xE0);
bytes.push(((c >> 6) & 0x3F) | 0x80);
bytes.push((c & 0x3F) | 0x80);
} else if(c >= 0x000080 && c <= 0x0007FF) {
bytes.push(((c >> 6) & 0x1F) | 0xC0);
bytes.push((c & 0x3F) | 0x80);
} else {
bytes.push(c & 0xFF);
}
}
return bytes;

	}

//HTML 页面

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
	<title></title>
	<script src="js/mui.min.js"></script>
	<link href="css/mui.min.css" rel="stylesheet" />
	<script type="text/javascript" charset="utf-8">
		mui.init();
	</script>
	<style type="text/css">
		ul {
			margin: 0;
		}
		
		footer {
			background: none !important;
			border: none !important;
			box-shadow: none !important;
			bottom: 20px !important;
		}
		
		.printer-title {
			color: #787878;
			line-height: 30px;
			font-size: 12px;
		}
		
		.printer-list {
			min-height: 160px;
			border-radius: 4px;
			background-color: #fff;
			font-size: 13px;
		}
		
		.printer-list>li {
			line-height: 40px;
			border-bottom: 1px solid #eee;
			padding: 0 15px;
		}
		
		.printer-list>li>span {
			color: #999;
			float: right;
		}
		
		img.loadImg {
			width: 16px;
			margin-right: 6px;
			vertical-align: middle;
		}
		
		.btn {
			background-color: #5C75EE;
			color: #fff;
			font-size: 14px; 
			display: block;
			width: 100%;
			border: none;
			height: 44px;
			border-radius: 4px;
		}
		
		.btn:active {
			background-color: #4d69ed !important;
		}
	</style>
</head>

<body>
	<!-- 顶部导航 -->
	<header class="mui-bar mui-bar-nav bgc_main head">
		<h1 class="mui-title c_white">连接打印机</h1>

	</header>
	<footer class="mui-bar mui-bar-footer">
		<button id='BluetoothBtn' class="btn mui-disabled">正在初始化...</button>
	</footer>
	<div class="mui-content">
		<div style="padding:0 10px;">
			<div>
				<span class="printer-title">未配对蓝牙设备</span>
				<ul id="unpairedList" class="printer-list mui-list-unstyled">

				</ul>
			</div>
			<div>
				<span class="printer-title">已配对蓝牙设备</span>
				<ul id="pairedList" class="printer-list mui-list-unstyled">

				</ul>
			</div>
		</div>
	</div>

	<script src="js/printer.js" type="text/javascript" charset="utf-8"></script>
	<script type="text/javascript">
		(function() {
			//连接打印机函数
			
			
			mui.plusReady(function() {
				//调用蓝牙搜索
				SearchBluetooth.Init();
			}); 
		})(); 
	</script> 
</body>

//16进制命令打印

outputStream.write([0x1B,0x40]);//打印复位
outputStream.write([0x1C,0x4C,0x63]);//清除
//outputStream.write([0x1B,0x24,0x00,0x00]);//设置绝对打印位置5mm,80表示00
outputStream.write([0x1D,0x4C,0x2F,0x00]);// //设置左边距0x2F
outputStream.write([0x1D,0x77,0x02]);//大小
//outputStream.write(plus.android.invoke("\n", ‘getBytes’, ‘gbk’)); //bytes
outputStream.write([0x1B,0x61,0x00]);//居左
outputStream.write([0x1D,0x4C,0x2F,0x00]);
var bytes = plus.android.invoke(PrintText, ‘getBytes’, ‘gbk’);
outputStream.write(bytes); //bytes
outputStream.flush();
outputStream.write([0x1C,0x4C,0x63]);//清除
//outputStream.write([0x1C,0x4C,0x63]);//清除
//outputStream.write([0x1B,0x40]);//打印复位
outputStream.write(plus.android.invoke("\n", ‘getBytes’, ‘gbk’)); //bytes
//一维码
//outputStream.write([0x1B,0x61,0x00]);//居左
var barcode= [0x1D,0x6B,0x04];//[0x1D, 0x6B, 0x04];
console.log(barcode);
var barcodeContent=“P”+a+“Q”+d+“D”+e;
var barcodebyte= plus.android.invoke(a, ‘getBytes’, ‘gbk’);
barcode = barcode.concat(barcodebyte);//barcodebyte
barcode.push(0x00);
console.log(barcode);

				outputStream.write(barcode);
				
				outputStream.write([0x1C,0x4C,0x63]);//清除
				outputStream.write(plus.android.invoke("\n1234456", 'getBytes', 'gbk'));  //bytes  
				outputStream.write(plus.android.invoke("\n", 'getBytes', 'gbk'));  //bytes  	
				outputStream.flush();  
				outputStream.write([0x1C,0x4C,0x63]);//清除
				outputStream.write([0x1D,0x77,0x02]); 
				barcode=null;   
				barcode= [0x1D,0x6B,0x04];
				barcode=barcode.concat(plus.android.invoke("Q1500ABCDEFGABCDEF", 'getBytes', 'gbk')); 
				barcode.push(0x00);   
				outputStream.write(barcode); 
				outputStream.flush();  
				outputStream.write([0x1C,0x4C,0x63]);//清除
				outputStream.write(plus.android.invoke("\n箱    号:*12346*\n", 'getBytes', 'gbk'));  //bytes     
				outputStream.write(plus.android.invoke("数    量:*12346*\n", 'getBytes', 'gbk'));  //bytes     
				outputStream.write(plus.android.invoke("日    期:*12346*\n", 'getBytes', 'gbk'));  //bytes     
				outputStream.flush();  
					//outputStream.write(plus.android.invoke("\n", 'getBytes', 'gbk'));  //bytes  	
				outputStream.write([0x1C,0x4C,0x63]);//清除   
				
				outputStream.write([0x1D,0x77,0x04]);//大小  
				outputStream.write([0x1C,0x4C,0x63]);//清除 
				//outputStream.write([0x1B,0x61,0x02]);//居右
				//outputStream.write([0x1B,0x24,0x1D,0x80]);//设置绝对打印位置5mm,80表示00 
				outputStream.write([0x1D,0x5A,0x02]); ////选择QR-CODE条码		 
				outputStream.write([0x1C,0x4C,0x63]);//清除
			    var QrContent=[0x1B,0x5A,0x00,0x01,0x00];//,0x39,0x00								
				var Code128StrBytes = plus.android.invoke(barcodeContent, 'getBytes', 'gbk');
				
				var arr=getLowHighByte(Code128StrBytes); 
				QrContent.push(arr[0]);
				QrContent.push(arr[1]); 
				var SendCode128Bytes = QrContent.concat(Code128StrBytes);//Code128StrBytes
				outputStream.write(SendCode128Bytes); 
					outputStream.write(plus.android.invoke("\n", 'getBytes', 'gbk'));  //bytes  
				outputStream.flush();  

猜你喜欢

转载自blog.csdn.net/parlmes/article/details/88413775