|
@@ -27,6 +27,7 @@ import com.grkj.iscs.util.log.LogUtil
|
|
|
import com.grkj.iscs.view.base.BaseActivity
|
|
import com.grkj.iscs.view.base.BaseActivity
|
|
|
import com.sik.sikcore.activity.ActivityTracker
|
|
import com.sik.sikcore.activity.ActivityTracker
|
|
|
import com.sik.sikcore.thread.ThreadUtils
|
|
import com.sik.sikcore.thread.ThreadUtils
|
|
|
|
|
+import kotlinx.coroutines.delay
|
|
|
import pub.devrel.easypermissions.AfterPermissionGranted
|
|
import pub.devrel.easypermissions.AfterPermissionGranted
|
|
|
import java.util.LinkedList
|
|
import java.util.LinkedList
|
|
|
|
|
|
|
@@ -62,28 +63,42 @@ object BleConnectionManager {
|
|
|
* - 如果 mac 已在待连接队列或正在连接,忽略重复请求
|
|
* - 如果 mac 已在待连接队列或正在连接,忽略重复请求
|
|
|
* - 否则将 mac 添加到队列并触发连接流程
|
|
* - 否则将 mac 添加到队列并触发连接流程
|
|
|
*/
|
|
*/
|
|
|
- fun registerConnectListener(mac: String, callBack: ((Boolean, BleBean?) -> Unit)? = null) {
|
|
|
|
|
|
|
+ fun registerConnectListener(
|
|
|
|
|
+ mac: String,
|
|
|
|
|
+ connectNow: Boolean = false,
|
|
|
|
|
+ callBack: ((Boolean, BleBean?) -> Unit)? = null
|
|
|
|
|
+ ) {
|
|
|
LogUtil.i("蓝牙连接-开始连接 : $mac")
|
|
LogUtil.i("蓝牙连接-开始连接 : $mac")
|
|
|
// 已连接且已获取 token
|
|
// 已连接且已获取 token
|
|
|
deviceList.find {
|
|
deviceList.find {
|
|
|
it.bleDevice.mac == mac && BleManager.getInstance().isConnected(mac) && it.token != null
|
|
it.bleDevice.mac == mac && BleManager.getInstance().isConnected(mac) && it.token != null
|
|
|
}?.let { bean ->
|
|
}?.let { bean ->
|
|
|
|
|
+ LogUtil.i("蓝牙连接-设备已连接")
|
|
|
callBack?.invoke(true, bean)
|
|
callBack?.invoke(true, bean)
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
|
|
+ if (connectNow) {
|
|
|
|
|
+ unregisterConnectListener(mac)
|
|
|
|
|
+ }
|
|
|
// 重复注册检查
|
|
// 重复注册检查
|
|
|
if (connectListeners.any { it.mac == mac } || currentConnectingMac == mac) {
|
|
if (connectListeners.any { it.mac == mac } || currentConnectingMac == mac) {
|
|
|
LogUtil.w("蓝牙连接-忽略重复注册 mac: $mac")
|
|
LogUtil.w("蓝牙连接-忽略重复注册 mac: $mac")
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
|
// 加入队列并启动连接
|
|
// 加入队列并启动连接
|
|
|
- fun checkAndConnect() {
|
|
|
|
|
|
|
+ fun checkAndConnect(isDisconnectAll: Boolean = false) {
|
|
|
if (BleManager.getInstance().allConnectedDevice.size < maxConnectCount) {
|
|
if (BleManager.getInstance().allConnectedDevice.size < maxConnectCount) {
|
|
|
connectListeners.add(ConnectListener(mac, callBack))
|
|
connectListeners.add(ConnectListener(mac, callBack))
|
|
|
connectKey()
|
|
connectKey()
|
|
|
} else {
|
|
} else {
|
|
|
- ThreadUtils.runOnIODelayed(500) {
|
|
|
|
|
- checkAndConnect()
|
|
|
|
|
|
|
+ if (connectNow && !isDisconnectAll) {
|
|
|
|
|
+ LogUtil.i("蓝牙连接-超过最大连接数,但是需要立即连接,断开所有连接进行连接")
|
|
|
|
|
+ BleManager.getInstance().disconnectAllDevice()
|
|
|
|
|
+ checkAndConnect(true)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ThreadUtils.runOnIODelayed(500) {
|
|
|
|
|
+ checkAndConnect()
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -101,9 +116,9 @@ object BleConnectionManager {
|
|
|
/**
|
|
/**
|
|
|
* 检查是否能进行蓝牙连接准备的下一步,防止未准备完但是已经取消订阅
|
|
* 检查是否能进行蓝牙连接准备的下一步,防止未准备完但是已经取消订阅
|
|
|
*/
|
|
*/
|
|
|
- private fun checkProcess(mac: String?): Boolean {
|
|
|
|
|
|
|
+ private fun checkProcess(mac: String?, hideLoading: Boolean = true): Boolean {
|
|
|
val canProcess = connectListeners.any { it.mac == mac }
|
|
val canProcess = connectListeners.any { it.mac == mac }
|
|
|
- if (!canProcess) sendLoadingEventMsg(null, false)
|
|
|
|
|
|
|
+ if (!canProcess&&hideLoading) sendLoadingEventMsg(null, false)
|
|
|
return canProcess
|
|
return canProcess
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -113,6 +128,7 @@ object BleConnectionManager {
|
|
|
private fun connectKey() {
|
|
private fun connectKey() {
|
|
|
if (connectListeners.isEmpty()) return
|
|
if (connectListeners.isEmpty()) return
|
|
|
if (isPreparing || BleManager.getInstance().allConnectedDevice.size >= maxStandbyCount) {
|
|
if (isPreparing || BleManager.getInstance().allConnectedDevice.size >= maxStandbyCount) {
|
|
|
|
|
+ LogUtil.i("暂时不能连接:${isPreparing},${BleManager.getInstance().allConnectedDevice.size >= maxStandbyCount}")
|
|
|
Executor.delayOnMain(1000) { connectKey() }
|
|
Executor.delayOnMain(1000) { connectKey() }
|
|
|
return
|
|
return
|
|
|
}
|
|
}
|
|
@@ -134,13 +150,15 @@ object BleConnectionManager {
|
|
|
if (!isDone) {
|
|
if (!isDone) {
|
|
|
// 判断是否仍然待连,防止拿走;移到末尾,防止循环影响
|
|
// 判断是否仍然待连,防止拿走;移到末尾,防止循环影响
|
|
|
if (checkProcess(listener.mac)) {
|
|
if (checkProcess(listener.mac)) {
|
|
|
|
|
+ listener.callBack?.invoke(false, null)
|
|
|
unregisterConnectListener(listener.mac)
|
|
unregisterConnectListener(listener.mac)
|
|
|
- Executor.delayOnMain(2000) {
|
|
|
|
|
- registerConnectListener(
|
|
|
|
|
- listener.mac,
|
|
|
|
|
- listener.callBack
|
|
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
|
|
+// Executor.delayOnMain(2000) {
|
|
|
|
|
+// registerConnectListener(
|
|
|
|
|
+// listener.mac,
|
|
|
|
|
+// false,
|
|
|
|
|
+// listener.callBack
|
|
|
|
|
+// )
|
|
|
|
|
+// }
|
|
|
}
|
|
}
|
|
|
return@runOnMain
|
|
return@runOnMain
|
|
|
}
|
|
}
|
|
@@ -214,6 +232,7 @@ object BleConnectionManager {
|
|
|
BleUtil.instance?.scan(object : CustomBleScanCallback() {
|
|
BleUtil.instance?.scan(object : CustomBleScanCallback() {
|
|
|
override fun onPrompt(promptStr: String?) {
|
|
override fun onPrompt(promptStr: String?) {
|
|
|
// 蓝牙未启动重试
|
|
// 蓝牙未启动重试
|
|
|
|
|
+ LogUtil.i("蓝牙连接-参数:${promptStr}")
|
|
|
BleManager.getInstance().enableBluetooth()
|
|
BleManager.getInstance().enableBluetooth()
|
|
|
doScanBle(mac, isNeedLoading, prepareDoneCallBack)
|
|
doScanBle(mac, isNeedLoading, prepareDoneCallBack)
|
|
|
}
|
|
}
|
|
@@ -231,9 +250,14 @@ object BleConnectionManager {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
override fun onScanning(bleDevice: BleDevice?) {
|
|
override fun onScanning(bleDevice: BleDevice?) {
|
|
|
- LogUtil.i("蓝牙连接-onScanning:${bleDevice?.mac}")
|
|
|
|
|
- bleDevice?.let {
|
|
|
|
|
- doConnect(it, isNeedLoading, prepareDoneCallBack)
|
|
|
|
|
|
|
+ val mac = bleDevice?.mac ?: return
|
|
|
|
|
+ LogUtil.i("蓝牙连接-onScanning:$mac")
|
|
|
|
|
+ if (mac.equals(mac, ignoreCase = true)) {
|
|
|
|
|
+ // 找到目标设备,马上停止扫描
|
|
|
|
|
+ LogUtil.i("找到目标设备 $mac,停止扫描并尝试连接")
|
|
|
|
|
+ BleManager.getInstance().cancelScan()
|
|
|
|
|
+ // 立刻调用 doConnect,下一步进入连接流程
|
|
|
|
|
+ doConnect(bleDevice, isNeedLoading, prepareDoneCallBack)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -247,7 +271,6 @@ object BleConnectionManager {
|
|
|
// 没有扫描到
|
|
// 没有扫描到
|
|
|
if (scanResultList?.none { it.mac == mac } == true) {
|
|
if (scanResultList?.none { it.mac == mac } == true) {
|
|
|
LogUtil.w("$mac is not scanned")
|
|
LogUtil.w("$mac is not scanned")
|
|
|
- BusinessManager.unregisterConnectListener(mac)
|
|
|
|
|
prepareDoneCallBack?.invoke(false, null)
|
|
prepareDoneCallBack?.invoke(false, null)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -273,97 +296,105 @@ object BleConnectionManager {
|
|
|
LoadingMsg(true, CommonUtils.getStr(R.string.ble_connecting), null)
|
|
LoadingMsg(true, CommonUtils.getStr(R.string.ble_connecting), null)
|
|
|
)
|
|
)
|
|
|
)
|
|
)
|
|
|
- BleManager.getInstance().disconnect(bleDevice)
|
|
|
|
|
- BleUtil.instance?.connectBySelect(
|
|
|
|
|
- bleDevice, object : CustomBleGattCallback() {
|
|
|
|
|
- override fun onPrompt(promptStr: String?) {
|
|
|
|
|
- if (isNeedLoading) sendEventMsg(
|
|
|
|
|
- MsgEvent(
|
|
|
|
|
- MSG_EVENT_LOADING, LoadingMsg(false, promptStr, null)
|
|
|
|
|
|
|
+ ThreadUtils.runOnIO {
|
|
|
|
|
+ BleManager.getInstance().disconnect(bleDevice)
|
|
|
|
|
+ delay(300)
|
|
|
|
|
+ BleUtil.instance?.connectBySelect(
|
|
|
|
|
+ bleDevice, object : CustomBleGattCallback() {
|
|
|
|
|
+ override fun onPrompt(promptStr: String?) {
|
|
|
|
|
+ if (isNeedLoading) sendEventMsg(
|
|
|
|
|
+ MsgEvent(
|
|
|
|
|
+ MSG_EVENT_LOADING, LoadingMsg(false, promptStr, null)
|
|
|
|
|
+ )
|
|
|
)
|
|
)
|
|
|
- )
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- override fun onStartConnect() {}
|
|
|
|
|
|
|
+ override fun onStartConnect() {}
|
|
|
|
|
|
|
|
- override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
|
|
|
|
|
- if (isNeedLoading) sendEventMsg(
|
|
|
|
|
- MsgEvent(
|
|
|
|
|
- MSG_EVENT_LOADING,
|
|
|
|
|
- LoadingMsg(false, CommonUtils.getStr(R.string.ble_connect_fail), false)
|
|
|
|
|
|
|
+ override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
|
|
|
|
|
+ if (isNeedLoading) sendEventMsg(
|
|
|
|
|
+ MsgEvent(
|
|
|
|
|
+ MSG_EVENT_LOADING,
|
|
|
|
|
+ LoadingMsg(
|
|
|
|
|
+ false,
|
|
|
|
|
+ CommonUtils.getStr(R.string.ble_connect_fail),
|
|
|
|
|
+ false
|
|
|
|
|
+ )
|
|
|
|
|
+ )
|
|
|
)
|
|
)
|
|
|
- )
|
|
|
|
|
- LogUtil.e("蓝牙连接-onConnectFail : ${bleDevice?.mac} - ${exception?.description}")
|
|
|
|
|
- prepareDoneCallBack?.invoke(false, null)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ LogUtil.e("蓝牙连接-onConnectFail : ${bleDevice?.mac} - ${exception?.description}")
|
|
|
|
|
+ prepareDoneCallBack?.invoke(false, null)
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- override fun onConnectSuccess(
|
|
|
|
|
- bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int
|
|
|
|
|
- ) {
|
|
|
|
|
- if (isNeedLoading) sendEventMsg(
|
|
|
|
|
- MsgEvent(
|
|
|
|
|
- MSG_EVENT_LOADING, LoadingMsg(false, null, null)
|
|
|
|
|
|
|
+ override fun onConnectSuccess(
|
|
|
|
|
+ bleDevice: BleDevice?, gatt: BluetoothGatt?, status: Int
|
|
|
|
|
+ ) {
|
|
|
|
|
+ if (isNeedLoading) sendEventMsg(
|
|
|
|
|
+ MsgEvent(
|
|
|
|
|
+ MSG_EVENT_LOADING, LoadingMsg(false, null, null)
|
|
|
|
|
+ )
|
|
|
)
|
|
)
|
|
|
- )
|
|
|
|
|
- LogUtil.i("蓝牙连接-onConnectSuccess : ${bleDevice?.mac}")
|
|
|
|
|
- bleDevice?.let {
|
|
|
|
|
- deviceList.removeIf { it.bleDevice.mac == bleDevice.mac }
|
|
|
|
|
- val bleBean = BleBean(it)
|
|
|
|
|
- deviceList.add(bleBean)
|
|
|
|
|
- removeExceptionKey(it.mac)
|
|
|
|
|
- // 设置MTU
|
|
|
|
|
- Executor.delayOnMain(200) {
|
|
|
|
|
- if (!checkProcess(bleDevice.mac)) {
|
|
|
|
|
- LogUtil.e("Prepare is canceled : ${bleDevice.mac}")
|
|
|
|
|
- return@delayOnMain
|
|
|
|
|
|
|
+ LogUtil.i("蓝牙连接-onConnectSuccess : ${bleDevice?.mac}")
|
|
|
|
|
+ bleDevice?.let {
|
|
|
|
|
+ deviceList.removeIf { it.bleDevice.mac == bleDevice.mac }
|
|
|
|
|
+ val bleBean = BleBean(it)
|
|
|
|
|
+ deviceList.add(bleBean)
|
|
|
|
|
+ removeExceptionKey(it.mac)
|
|
|
|
|
+ // 设置MTU
|
|
|
|
|
+ Executor.delayOnMain(200) {
|
|
|
|
|
+ if (!checkProcess(bleDevice.mac)) {
|
|
|
|
|
+ LogUtil.e("Prepare is canceled : ${bleDevice.mac}")
|
|
|
|
|
+ return@delayOnMain
|
|
|
|
|
+ }
|
|
|
|
|
+ BleUtil.instance?.setMtu(it)
|
|
|
|
|
+ }
|
|
|
|
|
+ // 监听
|
|
|
|
|
+ Executor.delayOnMain(500) {
|
|
|
|
|
+ indicate(bleBean, isNeedLoading, prepareDoneCallBack)
|
|
|
}
|
|
}
|
|
|
- BleUtil.instance?.setMtu(it)
|
|
|
|
|
- }
|
|
|
|
|
- // 监听
|
|
|
|
|
- Executor.delayOnMain(500) {
|
|
|
|
|
- indicate(bleBean, isNeedLoading, prepareDoneCallBack)
|
|
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- override fun onDisConnected(
|
|
|
|
|
- isActiveDisConnected: Boolean,
|
|
|
|
|
- device: BleDevice?,
|
|
|
|
|
- gatt: BluetoothGatt?,
|
|
|
|
|
- status: Int
|
|
|
|
|
- ) {
|
|
|
|
|
- if (isNeedLoading) sendEventMsg(
|
|
|
|
|
- MsgEvent(
|
|
|
|
|
- MSG_EVENT_LOADING, LoadingMsg(false, null, false)
|
|
|
|
|
|
|
+ override fun onDisConnected(
|
|
|
|
|
+ isActiveDisConnected: Boolean,
|
|
|
|
|
+ device: BleDevice?,
|
|
|
|
|
+ gatt: BluetoothGatt?,
|
|
|
|
|
+ status: Int
|
|
|
|
|
+ ) {
|
|
|
|
|
+ if (isNeedLoading) sendEventMsg(
|
|
|
|
|
+ MsgEvent(
|
|
|
|
|
+ MSG_EVENT_LOADING, LoadingMsg(false, null, false)
|
|
|
|
|
+ )
|
|
|
)
|
|
)
|
|
|
- )
|
|
|
|
|
- LogUtil.i("蓝牙连接-onDisConnected : ${device?.mac} - $isActiveDisConnected")
|
|
|
|
|
- getBleDeviceByMac(device?.mac)?.let {
|
|
|
|
|
- deviceList.remove(it)
|
|
|
|
|
- }
|
|
|
|
|
- bleDevice.mac?.let { itMac ->
|
|
|
|
|
- unregisterConnectListener(itMac)
|
|
|
|
|
- }
|
|
|
|
|
- if (!isActiveDisConnected) {
|
|
|
|
|
- // 测试模式下不重连
|
|
|
|
|
- if (isTestMode) {
|
|
|
|
|
- return
|
|
|
|
|
|
|
+ LogUtil.i("蓝牙连接-onDisConnected : ${device?.mac} - $isActiveDisConnected")
|
|
|
|
|
+ getBleDeviceByMac(device?.mac)?.let {
|
|
|
|
|
+ deviceList.remove(it)
|
|
|
|
|
+ it.token = null
|
|
|
}
|
|
}
|
|
|
- // 断开和重连之间最好间隔一段时间,否则可能会出现长时间连接不上的情况
|
|
|
|
|
- Executor.delayOnMain(300) {
|
|
|
|
|
- registerConnectListener(bleDevice.mac) { isDone, bleBean ->
|
|
|
|
|
- if (isDone && bleBean != null) {
|
|
|
|
|
- Executor.delayOnMain(300) {
|
|
|
|
|
- getCurrentStatus(6, bleBean.bleDevice)
|
|
|
|
|
|
|
+ bleDevice.mac?.let { itMac ->
|
|
|
|
|
+ unregisterConnectListener(itMac)
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!isActiveDisConnected) {
|
|
|
|
|
+ // 测试模式下不重连
|
|
|
|
|
+ if (isTestMode) {
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ // 断开和重连之间最好间隔一段时间,否则可能会出现长时间连接不上的情况
|
|
|
|
|
+ Executor.delayOnMain(300) {
|
|
|
|
|
+ registerConnectListener(bleDevice.mac) { isDone, bleBean ->
|
|
|
|
|
+ if (isDone && bleBean != null) {
|
|
|
|
|
+ Executor.delayOnMain(300) {
|
|
|
|
|
+ getCurrentStatus(6, bleBean.bleDevice)
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ ModBusController.updateKeyReadyStatus(bleDevice.mac, false, 3)
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
- ModBusController.updateKeyReadyStatus(bleDevice.mac, false, 3)
|
|
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|