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;
	 }	 
  }
}

如果需要全部的源碼,可以評論留下你的郵件地址

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