@[搜索蓝牙打印机函数]
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 + "" + bleId + "";
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
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 页面
mui.init();
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;
}

连接打印机

正在初始化...



未配对蓝牙设备



已配对蓝牙设备



(function() {
//连接打印机函数
mui.plusReady(function() {
//调用蓝牙搜索
SearchBluetooth.Init();
});
})();
//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();