342 lines
12 KiB
JavaScript
342 lines
12 KiB
JavaScript
|
//搜索蓝牙打印机函数
|
|||
|
var SearchBluetooth = function() {
|
|||
|
/*dom变量定义*/
|
|||
|
var BluetoothBtn = document.getElementById("BluetoothBtn"), //最下边的按钮
|
|||
|
unpairedList = document.getElementById("unpairedList"), //未配对设备列表
|
|||
|
pairedList = document.getElementById("pairedList"), //已配对设备列表
|
|||
|
loadImgHtml = '<img src="images/ring.gif" class="loadImg"/>'; //加载图像HTML
|
|||
|
|
|||
|
/*plus变量定义*/
|
|||
|
var main, BluetoothAdapter, BAdapter, IntentFilter, BluetoothDevice, receiver , receiverStart;
|
|||
|
|
|||
|
/*其他定义*/
|
|||
|
var isSearchDevices = false, //是否处于搜索状态
|
|||
|
savedBleId = localStorage.getItem("bleId"), //缓存的设备ID
|
|||
|
IntervalObj, //定时器对象
|
|||
|
BleDeviceObjAry = [], //BleDevice对象数组
|
|||
|
debug = true; //调试模式
|
|||
|
|
|||
|
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.CheckPermissions();
|
|||
|
},
|
|||
|
|
|||
|
CheckPermissions: function() {
|
|||
|
var self = this;
|
|||
|
plus.android.requestPermissions(['android.permission.ACCESS_FINE_LOCATION','android.permission.ACCESS_COARSE_LOCATION',
|
|||
|
'android.permission.BLUETOOTH','android.permission.BLUETOOTH_ADMIN'], function(e){
|
|||
|
if(e.deniedAlways.length>0){ //权限被永久拒绝
|
|||
|
// 弹出提示框解释为何需要定位权限,引导用户打开设置页面开启
|
|||
|
debug && console.log("获取失败,权限被永久拒绝...");
|
|||
|
}
|
|||
|
if(e.deniedPresent.length>0){ //权限被临时拒绝
|
|||
|
// 弹出提示框解释为何需要定位权限,可再次调用plus.android.requestPermissions申请权限
|
|||
|
debug && console.log("获取失败,权限被临时拒绝...");
|
|||
|
}
|
|||
|
if(e.granted.length>0){ //权限被允许
|
|||
|
debug && console.log("获取权限成功,调用搜索...");
|
|||
|
//调用依赖获取权限的代码
|
|||
|
self.CheckBluetoothState();
|
|||
|
self.EventInit();
|
|||
|
}
|
|||
|
}, function(e){
|
|||
|
console.log('Request Permissions error:'+JSON.stringify(e));
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
//事件绑定
|
|||
|
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);
|
|||
|
} 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;
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
//检测蓝牙状态
|
|||
|
CheckBluetoothState: function() {
|
|||
|
var self = this;
|
|||
|
var filter = new IntentFilter();
|
|||
|
receiverStart = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
|
|||
|
onReceive: onReceiveStart
|
|||
|
});
|
|||
|
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
|
|||
|
main.registerReceiver(receiverStart, filter); //注册监听事件
|
|||
|
|
|||
|
//监听回调函数
|
|||
|
function onReceiveStart(context, intent) {
|
|||
|
plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作
|
|||
|
var state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,
|
|||
|
BluetoothAdapter.ERROR)
|
|||
|
if(state === BluetoothAdapter.STATE_ON) {
|
|||
|
debug && console.log("检测到蓝牙开启,准备搜索蓝牙设备...");
|
|||
|
self.SearchDevices();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
if(!BAdapter.isEnabled()) {
|
|||
|
var AlertDialog = plus.android.importClass('android.app.AlertDialog');
|
|||
|
var adb = plus.android.newObject("android.app.AlertDialog$Builder",plus.android.runtimeMainActivity());
|
|||
|
adb.setTitle("蓝牙处于关闭状态,是否打开?");
|
|||
|
var listener = plus.android.implements('android.content.DialogInterface$OnClickListener',{
|
|||
|
onClick:function(dialog,which){
|
|||
|
BAdapter.enable();
|
|||
|
debug && console.log("蓝牙处于关闭状态,正在打开...");
|
|||
|
}
|
|||
|
|
|||
|
});
|
|||
|
|
|||
|
adb.setPositiveButton("确定",listener);
|
|||
|
adb.setNegativeButton("取消",null);
|
|||
|
adb.setCancelable(false);
|
|||
|
adb.show();
|
|||
|
} else {
|
|||
|
self.SearchDevices();
|
|||
|
debug && console.log("蓝牙处于开启状态,准备搜索蓝牙设备...");
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
//搜索设备
|
|||
|
SearchDevices: function() {
|
|||
|
var self = this;
|
|||
|
var arr_mac = [];
|
|||
|
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(arr_mac.indexOf(bleId)>= 0){
|
|||
|
return;
|
|||
|
}
|
|||
|
arr_mac.push(bleId);
|
|||
|
//判断是否配对
|
|||
|
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);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
function isRepeat(arr){
|
|||
|
var hash = {};
|
|||
|
for(var i in arr) {
|
|||
|
if(hash[arr[i]]) //hash 哈希
|
|||
|
return true;
|
|||
|
hash[arr[i]] = true;
|
|||
|
}
|
|||
|
return false;
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
//设置设备列表HTML
|
|||
|
SetpairedListHtml: function(parentEl, bleName, bleId) {
|
|||
|
var li = document.createElement('li');
|
|||
|
li.setAttribute("data-id", bleId);
|
|||
|
li.innerHTML = bleName + "<span>" + bleId + "</span>";
|
|||
|
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");
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}();
|
|||
|
//连接打印机和打印
|
|||
|
function dayin(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);
|
|||
|
|
|||
|
var bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
|
|||
|
plus.android.importClass(bluetoothSocket);
|
|||
|
if(!bluetoothSocket.isConnected()) {
|
|||
|
connectStart = bluetoothSocket.connect();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
var outputStream = bluetoothSocket.getOutputStream();
|
|||
|
plus.android.importClass(outputStream);
|
|||
|
var bytes = [0x1b,0x61,0x01];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x1c,0x21,(0x04|0x08)];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x1b,0x21,0x08];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke('华夏银行', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke('XX支行', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x1c,0x21,0x00];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x1b,0x21,0x00];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke('欢迎您的光临', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke('您的排队号码', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x1b,0x21,(0x08|0x20|0x10)];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke('1006', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x1b,0x21,0x00];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke(' 现有8人在等候,请您到休息厅等候呼叫', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = plus.android.invoke('2019-9-12 10:15:51', 'getBytes', 'gbk');
|
|||
|
outputStream.write(bytes);
|
|||
|
var bytes = [0x0d,0x0a];
|
|||
|
outputStream.write(bytes);
|
|||
|
outputStream.flush();
|
|||
|
|
|||
|
this.closeBtSocket = function() {
|
|||
|
bluetoothSocket.close();
|
|||
|
bluetoothSocket = null;
|
|||
|
device = null;
|
|||
|
};
|
|||
|
};
|
|||
|
};
|