由於所在公司產品需要一個騎手端自動接單,接單後自動打印小票的功能,所以將原有的公衆號做成了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;
}
}
}
如果需要全部的源碼,可以評論留下你的郵件地址