You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
11 KiB
JavaScript

6 months ago
//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,
success:()=>{
setTimeout(function () {
uni.hideLoading();
},5000);
}
});
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();
//判断是否配对
if (BleDevice.getBondState() === bdevice.BOND_NONE) {
//参数如果跟取得的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 ){ //判断防止重复添加
on = name || '未知设备';
vlist1.push({name:on,address:BleDevice.getAddress()})
}
}
} else {
if(name !== un ){ //判断防止重复添加
un = name;
vlist1.push({name:un,address:BleDevice.getAddress()});
vlist2.push({name:un,address:BleDevice.getAddress()});
if (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); //注册监听
}
//开始连接打印
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());
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)
// 宽: X800100mmY800100mm
// 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)
}
}
// 关闭操作
function cancelDiscovery() {
if (BAdapter) {
BAdapter.cancelDiscovery();//取消扫描
if (bluetoothSocket) {
bluetoothSocket.close(); //关闭蓝牙连接
}
}
}
export {searchDevices,print,getLocationManager,cancelDiscovery}