فهرست منبع

refactor(更新) :
- 修改蓝牙连接和写入的连接重试问题

周文健 3 ماه پیش
والد
کامیت
a73a8f0533

+ 6 - 6
app/src/main/java/com/grkj/iscs_mars/ble/BleConnectionManager.kt

@@ -61,7 +61,7 @@ object BleConnectionManager {
     private var isPreparing: Boolean = false
 
     @Volatile
-    private var currentConnectingMac: String? = null
+    private var currentConnectingMac: MutableList<String> = mutableListOf()
 
     /**
      * 注册连接监听:
@@ -88,7 +88,7 @@ object BleConnectionManager {
             unregisterConnectListener(mac)
         }
         // 重复注册检查
-        if (connectListeners.any { it.mac == mac } || currentConnectingMac == mac) {
+        if (connectListeners.any { it.mac == mac } || currentConnectingMac.contains(mac)) {
             LogUtil.w("蓝牙连接-忽略重复注册 mac: $mac")
             callBack?.invoke(false, null)
             return
@@ -127,7 +127,7 @@ object BleConnectionManager {
     fun unregisterConnectListener(mac: String, bleBean: BleBean? = null) {
         LogUtil.i("蓝牙连接-unregisterConnectListener : $mac")
         connectListeners.removeAll { it.mac == mac }
-        currentConnectingMac = ""
+        currentConnectingMac.removeIf { it == mac }
     }
 
     /**
@@ -150,7 +150,7 @@ object BleConnectionManager {
             return
         }
         val listener = connectListeners.first()
-        currentConnectingMac = listener.mac
+        currentConnectingMac.add(listener.mac)
         ThreadUtils.runOnIODelayed(10 * 1000) {
             isPreparing = false
         }
@@ -158,7 +158,7 @@ object BleConnectionManager {
         if (ActivityTracker.getCurrentActivity() == null) {
             LogUtil.w("蓝牙连接-Ignore connectKey : ${listener.mac} no current activity")
             isPreparing = false
-            currentConnectingMac = null
+            currentConnectingMac.removeIf { it == listener.mac }
             return
         }
         prepareBle(
@@ -166,7 +166,7 @@ object BleConnectionManager {
         ) { isDone, bleBean ->
             Executor.runOnMain {
                 isPreparing = false
-                currentConnectingMac = null
+                currentConnectingMac.removeIf { it == listener.mac }
                 if (!isDone) {
                     // 判断是否仍然待连,防止拿走;移到末尾,防止循环影响
                     if (checkProcess(listener.mac, false)) {

+ 42 - 31
app/src/main/java/com/grkj/iscs_mars/ble/BleUtil.kt

@@ -16,6 +16,7 @@ import com.grkj.iscs_mars.ble.BleConst.MTU
 import com.grkj.iscs_mars.ble.BleConst.SERVICE_UUID
 import com.grkj.iscs_mars.extentions.toHexStrings
 import com.grkj.iscs_mars.util.log.LogUtil
+import com.sik.sikcore.thread.ThreadUtils
 
 /**
  * 蓝牙工具类
@@ -40,7 +41,8 @@ class BleUtil private constructor() {
                 .setConnectOverTime(10 * 1000L)
                 .setReConnectCount(3, 300) // 设置重新连接次数和间隔时间,默认为0次,不重连
                 .setSplitWriteNum(500)
-                .operateTimeout = OPERATE_TIMEOUT // 设置操作readRssi、setMtu、write、read、notify、indicate的超时时间(毫秒)
+                .operateTimeout =
+                OPERATE_TIMEOUT // 设置操作readRssi、setMtu、write、read、notify、indicate的超时时间(毫秒)
             if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
                 //Android 12及以上不允许添加过滤器
                 val bleScanRuleConfig = BleScanRuleConfig.Builder()
@@ -102,11 +104,13 @@ class BleUtil private constructor() {
         })
     }
 
-    fun indicate(bleDevice: BleDevice,
-                 serviceUUID: String = SERVICE_UUID,
-                 indicateUUID: String = INDICATE_UUID,
-                 isStart: Boolean = true,
-                 indicateCallback: CustomBleIndicateCallback?) {
+    fun indicate(
+        bleDevice: BleDevice,
+        serviceUUID: String = SERVICE_UUID,
+        indicateUUID: String = INDICATE_UUID,
+        isStart: Boolean = true,
+        indicateCallback: CustomBleIndicateCallback?
+    ) {
         // stopIndicate包含removeIndicateCallback
 //        BleManager.getInstance().removeIndicateCallback(bleDevice, indicateUUID)
         BleManager.getInstance().stopIndicate(bleDevice, serviceUUID, indicateUUID)
@@ -123,7 +127,8 @@ class BleUtil private constructor() {
             return
         }
         if (BleManager.getInstance().isConnected(bleDevice.mac)) {
-            BleManager.getInstance().indicate(bleDevice, serviceUUID, indicateUUID, indicateCallback)
+            BleManager.getInstance()
+                .indicate(bleDevice, serviceUUID, indicateUUID, indicateCallback)
         } else {
             BleManager.getInstance().connect(bleDevice.mac, object : BleGattCallback() {
                 override fun onStartConnect() {}
@@ -132,12 +137,22 @@ class BleUtil private constructor() {
                     indicateCallback?.onConnectPrompt("连接失败!请检查设备是否打开,并尝试重新连接 : $exception")
                 }
 
-                override fun onConnectSuccess(bleDevice: BleDevice, gatt: BluetoothGatt, status: Int) {
+                override fun onConnectSuccess(
+                    bleDevice: BleDevice,
+                    gatt: BluetoothGatt,
+                    status: Int
+                ) {
                     BleManager.getInstance().removeConnectGattCallback(bleDevice)
-                    BleManager.getInstance().indicate(bleDevice, serviceUUID, indicateUUID, indicateCallback)
+                    BleManager.getInstance()
+                        .indicate(bleDevice, serviceUUID, indicateUUID, indicateCallback)
                 }
 
-                override fun onDisConnected(isActiveDisConnected: Boolean, device: BleDevice, gatt: BluetoothGatt, status: Int) {
+                override fun onDisConnected(
+                    isActiveDisConnected: Boolean,
+                    device: BleDevice,
+                    gatt: BluetoothGatt,
+                    status: Int
+                ) {
                     BleManager.getInstance().removeConnectGattCallback(device)
                     indicateCallback?.onDisConnectPrompt("连接断开!请检查硬件状态,并尝试重新连接!")
                 }
@@ -146,11 +161,12 @@ class BleUtil private constructor() {
     }
 
 
-    fun write(bleDevice: BleDevice,
-              serviceUUID: String = SERVICE_UUID,
-              writeUUID: String = INDICATE_UUID,
-              cmd: ByteArray?,
-              writeCallback: CustomBleWriteCallback?
+    fun write(
+        bleDevice: BleDevice,
+        serviceUUID: String = SERVICE_UUID,
+        writeUUID: String = INDICATE_UUID,
+        cmd: ByteArray?,
+        writeCallback: CustomBleWriteCallback?
     ) {
         LogUtil.i("ble_write : ${cmd?.toHexStrings()}")
         cmd ?: return
@@ -166,23 +182,18 @@ class BleUtil private constructor() {
         if (BleManager.getInstance().isConnected(bleDevice.mac)) {
             BleManager.getInstance().write(bleDevice, serviceUUID, writeUUID, cmd, writeCallback)
         } else {
-            BleManager.getInstance().connect(bleDevice.mac, object : BleGattCallback() {
-                override fun onStartConnect() {}
-                override fun onConnectFail(bleDevice: BleDevice, exception: BleException) {
-                    BleManager.getInstance().removeConnectGattCallback(bleDevice)
-                    writeCallback?.onConnectPrompt("连接失败!请检查设备是否打开,并尝试重新连接 : $exception")
+            fun checkAndWrite() {
+                ThreadUtils.runOnIO {
+                    val isConnect = BleConnectionManager.tryConnectWithOptionalCharge(bleDevice.mac)
+                    if (isConnect) {
+                        BleManager.getInstance()
+                            .write(bleDevice, serviceUUID, writeUUID, cmd, writeCallback)
+                    } else {
+                        checkAndWrite()
+                    }
                 }
-
-                override fun onConnectSuccess(bleDevice: BleDevice, gatt: BluetoothGatt, status: Int) {
-                    BleManager.getInstance().removeConnectGattCallback(bleDevice)
-                    BleManager.getInstance().write(bleDevice, serviceUUID, writeUUID, cmd, writeCallback)
-                }
-
-                override fun onDisConnected(isActiveDisConnected: Boolean, device: BleDevice, gatt: BluetoothGatt, status: Int) {
-                    BleManager.getInstance().removeConnectGattCallback(device)
-                    writeCallback?.onDisConnectPrompt("连接断开!请检查硬件状态,并尝试重新连接!")
-                }
-            })
+            }
+            checkAndWrite()
         }
     }
 }