由于所在公司产品需要一个骑手端自动接单,接单后自动打印小票的功能,所以将原有的公众号做成了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>
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;
}
}
}
如果需要全部的源码,可以评论留下你的邮件地址