310 lines
11 KiB
JavaScript
310 lines
11 KiB
JavaScript
//address=""搜索蓝牙//address=设备mac地址,自动配对给出mac地址的设备 安卓
|
||
var BleDevice
|
||
var device = null,
|
||
BAdapter = null,
|
||
BluetoothAdapter = null,
|
||
uuid = null,
|
||
main = null,
|
||
UUID = null,
|
||
bluetoothSocket = null,
|
||
num = 0;
|
||
// 开始gps定位
|
||
function getLocationManager(callback) {
|
||
plus.android.requestPermissions(
|
||
['android.permission.ACCESS_FINE_LOCATION'],
|
||
function(resultObj) {
|
||
var result = 0;
|
||
for (var i = 0; i < resultObj.granted.length; i++) {
|
||
var grantedPermission = resultObj.granted[i]; // 以获取的权限
|
||
result = 1;
|
||
}
|
||
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
|
||
var deniedPresentPermission = resultObj.deniedPresent[i]; // 拒绝本次申请的权限
|
||
num += 1;
|
||
result = 0;
|
||
}
|
||
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
|
||
var deniedAlwaysPermission = resultObj.deniedAlways[i]; // 永久拒绝的权限
|
||
num += 1;
|
||
result = -1;
|
||
}
|
||
// 权限被拒绝,则打开app 设置界面,可以再app设置界面打开相应权限
|
||
if (result !== 1) {
|
||
const Intent = plus.android.importClass("android.content.Intent");
|
||
const Settings = plus.android.importClass("android.provider.Settings");
|
||
const Uri = plus.android.importClass("android.net.Uri");
|
||
var mainActivity = plus.android.runtimeMainActivity();
|
||
const intent = new Intent();
|
||
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
|
||
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
|
||
intent.setData(uri);
|
||
mainActivity.startActivity(intent);
|
||
} else {
|
||
// 因为安卓手机,授权之后还需要打开定位服务功能 当手机授权之后 调用下面的方法
|
||
var context = plus.android.importClass("android.content.Context");
|
||
var locationManager = plus.android.importClass("android.location.LocationManager");
|
||
var main = plus.android.runtimeMainActivity();
|
||
var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
|
||
var gps = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
|
||
var agps = mainSvr.isProviderEnabled(locationManager.NETWORK_PROVIDER);
|
||
// 只有两个:gps开关和agps开关都是关的情况才算关,有一个开就认为是开
|
||
if (gps || agps) {
|
||
startBluetoothDiscovery(callback); // 目前发现 荣耀需要弹框允许蓝牙权限 否则无法搜索即使打开蓝牙也没用
|
||
} else {
|
||
uni.showModal({
|
||
title: "提示",
|
||
content: "请授权位置获取附近的蓝牙设备",
|
||
showCancel: false,
|
||
success() {
|
||
if (!mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER)) {
|
||
var Intent = plus.android.importClass("android.content.Intent");
|
||
var Settings = plus.android.importClass("android.provider.Settings");
|
||
var intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
|
||
main.startActivity(intent); // 打开系统设置gps服务页面
|
||
} else {
|
||
startBluetoothDiscovery(callback); // 目前发现 荣耀需要弹框允许蓝牙权限 否则无法搜索即使打开蓝牙也没用
|
||
console.log('定位已开启')
|
||
// uni.showToast({
|
||
// title: '定位已开启',
|
||
// duration: 2000,
|
||
// });
|
||
}
|
||
}
|
||
})
|
||
}
|
||
}
|
||
|
||
|
||
|
||
}
|
||
)
|
||
}
|
||
|
||
function startBluetoothDiscovery(callback) {
|
||
plus.bluetooth.openBluetoothAdapter({
|
||
success: function(e) {
|
||
plus.bluetooth.startBluetoothDevicesDiscovery({
|
||
success: function(e) { callback() },
|
||
fail: function(e) { console.log('失败2') }
|
||
});
|
||
},
|
||
fail: function(e) {
|
||
console.log('open failed: ' + JSON.stringify(e));
|
||
}
|
||
});
|
||
}
|
||
// 搜索设备
|
||
function searchDevices(address = '', vlist1 = [], vlist2 = []) {
|
||
//注册类
|
||
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");
|
||
BAdapter = BluetoothAdapter.getDefaultAdapter();
|
||
// 没有开启蓝牙
|
||
if (!BAdapter.isEnabled()) {
|
||
uni.showToast({
|
||
title: '请开启蓝牙',
|
||
duration: 2000,
|
||
icon: 'error'
|
||
});
|
||
return;
|
||
}
|
||
console.log("开始搜索设备");
|
||
var filter = new IntentFilter();
|
||
var bdevice = new BluetoothDevice();
|
||
var on = null;
|
||
var un = null;
|
||
let titleStr = '正在搜索请稍候';
|
||
if (address) {
|
||
titleStr = '正在连接蓝牙';
|
||
}
|
||
uni.showLoading({
|
||
title: titleStr
|
||
});
|
||
BAdapter.startDiscovery(); //开启搜索
|
||
var receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
|
||
onReceive: function(context, intent) { //实现onReceiver回调函数
|
||
plus.android.importClass(context);
|
||
plus.android.importClass(intent); //通过intent实例引入intent类,方便以后的‘.’操作
|
||
if (intent.getAction() === "android.bluetooth.adapter.action.DISCOVERY_FINISHED") {
|
||
main.unregisterReceiver(receiver); //取消监听
|
||
uni.hideLoading(); // 默认12秒
|
||
// console.log("搜索结束")
|
||
} else {
|
||
BleDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
|
||
const name = BleDevice.getName();
|
||
const n_address = BleDevice.getAddress();
|
||
console.log('====<<<', name, n_address);
|
||
//判断是否配对
|
||
if (BleDevice.getBondState() === bdevice.BOND_NONE && name=='T58') {
|
||
//参数如果跟取得的mac地址一样就配对
|
||
if (address === BleDevice.getAddress()) {
|
||
if (BleDevice.createBond()) { //配对命令.createBond()
|
||
vlist2.push({ name, address: BleDevice.getAddress() });
|
||
BAdapter.cancelDiscovery(); //取消扫描
|
||
// main.unregisterReceiver(receiver);//取消监听
|
||
uni.hideLoading(); //
|
||
}
|
||
} else {
|
||
if (name !== null && name !== on && n_address == BleDevice.getAddress()) { //判断防止重复添加
|
||
on = name || '未知设备';
|
||
vlist1.push({ name: on, address: BleDevice.getAddress() })
|
||
uni.hideLoading();
|
||
// if (name === 'T58') { //判断连接到T58打印机
|
||
// uni.$emit('connect', {
|
||
// name: 'T58',
|
||
// address: BleDevice.getAddress()
|
||
// });
|
||
// }
|
||
}
|
||
|
||
}
|
||
} else {
|
||
if (name !== un && address == BleDevice.getAddress()) { //判断防止重复添加
|
||
un = name;
|
||
vlist1.push({ name: un, address: BleDevice.getAddress() });
|
||
vlist2.push({ name: un, address: BleDevice.getAddress() });
|
||
uni.hideLoading();
|
||
|
||
if (address === BleDevice.getAddress()) {
|
||
BAdapter.cancelDiscovery(); //取消扫描
|
||
}
|
||
}
|
||
}
|
||
if (name === 'T58') {
|
||
connect(n_address, (e)=>{
|
||
// console.log('连接T58', n_address);
|
||
if(e) {
|
||
uni.$emit('connect', {
|
||
name: 'T58',
|
||
address: n_address
|
||
});
|
||
BAdapter.cancelDiscovery();
|
||
}
|
||
})
|
||
|
||
}
|
||
}
|
||
|
||
}
|
||
});
|
||
filter.addAction(bdevice.ACTION_FOUND);
|
||
filter.addAction(BAdapter.ACTION_DISCOVERY_STARTED);
|
||
filter.addAction(BAdapter.ACTION_DISCOVERY_FINISHED);
|
||
filter.addAction(BAdapter.ACTION_STATE_CHANGED);
|
||
filter.addAction(BluetoothAdapter.ACTION_ACL_DISCONNECTED);
|
||
|
||
main.registerReceiver(receiver, filter); //注册监听
|
||
}
|
||
|
||
const connect = (mac_address, callback)=>{
|
||
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(mac_address);
|
||
plus.android.importClass(device);
|
||
bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
|
||
plus.android.importClass(bluetoothSocket);
|
||
if (!bluetoothSocket.isConnected()) {
|
||
bluetoothSocket.connect();
|
||
}
|
||
setTimeout(()=>{
|
||
if (bluetoothSocket.isConnected()) {
|
||
console.log('已连接=====', mac_address);
|
||
callback(true);
|
||
}
|
||
else {
|
||
console.log('未连接', mac_address);
|
||
callback(false);
|
||
}
|
||
bluetoothSocket.close();
|
||
}, 300)
|
||
}
|
||
|
||
//开始连接打印
|
||
function print(mac_address, data, callback) {
|
||
if (!mac_address) {
|
||
uni.showToast({
|
||
title: '请选择蓝牙设备',
|
||
duration: 2000,
|
||
icon: 'error'
|
||
});
|
||
return;
|
||
}
|
||
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(mac_address);
|
||
plus.android.importClass(device);
|
||
bluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(uuid);
|
||
plus.android.importClass(bluetoothSocket);
|
||
// const isConnected = bluetoothSocket.isConnected();
|
||
// console.log('设备是否连接,',bluetoothSocket.isConnected());
|
||
|
||
console.log('蓝牙', bluetoothSocket.isConnected());
|
||
if (!bluetoothSocket.isConnected()) {
|
||
uni.showToast({
|
||
title: '正在打印小票, 请耐心等待',
|
||
duration: 2000,
|
||
icon: 'none'
|
||
});
|
||
bluetoothSocket.connect();
|
||
}
|
||
|
||
if (bluetoothSocket.isConnected()) {
|
||
const outputStream = bluetoothSocket.getOutputStream();
|
||
plus.android.importClass(outputStream);
|
||
// string 直接传输指令就行 哪个打印机需要的指令就传哪个指令 例子(tSPL):
|
||
// 宽: X800(100mm) 点,高:Y800(100mm)
|
||
// const string2 = `
|
||
// SIZE 100mm, 100mm
|
||
// GAP 3mm, 0mm
|
||
// DIRECTION 1
|
||
// CLS
|
||
// TEXT 291,0,"TSS24.BF2",0,1,1,"货号:0075 0075瑜伽体力库"
|
||
// TEXT 291,40,"TSS24.BF2",0,1,1,"日期:06/30 裁剪:裁剪人"
|
||
// TEXT 291,80,"TSS24.BF2",0,1,1,"编号:952 包号:1"
|
||
// TEXT 291,120,"TSS24.BF2",0,1,1,"床号:91 颜色:白色"
|
||
// TEXT 291,160,"TSS24.BF2",0,1,1,"尺码:S 数量:100"
|
||
// QRCODE 391,200,H,10,A,0,"无效数据-guid"
|
||
// PRINT 1
|
||
// `;
|
||
data.forEach(item => {
|
||
const bytes = plus.android.invoke(item, 'getBytes', 'gbk');
|
||
outputStream.write(bytes);
|
||
});
|
||
setTimeout(function() {
|
||
outputStream.flush(); // 强制把缓冲区内容输出
|
||
device = null //这里关键
|
||
// outputStream.clone(); // 关闭输出流
|
||
bluetoothSocket.close(); //必须关闭蓝牙连接否则意外断开的话打印错误
|
||
callback();
|
||
}, 500)
|
||
} else uni.showModal({
|
||
content: '连接打印机失败,是否重试',
|
||
success: (res) => {
|
||
if (res.confirm) {
|
||
print(mac_address, data, callback)
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
// 关闭操作
|
||
function cancelDiscovery() {
|
||
if (BAdapter) {
|
||
BAdapter.cancelDiscovery(); //取消扫描
|
||
if (bluetoothSocket) {
|
||
bluetoothSocket.close(); //关闭蓝牙连接
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
export { searchDevices, print, getLocationManager, cancelDiscovery } |