浏览代码

refactor(更新) :
- 修改初始化时的钥匙连接策略,检查状态发现是待机模式并且没有作业票要下发的时候,先看还有没有设备要连接的,有的话直接断开,否则保持连接

周文健 4 月之前
父节点
当前提交
ea0c4d826c

+ 2 - 2
app/build.gradle

@@ -43,7 +43,7 @@ android {
         }
         release {
             minifyEnabled false  // 混淆
-            zipAlignEnabled true // 进行压缩优化
+            zipAlignEnabled false // 进行压缩优化
             shrinkResources false    // 移除无用的resource文件
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
             signingConfig signingConfigs.release
@@ -140,5 +140,5 @@ dependencies {
 
     implementation 'io.github.razerdp:BasePopup:3.2.1'
 
-    implementation 'com.github.SilverIceKey.SIKExtension:SIKCore:1.1.39'
+    implementation 'com.github.SilverIceKey.SIKExtension:SIKCore:1.1.46'
 }

+ 10 - 7
app/src/main/java/com/grkj/iscs/BusinessManager.kt

@@ -354,13 +354,13 @@ object BusinessManager {
             when (dockBean.type) {
                 DOCK_TYPE_KEY -> {
                     dockBean.getKeyList().forEach { keyBean ->
-                        deviceKeyHandler(dockBean,keyBean)
+                        deviceKeyHandler(dockBean, keyBean)
                     }
                 }
 
                 DOCK_TYPE_LOCK -> {
                     dockBean.getLockList().forEach { lockBean ->
-                        deviceLockHandler(dockBean,lockBean)
+                        deviceLockHandler(dockBean, lockBean)
                     }
                 }
 
@@ -374,11 +374,11 @@ object BusinessManager {
                         if (deviceBean.isExist) {
                             when (deviceBean.type) {
                                 DEVICE_TYPE_KEY -> {
-                                    deviceKeyHandler(dockBean,deviceBean as DockBean.KeyBean)
+                                    deviceKeyHandler(dockBean, deviceBean as DockBean.KeyBean)
                                 }
 
                                 DEVICE_TYPE_LOCK -> {
-                                    deviceLockHandler(dockBean,deviceBean as DockBean.LockBean)
+                                    deviceLockHandler(dockBean, deviceBean as DockBean.LockBean)
                                 }
 
                                 DEVICE_TYPE_CARD -> {
@@ -496,7 +496,7 @@ object BusinessManager {
         }
     }
 
-    private fun deviceKeyHandler(dockBean: DockBean,keyBean: DockBean.KeyBean) {
+    private fun deviceKeyHandler(dockBean: DockBean, keyBean: DockBean.KeyBean) {
         if (keyBean.isExist) {
             // 放回钥匙,读取rfid
             ModBusController.readKeyRfid(
@@ -1367,7 +1367,7 @@ object BusinessManager {
             switchReadyMode(bleDevice)
         } else {
             // 上报隔离点状态
-            val keyNfc = ModBusController.getKeyByMac(bleDevice.mac)?.rfid?:"key rfid lost"
+            val keyNfc = ModBusController.getKeyByMac(bleDevice.mac)?.rfid ?: "key rfid lost"
             workTicketGetBO?.data?.forEach { data ->
                 val updateList = mutableListOf<LockPointUpdateReqVO>()
                 data.dataList?.forEach { dataListDTO ->
@@ -1814,7 +1814,10 @@ object BusinessManager {
                             currentModeMsg.bleBean.bleDevice.mac, true, 4
                         )
                         sendLoadingEventMsg(null, false)
-                        //连上之后没有工作票要下发就断开 todo不断开,还钥匙的时候有可能断开全部,原本要锁定仓位,但是会出现快速取出钥匙锁定
+                        //连上之后没有工作票要下发就断开 看是否还有设备等待连接,没有就不断开,有就让路,一般是初始化的时候
+                        if (BleConnectionManager.hasConnectWait()) {
+                            BleManager.getInstance().disconnect(currentModeMsg.bleBean.bleDevice)
+                        }
                     }
                 }
             }

+ 40 - 21
app/src/main/java/com/grkj/iscs/ble/BleConnectionManager.kt

@@ -8,7 +8,6 @@ import com.clj.fastble.exception.BleException
 import com.grkj.iscs.BusinessManager
 import com.grkj.iscs.BusinessManager.deviceList
 import com.grkj.iscs.BusinessManager.getBleDeviceByMac
-import com.grkj.iscs.BusinessManager.getCurrentStatus
 import com.grkj.iscs.BusinessManager.isTestMode
 import com.grkj.iscs.BusinessManager.removeExceptionKey
 import com.grkj.iscs.BusinessManager.sendEventMsg
@@ -24,7 +23,6 @@ import com.grkj.iscs.model.eventmsg.MsgEventConstants.MSG_EVENT_LOADING
 import com.grkj.iscs.util.ActivityUtils
 import com.grkj.iscs.util.CommonUtils
 import com.grkj.iscs.util.Executor
-import com.grkj.iscs.util.ToastUtils
 import com.grkj.iscs.util.log.LogUtil
 import com.grkj.iscs.view.base.BaseActivity
 import com.sik.sikcore.activity.ActivityTracker
@@ -35,6 +33,7 @@ import kotlinx.coroutines.suspendCancellableCoroutine
 import kotlinx.coroutines.withContext
 import pub.devrel.easypermissions.AfterPermissionGranted
 import java.util.LinkedList
+import java.util.concurrent.atomic.AtomicInteger
 import kotlin.coroutines.resume
 import kotlin.coroutines.suspendCoroutine
 
@@ -115,6 +114,13 @@ object BleConnectionManager {
         checkAndConnect()
     }
 
+    /**
+     * 是否有连接在等待
+     */
+    fun hasConnectWait(): Boolean {
+        return connectListeners.isEmpty() == false
+    }
+
     /**
      * 连接监听反注册
      */
@@ -239,11 +245,11 @@ object BleConnectionManager {
             }
 
             override fun onScanning(bleDevice: BleDevice?) {
-                val mac = bleDevice?.mac ?: return
-                LogUtil.i("蓝牙连接-onScanning:$mac")
-                if (mac.equals(mac, ignoreCase = true)) {
+                val bleMac = bleDevice?.mac ?: return
+                LogUtil.i("蓝牙连接-onScanning:$bleMac")
+                if (mac.equals(bleMac, ignoreCase = true)) {
                     // 找到目标设备,马上停止扫描
-                    LogUtil.i("找到目标设备 $mac,停止扫描并尝试连接")
+                    LogUtil.i("蓝牙连接-找到目标设备 $bleMac,停止扫描并尝试连接")
                     BleManager.getInstance().cancelScan()
                     // 立刻调用 doConnect,下一步进入连接流程
                     doConnect(bleDevice, isNeedLoading, prepareDoneCallBack)
@@ -291,6 +297,7 @@ object BleConnectionManager {
             BleUtil.instance?.connectBySelect(
                 bleDevice, object : CustomBleGattCallback() {
                     override fun onPrompt(promptStr: String?) {
+                        LogUtil.i("蓝牙连接-连接指定设备参数:${promptStr}")
                         if (isNeedLoading) sendEventMsg(
                             MsgEvent(
                                 MSG_EVENT_LOADING, LoadingMsg(false, promptStr, null)
@@ -298,7 +305,9 @@ object BleConnectionManager {
                         )
                     }
 
-                    override fun onStartConnect() {}
+                    override fun onStartConnect() {
+                        LogUtil.i("蓝牙连接-开始连接")
+                    }
 
                     override fun onConnectFail(bleDevice: BleDevice?, exception: BleException?) {
                         if (isNeedLoading) sendEventMsg(
@@ -369,15 +378,16 @@ object BleConnectionManager {
                                 return
                             }
                             // 断开和重连之间最好间隔一段时间,否则可能会出现长时间连接不上的情况
-                            Executor.delayOnMain(300) {
-                                registerConnectListener(bleDevice.mac) { isDone, bleBean ->
-                                    if (isDone && bleBean != null) {
-                                        Executor.delayOnMain(300) {
-                                            getCurrentStatus(6, bleBean.bleDevice)
-                                        }
-                                    }
-                                }
-                            }
+//                            Executor.delayOnMain(300) {
+//                                registerConnectListener(bleDevice.mac) { isDone, bleBean ->
+//                                    if (isDone && bleBean != null) {
+//                                        Executor.delayOnMain(300) {
+//                                            getCurrentStatus(6, bleBean.bleDevice)
+//                                        }
+//                                    }
+//                                }
+//                            }
+                            ModBusController.updateKeyReadyStatus(bleDevice.mac, false, 3)
                         } else {
                             ModBusController.updateKeyReadyStatus(bleDevice.mac, false, 3)
                         }
@@ -595,14 +605,20 @@ object BleConnectionManager {
                 override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
                     val devicesSnapshot = scanResultList?.toList().orEmpty()
                     ThreadUtils.runOnIO {
+                        val handlerDeviceSize = AtomicInteger(0)
                         devicesSnapshot.forEach {
                             val connected = tryConnectWithOptionalCharge(it.mac, false)
                             if (connected) {
                                 val sendSuccess = sendEmptyTicketJson(it)
                                 LogUtil.i("设备录入-发送切换工作模式:${it.mac},${sendSuccess}")
+                                handlerDeviceSize.addAndGet(1)
+                            } else {
+                                handlerDeviceSize.addAndGet(1)
+                            }
+                            if (devicesSnapshot.size == handlerDeviceSize.get()) {
+                                parentCont.resume(true)
                             }
                         }
-                        parentCont.resume(true)
                     }
                 }
             })
@@ -696,14 +712,14 @@ object BleConnectionManager {
     /**
      * 扫描在线的蓝牙
      */
-    fun scanOnlineKeyLockMac(callback: (List<BleDevice>?) -> Unit) {
+    fun scanOnlineKeyLockMac(existsMac: List<String>, callback: (BleDevice?) -> Unit) {
         BleUtil.instance?.scan(object : CustomBleScanCallback() {
             override fun onPrompt(promptStr: String?) {
                 // 蓝牙未启动重试
                 LogUtil.d("设备录入-参数:${promptStr}")
                 BleManager.getInstance().enableBluetooth()
                 ThreadUtils.runOnMainDelayed(300) {
-                    scanOnlineKeyLockMac(callback)
+                    scanOnlineKeyLockMac(existsMac, callback)
                 }
             }
 
@@ -711,7 +727,7 @@ object BleConnectionManager {
                 LogUtil.d("设备录入-onScanStarted:${success}")
                 if (!success) {
                     ThreadUtils.runOnMainDelayed(300) {
-                        scanOnlineKeyLockMac(callback)
+                        scanOnlineKeyLockMac(existsMac, callback)
                     }
                 }
             }
@@ -719,11 +735,14 @@ object BleConnectionManager {
             override fun onScanning(bleDevice: BleDevice?) {
                 val mac = bleDevice?.mac ?: return
                 LogUtil.d("设备录入-onScanning:$mac")
+                if (mac !in existsMac) {
+                    callback(bleDevice)
+                    BleManager.getInstance().cancelScan()
+                }
             }
 
             override fun onScanFinished(scanResultList: MutableList<BleDevice>?) {
                 LogUtil.d("设备录入-扫描完成:$scanResultList")
-                callback(scanResultList?.toList())
             }
         })
     }

+ 13 - 6
app/src/main/java/com/grkj/iscs/modbus/ModBusController.kt

@@ -691,13 +691,20 @@ object ModBusController {
         slaveAddress: Byte?,
         done: ((res: ByteArray) -> Unit)? = null
     ) {
-        slaveAddress?.let {
-            ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
-                modBusManager?.sendTo(it, cmd) { res ->
-                    if (isOpen) {
-                        controlKeyCharge(false, isLeft, slaveAddress)
+        slaveAddress?.let { addr ->
+            if (isOpen) {
+                controlKeyCharge(false, isLeft, addr) {
+                    ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
+                        modBusManager?.sendTo(addr, cmd) { res ->
+                            done?.invoke(res)
+                        }
+                    }
+                }
+            } else {
+                ModBusCMDHelper.generateKeyBuckleCmd(isOpen, if (isLeft) 0 else 1)?.let { cmd ->
+                    modBusManager?.sendTo(addr, cmd) { res ->
+                        done?.invoke(res)
                     }
-                    done?.invoke(res)
                 }
             }
         }

+ 1 - 0
app/src/main/java/com/grkj/iscs/modbus/ModBusManager.kt

@@ -57,6 +57,7 @@ class ModBusManager(
                 }
             }
         }
+        portManager?.clearGarbageSafe()
         // 初始化地址池
         val dockConfig = SPUtils.getDockConfig(MyApplication.instance?.applicationContext!!)
         LogUtil.i("基座配置: ${dockConfig}")

+ 11 - 0
app/src/main/java/com/grkj/iscs/modbus/PortManager.kt

@@ -67,6 +67,17 @@ class PortManager private constructor(
         t?.start()
     }
 
+    /**
+     * 安全清除垃圾
+     */
+    fun clearGarbageSafe(timeoutMs: Int = 100) {
+        val buffer = ByteArray(256)
+        val start = System.currentTimeMillis()
+        while ((System.currentTimeMillis() - start) < timeoutMs && input.available() > 0) {
+            input.read(buffer)
+        }
+    }
+
     /**
      * 关闭
      */

+ 6 - 2
app/src/main/java/com/grkj/iscs/view/presenter/HomePresenter.kt

@@ -33,7 +33,9 @@ class HomePresenter : BasePresenter<IHomeView>() {
                         if (keyBean.isExist) {
                             Executor.repeatOnMain({
                                 keyBean.mac?.let { mac ->
-                                    BusinessManager.sendLoadingEventMsg(mContext?.getString(R.string.loading_msg_return_key_start))
+                                    ThreadUtils.runOnMain {
+                                        BusinessManager.sendLoadingEventMsg(mContext?.getString(R.string.loading_msg_return_key_start))
+                                    }
                                     ThreadUtils.runOnIO {
                                         suspend fun readJobTicket(mac: String) {
                                             val isConnect =
@@ -61,7 +63,9 @@ class HomePresenter : BasePresenter<IHomeView>() {
                                                 readJobTicket(mac)
                                             }
                                         }
-                                        readJobTicket(mac)
+                                        if (!ISCSDomainData.isDeviceRegistration) {
+                                            readJobTicket(mac)
+                                        }
                                     }
                                 }
                                 return@repeatOnMain keyBean.mac == null

+ 9 - 26
app/src/main/java/com/grkj/iscs/view/viewmodel/DeviceRegistrationKeyAndLockViewModel.kt

@@ -94,9 +94,9 @@ class DeviceRegistrationKeyAndLockViewModel : BaseViewModel() {
             newHardwareKeyBean.clear()
             alreadyUsedMac.clear()
             isLoadComplete.postValue(false)
-            val allDeviceCloseCmdSend =
-                BleConnectionManager.scanOnlineKeyLockMacAndSwitchModeToClose()
-            LogUtil.i("设备录入-是否所有关闭命令发送成功:${allDeviceCloseCmdSend}")
+//            val allDeviceCloseCmdSend =
+//                BleConnectionManager.scanOnlineKeyLockMacAndSwitchModeToClose()
+//            LogUtil.i("设备录入-是否所有关闭命令发送成功:${allDeviceCloseCmdSend}")
             BleManager.getInstance().disconnectAllDevice()
             BusinessManager.registerInitListener {
                 if (isStartCheckKey) {
@@ -169,27 +169,22 @@ class DeviceRegistrationKeyAndLockViewModel : BaseViewModel() {
                         ThreadUtils.runOnIO {
                             delay(3000)
                             LogUtil.i("设备录入-开始扫描在线蓝牙Mac")
-                            BleConnectionManager.scanOnlineKeyLockMac { bleDevices ->
+                            BleConnectionManager.scanOnlineKeyLockMac(alreadyUsedMac) { bleDevice ->
                                 LogUtil.i(
                                     "设备录入-在线的蓝牙设备:${keyBean.rfid},${
-                                        bleDevices?.joinToString(
-                                            ","
-                                        ) { it.mac }
+                                        bleDevice?.mac
                                     }"
                                 )
                                 if (isDestroy) {
                                     cont.cancel()
                                     return@scanOnlineKeyLockMac
                                 }
-                                if (bleDevices?.isEmpty() == true) {
+                                if (bleDevice == null) {
                                     ThreadUtils.runOnIO {
                                         openChargeAndScanMac(addr, keyBean)
                                     }
                                 } else {
-                                    val bleDevice = bleDevices?.find {
-                                        it.mac !in alreadyUsedMac
-                                    }
-                                    if (bleDevice?.mac?.isEmpty() == true) {
+                                    if (bleDevice.mac == null) {
                                         ThreadUtils.runOnIO {
                                             openChargeAndScanMac(addr, keyBean)
                                         }
@@ -197,23 +192,11 @@ class DeviceRegistrationKeyAndLockViewModel : BaseViewModel() {
                                     }
                                     LogUtil.i(
                                         "设备录入-没有使用过的mac:${keyBean.rfid},${
-                                            bleDevice?.mac
+                                            bleDevice.mac
                                         }"
                                     )
-                                    keyBean.mac = bleDevice?.mac!!
+                                    keyBean.mac = bleDevice.mac
                                     alreadyUsedMac.add(bleDevice.mac)
-                                    ThreadUtils.runOnIO {
-                                        keyBean.mac?.let {
-                                            val connected =
-                                                BleConnectionManager.tryConnectWithOptionalCharge(it)
-                                            if (connected) {
-                                                bleDevice?.let {
-                                                    BleConnectionManager.switchReadyMode(it)
-                                                }
-                                            }
-                                        }
-                                    }
-
                                     cont.resume(true)
                                 }
                             }