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