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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//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}