Przeglądaj źródła

Update 优化RFID读卡超时重连的逻辑

Yue 1 miesiąc temu
rodzic
commit
e9e4904b8d

+ 2 - 2
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/rfid/RfidConstants.java

@@ -41,8 +41,8 @@ public final class RfidConstants {
     // 默认连接重试次数
     public static final int DEFAULT_CONNECT_RETRY_TIMES = 3;
 
-    // 扫描空闲超时时间(120分钟)
-    public static final long SCAN_IDLE_TIMEOUT_MS = 120 * 60 * 1000L;
+    // 扫描空闲超时时间(15分钟)
+    public static final long SCAN_IDLE_TIMEOUT_MS = 15 * 60 * 1000L;
 
     private RfidConstants() {
         // 禁止实例化

+ 27 - 32
UI/CF.APP/chicken_farm/android/app/src/main/java/com/vber/chicken_farm/rfid/RfidService.java

@@ -75,6 +75,7 @@ public class RfidService extends Service {
     public static int ErrorCount;
     public static int ErrorCRC;
     public boolean isMultipleTag = false;
+    public boolean isScanIdleTimeout = false;
 
     // 读卡器空闲超时处理器
     private Handler idleHandler;
@@ -138,13 +139,13 @@ public class RfidService extends Service {
         idleDisconnectRunnable = () -> {
             if (isConnected && !isScanning) {
                 Log.d(RfidConstants.TAG, "读卡器空闲超时(" + scanIdleTimeoutMs / 1000 + "秒),自动关闭连接");
+                isScanIdleTimeout = true;
                 disconnect(); // 自动断开连接
                 if (listener != null) {
                     listener.onScanInfo("读卡器空闲超时,已自动断开连接");
                 }
             }
         };
-
     }
 
     /**
@@ -155,8 +156,8 @@ public class RfidService extends Service {
             // 移除之前的任务,重新计时
             idleHandler.removeCallbacks(idleDisconnectRunnable);
             idleHandler.postDelayed(idleDisconnectRunnable, scanIdleTimeoutMs);
-            // Log.d(RfidConstants.TAG, "读卡器空闲计时器已重置,超时时间:" + scanIdleTimeoutMs / 1000 +
-            // "秒");
+            Log.d(RfidConstants.TAG, "读卡器空闲计时器已重置,超时时间:" + scanIdleTimeoutMs / 1000 +
+                    "秒");
         }
     }
 
@@ -279,39 +280,31 @@ public class RfidService extends Service {
     }
 
     /**
-     * 亮屏后恢复读卡(延迟重连避免硬件卡顿)
+     * 亮屏后恢复连接
      */
     private void resumeScanAfterScreenOn() {
-        if (isConnected && !isScanning) {
-            executorService.execute(() -> {
-                try {
-                    Thread.sleep(scanReconnectDelayMs); // 延迟恢复
-                    // rrlib.StartRead();
-                    // isScanning = true;
-                    acquireWakeLock();
-                    if (!isConnected) {
-                        connect();
-                    } else {
-                        if (listener != null) {
-                            listener.onConnectSuccess(curPort, curBaud);
-                        }
-                    }
-                    // stopIdleTimeout(); // 恢复读卡后停止空闲计时
-                    // Log.d(RfidConstants.TAG, "亮屏恢复RFID读卡成功");
-                    // if (listener != null) {
-                    // listener.onTagScanned(rrlib.getInventoryTagMapList()); // 触发一次读卡回调
-                    // }
-                } catch (InterruptedException e) {
-                    Thread.currentThread().interrupt();
-                    Log.e(RfidConstants.TAG, "恢复读卡线程被中断", e);
-                } catch (Exception e) {
-                    Log.e(RfidConstants.TAG, "亮屏恢复读卡失败", e);
-                    if (listener != null) {
-                        listener.onScanError("亮屏恢复读卡失败:" + e.getMessage());
-                    }
+        try {
+            Thread.sleep(scanReconnectDelayMs); // 延迟恢复
+            // rrlib.StartRead();
+            // isScanning = true;
+            acquireWakeLock();
+            if (!isConnected) {
+                connect();
+            } else if (isScanIdleTimeout) {
+                if (listener != null) {
+                    listener.onConnectSuccess(curPort, curBaud);
                 }
-            });
+            }
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            Log.e(RfidConstants.TAG, "恢复读卡线程被中断", e);
+        } catch (Exception e) {
+            Log.e(RfidConstants.TAG, "亮屏恢复读卡失败", e);
+            if (listener != null) {
+                listener.onScanError("亮屏恢复读卡失败:" + e.getMessage());
+            }
         }
+
     }
 
     @Override
@@ -515,6 +508,7 @@ public class RfidService extends Service {
                             Log.d(RfidConstants.TAG, "Reader Interval: " + readerParameter.Interval);
                             Log.d(RfidConstants.TAG, "Reader TidLen: " + readerParameter.TidLen);
                             Log.d(RfidConstants.TAG, "Reader TidPtr: " + readerParameter.TidPtr);
+                            resetIdleTimeout();
                             break; // 跳出所有循环
                         } else {
                             Log.e(RfidConstants.TAG, "连接[" + i + "]: " + result);
@@ -595,6 +589,7 @@ public class RfidService extends Service {
             setPower();
         }
         Log.d(RfidConstants.TAG, "RFID设备读卡,功率:" + getPower() + "W");
+        isScanIdleTimeout = false;
         return _startScan();
     }
 

+ 13 - 2
UI/CF.APP/chicken_farm/lib/components/vb_electronic_id_field.dart

@@ -100,12 +100,23 @@ class _VberElectronicIdsFieldState extends State<VberElectronicIdsField> {
     }
   }
 
-  void _scanRfid() {
+  void _scanRfid() async {
     setState(() {
       _isScanning = true;
     });
     ToastUtil.show('开始识别电子编号', duration: 1);
-    RfidManager.instance.startScan(isMultiple: _isMultiple);
+    int result = await RfidManager.instance.startRead(isMultiple: _isMultiple);
+    if (result == 1) {
+      ToastUtil.errorAlert('读卡器已自动断开连接!\n现在正在连接中,请稍后重试!');
+      setState(() {
+        _isScanning = false;
+      });
+    } else if (result == 2) {
+      ToastUtil.errorAlert('读卡器读取失败,请检查读卡器是否正常');
+      setState(() {
+        _isScanning = false;
+      });
+    }
   }
 
   @override

+ 13 - 11
UI/CF.APP/chicken_farm/lib/core/services/pda/rfid_manager.dart

@@ -76,25 +76,25 @@ class RfidManager {
               } else {
                 ToastUtil.errorAlert("读卡器连接失败!!!");
               }
-              logger.e("❌ 设备连接失败[$errorCount]: ${event.error}");
+              logger.e("❌ 读卡器连接失败[$errorCount]: ${event.error}");
               break;
             case RfidEventType.tagScanned:
-              logger.i("📶 扫描到标签: ${event.data}");
+              logger.i("📶 读卡器读取到标签: ${event.data}");
               _handleScannedTags(event.data);
               break;
             case RfidEventType.scanError:
-              logger.e("❌ 扫描错误: ${event.error}");
+              logger.e("❌ 读卡器读取错误: ${event.error}");
               // ToastUtil.error("扫描出错");
               _onErrorScanned?.call(event.error ?? "未知错误");
               break;
             case RfidEventType.scanInfo:
-              logger.i("❌ 扫描信息: ${event.info}");
-              // if (event.info != null) {
-              //   ToastUtil.info("${event.info}");
-              // }
+              logger.i("❌ 读卡器信息: ${event.info}");
+              if (event.info != null && event.info!.contains("超时")) {
+                ToastUtil.info("${event.info}");
+              }
               break;
             case RfidEventType.disconnected:
-              logger.i("🔌 设备已断开连接");
+              logger.i("🔌 读卡器已断开连接");
               break;
             case RfidEventType.onKeyPress: // 处理按键事件
               _onKeyPress?.call(event.data);
@@ -200,24 +200,26 @@ class RfidManager {
   }
 
   /// 开始扫描
-  Future<void> startScan({bool isMultiple = false}) async {
+  Future<int> startRead({bool isMultiple = false}) async {
     // 检查连接状态
     final bool isConnected = await _ensureConnected();
     if (!isConnected) {
       logger.e("❌ 无法启动扫描,读卡器未连接");
-      return;
+      return 1;
     }
 
     final bool isStarted = await RfidChannel.startScan(isMultiple);
     if (isStarted) {
       logger.i("▶️ 扫描已启动");
+      return 0;
     } else {
       logger.e("❌ 扫描启动失败");
+      return 2;
     }
   }
 
   /// 停止扫描
-  Future<void> stopScan() async {
+  Future<void> stopRead() async {
     await RfidChannel.stopScan();
     logger.i("⏹️ 扫描已停止");
   }