h5+连接蓝牙打印机打印小票

由于所在公司产品需要一个骑手端自动接单,接单后自动打印小票的功能,所以将原有的公众号做成了app,调用蓝牙打印机打印小票。
运用框架:mui.js;jquery(不要吐槽,是原有基础上改。。~ 摊手手~)
html:

<div class="main-box mui-off-canvas-wrap">
    <!-- 菜单容器 -->
	  <aside class="mui-off-canvas-left">	
		<div class="mui-scroll-wrapper">
		  <div class="mui-scroll" id="offCanvasSideScroll">
			<!-- 菜单具体展示内容 -->
			  <div class="mui-btn">
				<input id="bt1" class="mui-icon mui-icon-search" type="button" value="点击搜索设备" onclick="searchDevices('a')">
			  </div>
			  <div class="title">未配对蓝牙设备</div>
			  <ul class="mui-table-view" id="list1">
				<li class="mui-table-view-cell"></li>
			  </ul>
			  <div class="title">已配对蓝牙设备</div>
			  <ul class="mui-table-view" id="list2">
				<li class="mui-table-view-cell"></li>
			  </ul>
		  </div>
		</div>
	  </aside>
	  <div class="mui-inner-wrap">
		<div id="backdrop" class="mui-off-canvas-backdrop"></div>
		<div >主体内容省略。。。</div>
	</div>
</div>

大概就是下面的样子:
在这里插入图片描述
js来了:

var device = null,
	BAdapter = null,
	BluetoothAdapter = null,
	uuid = null,
	main = null,
	bluetoothSocket = null;
mui.plusReady(function(){
//如果已经连接过,就自动连接
	if(localStorage.getItem('macaddress')){
		connectFun(localStorage.getItem('macaddress'));
	}
})
//手动搜索蓝牙
//address=""搜索蓝牙//address=设备mac地址,自动配对给出mac地址的设备  
function searchDevices(address) {
	//注册类  
	var main = plus.android.runtimeMainActivity();
	var IntentFilter = plus.android.importClass('android.content.IntentFilter');
	var BluetoothAdapter = plus.android.importClass("android.bluetooth.BluetoothAdapter");
	var BluetoothDevice = plus.android.importClass("android.bluetooth.BluetoothDevice");
	var BAdapter = BluetoothAdapter.getDefaultAdapter();
	if (!BAdapter.isEnabled()) {
		plus.nativeUI.confirm("蓝牙处于关闭状态,是否打开?", function(e) {
			console.log(e.index)
			if (e.index == 0) {
				BAdapter.enable();
				searchDevices();
			}else{
				mui.toast('请打开蓝牙')
			}
		});
		console.log(BAdapter.isEnabled())
	} else{
		
	var filter = new IntentFilter();
	var bdevice = new BluetoothDevice();
	var on = null;
	var un = null;
	var vlist1 = document.getElementById('list1'); //注册容器用来显示未配对设备  
	vlist1.innerHTML = ''; //清空容器  
	var vlist2 = document.getElementById('list2'); //注册容器用来显示未配对设备  
	vlist2.innerHTML = ''; //清空容器  
	var button1 = document.getElementById('bt1');
	button1.disabled = true;
	button1.value = '正在搜索请稍候...';
	BAdapter.startDiscovery(); //开启搜索  
	var receiver;
	receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
		onReceive: function(context, intent) { //实现onReceiver回调函数  
			plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作  
			console.log(intent.getAction()); //获取action  
			if (intent.getAction() == "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
				main.unregisterReceiver(receiver); //取消监听  
				button1.disabled = false;
				button1.value = '搜索设备';
			} else {
				BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
				//判断是否配对  
				if (BleDevice.getBondState() == bdevice.BOND_NONE) {
					console.log("未配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
					//参数如果跟取得的mac地址一样就配对  
					if (address == BleDevice.getAddress()) {
						if (BleDevice.createBond()) { //配对命令.createBond()  
							var li2 = document.createElement('li'); //注册  
							li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
							li2.setAttribute('onclick', 'connectFun(id)'); //注册click点击列表进行打印  
							li2.innerText = BleDevice.getName();
							vlist2.appendChild(li2);
						}

					} else {
						if (BleDevice.getName() != on) { //判断防止重复添加  
							var li1 = document.createElement('li'); //注册  
							li1.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
							li1.setAttribute('onclick', 'searchDevices(id)'); //注册click点击列表进行配对  
							on = BleDevice.getName();
							li1.innerText = on;
							vlist1.appendChild(li1);

						}

					}
				} else {
					if (BleDevice.getName() != un) { //判断防止重复添加  
						console.log("已配对蓝牙设备:" + BleDevice.getName() + '    ' + BleDevice.getAddress());
						var li2 = document.createElement('li'); //注册  
						li2.setAttribute('id', BleDevice.getAddress()); //打印机mac地址  
						li2.setAttribute('onclick', 'connectFun(id)'); //注册click点击列表进行打印  
						un = BleDevice.getName();
						li2.innerText = un;
						vlist2.appendChild(li2);
					}
				}
			}

		}
	});

	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 connectFun(macaddress){
      // var macaddress = localStorage.getItem("macaddress");
      if(!macaddress) {
        mui.toast('请选择蓝牙打印机');
        return;
      }
      localStorage.setItem("macaddress", macaddress);
      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();
      device = BAdapter.getRemoteDevice(macaddress);
      plus.android.importClass(device);
      bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
      plus.android.importClass(bluetoothSocket);
      
      if (!bluetoothSocket.isConnected()) {
        console.log('检测到设备未连接,尝试连接....');
        bluetoothSocket.connect();
      }
      mui.toast('打印机已就绪,可正常打印!');
     // $('#searchBluetooth').html('已连接设备');
     // if(autoReceipt == 1){
     //   timer = setInterval(() => {
     //     orderRefresh()//后台自动接单就打印,所以前端要做轮询~无奈~
    //    }, 20000);
   //   }
       device = null //这里关键
     bluetoothSocket.close(); //必须关闭蓝牙连接否则意外断开的话打印错误
} 
//打印函数差点忘了:公司使用的打印机指令集为ESC/POS,其它自行百度
function printOrder(obj){
	macaddress = localStorage.getItem('macaddress');
	  var BAdapter = BluetoothAdapter.getDefaultAdapter();
	  if(bluetoothSocket==null){
		  mui.toast('请连接蓝牙')
		  return false;
		}else{
		 if (bluetoothSocket.isConnected()) {
			if(BAdapter.isEnabled()){
				console.log('xxxxx ' + device);
				outputStream = bluetoothSocket.getOutputStream();
				plus.android.importClass(outputStream);
			 	outputStream.write([0x1B,0x40]);//打印复位
		 		outputStream.write([0x1B,0x24,0x00,0x00]);
		 		outputStream.write([0x1D,0x4C,0x0A,0x0A]);//左边距0x0A
		 		
		 		outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
		 		var str1 = '\n订单号:' + obj.orderNo +'\n\r';
		 		str1 += '下单时间:' + obj.createDate +'\n\r';
		 		str1 += '联系人:' + obj.pickupPop +'\n\r';
		 		str1 += '电话:' + obj.pickupPhone +'\n\r';
		 		str1 += '收货地址:' + obj.userAddressee.addressee + '\n\r';
		 		var bytes1 = plus.android.invoke(str1, 'getBytes', 'GBK');
		 		outputStream.write(bytes1);
		 		outputStream.flush();
		 
		 		outputStream.write([ 0x1D, 0x21, 0x11]);//字体[0x1D, 0X21, n]放大两倍
		 		var str2 = '门牌号:' + obj.userAddressee.doorNumber + '\n\r';
		 		var bytes2 = plus.android.invoke(str2, 'getBytes', 'GBK');
		 		outputStream.write(bytes2);
		 		outputStream.flush();
		 		
		 		for (let j = 0; j < obj.orderInfoCartList.length; j++) {
		 		  const res = obj.orderInfoCartList[j];
		 		  outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
		 		  var str3 = '物件'+ (j+1) +':\n\r';
		 		  var bytes3 = plus.android.invoke(str3, 'getBytes', 'GBK');
		 		  outputStream.write(bytes3);
		 		  outputStream.flush();
		 		  
		 		  outputStream.write([ 0x1D, 0x21, 0x11]);//字体[0x1D, 0X21, n]放大两倍
		 		  str4 = '取件码:' + res.pickupCode +'\n\r';
		 		  var bytes4 = plus.android.invoke(str4, 'getBytes', 'GBK');
		 		  outputStream.write(bytes4);
		 		  outputStream.flush();
		 		  
		 		  outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
		 		  str5 = '物件重量:' + res.weightValue +'\n\r';
		 		  str5 += '备注:' + res.remarks +'\n\r';
		 		  var bytes5 = plus.android.invoke(str5, 'getBytes', 'GBK');
		 		  outputStream.write(bytes5);
		 		  outputStream.flush();
		 		}
			 		
		 		outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
		 		var str6 ='取件地址:' + obj.pickupAddress +'\n\r';
				var bytes6 = plus.android.invoke(str6, 'getBytes', 'GBK');
				outputStream.write(bytes6);
				outputStream.flush();
				
				outputStream.write([0x1b, 0x61, 0x01]);//居中
				outputStream.write([ 0x1D, 0x21, 0x00]);//字体[0x1D, 0X21, n]
				var endStr = '\n***END***\n'
				outputStream.write(plus.android.invoke(endStr, 'getBytes', 'gbk'))
				outputStream.write(plus.android.invoke('\n', 'getBytes', 'gbk'))
				outputStream.flush();
			}
		}else{
		 mui.toast('请连接蓝牙')
		 return false;
	 }	 
  }
}

如果需要全部的源码,可以评论留下你的邮件地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章