|
|
@@ -32,12 +32,13 @@ import java.util.Map;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
import java.util.concurrent.ExecutorService;
|
|
|
import java.util.concurrent.Executors;
|
|
|
+import java.util.logging.LogManager;
|
|
|
|
|
|
/**
|
|
|
* RFID核心服务(后台运行,提供API给外部调用)
|
|
|
* 功能特性:
|
|
|
- * 1. 息屏/亮屏自动暂停/恢复扫描
|
|
|
- * 2. 5分钟扫描空闲自动断开连接(可配置)
|
|
|
+ * 1. 息屏/亮屏自动暂停/恢复读取
|
|
|
+ * 2. 5分钟读卡器空闲自动断开连接(可配置)
|
|
|
* 3. 所有关键参数可配置(重试次数、端口、波特率等)
|
|
|
* 4. 完善的异常处理和资源管理
|
|
|
* 5. 线程安全的状态管理
|
|
|
@@ -74,9 +75,9 @@ public class RfidService extends Service {
|
|
|
public static int ErrorCRC;
|
|
|
public boolean isMultipleTag = false;
|
|
|
|
|
|
- // 扫描空闲超时处理器
|
|
|
+ // 读卡器空闲超时处理器
|
|
|
private Handler idleHandler;
|
|
|
- // 扫描消息处理器(处理扫描结果)
|
|
|
+ // 读卡器消息处理器(处理读卡器结果)
|
|
|
private Handler msgHandler;
|
|
|
private Runnable idleDisconnectRunnable;
|
|
|
|
|
|
@@ -86,14 +87,14 @@ public class RfidService extends Service {
|
|
|
public void onReceive(Context context, Intent intent) {
|
|
|
String action = intent.getAction();
|
|
|
if (Intent.ACTION_SCREEN_ON.equals(action)) {
|
|
|
- // 屏幕亮屏 - 恢复扫描(如果之前正在扫描)
|
|
|
+ // 屏幕亮屏 - 恢复读卡(如果之前正在读卡)
|
|
|
isScreenOn = true;
|
|
|
- Log.d(RfidConstants.TAG, "屏幕亮屏,尝试恢复RFID扫描");
|
|
|
+ Log.d(RfidConstants.TAG, "RFID屏幕亮屏,尝试恢复读卡");
|
|
|
resumeScanAfterScreenOn();
|
|
|
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
|
|
|
- // 屏幕息屏 - 暂停扫描(保留连接)
|
|
|
+ // 屏幕息屏 - 暂停读卡(保留连接)
|
|
|
isScreenOn = false;
|
|
|
- Log.d(RfidConstants.TAG, "屏幕息屏,暂停RFID扫描");
|
|
|
+ Log.d(RfidConstants.TAG, "RFID屏幕息屏,暂停读卡");
|
|
|
pauseScanOnScreenOff();
|
|
|
}
|
|
|
}
|
|
|
@@ -102,18 +103,28 @@ public class RfidService extends Service {
|
|
|
@Override
|
|
|
public void onCreate() {
|
|
|
super.onCreate();
|
|
|
- Log.d(RfidConstants.TAG, "RfidService created");
|
|
|
- initWakeLock();
|
|
|
- initIdleHandler(); // 初始化空闲超时处理器
|
|
|
- executorService = Executors.newSingleThreadExecutor();
|
|
|
- initReader();
|
|
|
- initMsgHandler();
|
|
|
- initSound();
|
|
|
- registerScreenStateReceiver(); // 注册屏幕状态监听
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean init() {
|
|
|
+ try {
|
|
|
+ Log.d(RfidConstants.TAG, "RfidService created");
|
|
|
+ initWakeLock();
|
|
|
+ initIdleHandler(); // 初始化空闲超时处理器
|
|
|
+ executorService = Executors.newSingleThreadExecutor();
|
|
|
+ initReader();
|
|
|
+ initMsgHandler();
|
|
|
+ initSound();
|
|
|
+ registerScreenStateReceiver(); // 注册屏幕状态监听
|
|
|
+ return true;
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(RfidConstants.TAG, "读卡器初始化失败", e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 初始化扫描空闲超时处理器
|
|
|
+ * 初始化读卡器空闲超时处理器
|
|
|
*/
|
|
|
private void initIdleHandler() {
|
|
|
// 创建后台HandlerThread避免主线程阻塞
|
|
|
@@ -125,10 +136,10 @@ public class RfidService extends Service {
|
|
|
// 定义空闲超时断开连接任务
|
|
|
idleDisconnectRunnable = () -> {
|
|
|
if (isConnected && !isScanning) {
|
|
|
- Log.d(RfidConstants.TAG, "扫描空闲超时(" + scanIdleTimeoutMs / 1000 + "秒),自动关闭连接");
|
|
|
+ Log.d(RfidConstants.TAG, "读卡器空闲超时(" + scanIdleTimeoutMs / 1000 + "秒),自动关闭连接");
|
|
|
disconnect(); // 自动断开连接
|
|
|
if (listener != null) {
|
|
|
- listener.onScanInfo("扫描空闲超时,已自动断开连接");
|
|
|
+ listener.onScanInfo("读卡器空闲超时,已自动断开连接");
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
@@ -136,25 +147,25 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 重置空闲超时计时器(有扫描操作时调用)
|
|
|
+ * 重置空闲超时计时器(有读卡器操作时调用)
|
|
|
*/
|
|
|
private void resetIdleTimeout() {
|
|
|
if (idleHandler != null && idleDisconnectRunnable != null) {
|
|
|
// 移除之前的任务,重新计时
|
|
|
idleHandler.removeCallbacks(idleDisconnectRunnable);
|
|
|
idleHandler.postDelayed(idleDisconnectRunnable, scanIdleTimeoutMs);
|
|
|
- // Log.d(RfidConstants.TAG, "扫描空闲计时器已重置,超时时间:" + scanIdleTimeoutMs / 1000 +
|
|
|
+ // Log.d(RfidConstants.TAG, "读卡器空闲计时器已重置,超时时间:" + scanIdleTimeoutMs / 1000 +
|
|
|
// "秒");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 停止空闲超时计时器(断开连接/停止扫描时调用)
|
|
|
+ * 停止空闲超时计时器(断开连接/停止读卡时调用)
|
|
|
*/
|
|
|
private void stopIdleTimeout() {
|
|
|
if (idleHandler != null && idleDisconnectRunnable != null) {
|
|
|
idleHandler.removeCallbacks(idleDisconnectRunnable);
|
|
|
- Log.d(RfidConstants.TAG, "扫描空闲计时器已停止");
|
|
|
+ Log.d(RfidConstants.TAG, "读卡器空闲计时器已停止");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -246,7 +257,7 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 息屏时暂停扫描(保留连接)
|
|
|
+ * 息屏时暂停读卡(保留连接)
|
|
|
*/
|
|
|
private void pauseScanOnScreenOff() {
|
|
|
if (isScanning) {
|
|
|
@@ -254,12 +265,12 @@ public class RfidService extends Service {
|
|
|
try {
|
|
|
rrlib.StopRead();
|
|
|
isScanning = false;
|
|
|
- resetIdleTimeout(); // 暂停扫描后启动空闲计时
|
|
|
- Log.d(RfidConstants.TAG, "息屏暂停扫描,保留设备连接");
|
|
|
+ resetIdleTimeout(); // 暂停读卡后启动空闲计时
|
|
|
+ Log.d(RfidConstants.TAG, "息屏暂停读卡,保留设备连接");
|
|
|
} catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "息屏暂停扫描失败", e);
|
|
|
+ Log.e(RfidConstants.TAG, "息屏暂停读卡失败", e);
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("息屏暂停扫描失败:" + e.getMessage());
|
|
|
+ listener.onScanError("息屏暂停读卡失败:" + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
@@ -267,7 +278,7 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 亮屏后恢复扫描(延迟重连避免硬件卡顿)
|
|
|
+ * 亮屏后恢复读卡(延迟重连避免硬件卡顿)
|
|
|
*/
|
|
|
private void resumeScanAfterScreenOn() {
|
|
|
if (isConnected && !isScanning) {
|
|
|
@@ -280,18 +291,18 @@ public class RfidService extends Service {
|
|
|
if (!isConnected) {
|
|
|
connect();
|
|
|
}
|
|
|
- // stopIdleTimeout(); // 恢复扫描后停止空闲计时
|
|
|
- // Log.d(RfidConstants.TAG, "亮屏恢复RFID扫描成功");
|
|
|
+ // stopIdleTimeout(); // 恢复读卡后停止空闲计时
|
|
|
+ // Log.d(RfidConstants.TAG, "亮屏恢复RFID读卡成功");
|
|
|
// if (listener != null) {
|
|
|
- // listener.onTagScanned(rrlib.getInventoryTagMapList()); // 触发一次扫描回调
|
|
|
+ // listener.onTagScanned(rrlib.getInventoryTagMapList()); // 触发一次读卡回调
|
|
|
// }
|
|
|
} catch (InterruptedException e) {
|
|
|
Thread.currentThread().interrupt();
|
|
|
- Log.e(RfidConstants.TAG, "恢复扫描线程被中断", e);
|
|
|
+ Log.e(RfidConstants.TAG, "恢复读卡线程被中断", e);
|
|
|
} catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "亮屏恢复扫描失败", e);
|
|
|
+ Log.e(RfidConstants.TAG, "亮屏恢复读卡失败", e);
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("亮屏恢复扫描失败:" + e.getMessage());
|
|
|
+ listener.onScanError("亮屏恢复读卡失败:" + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
@@ -305,7 +316,7 @@ public class RfidService extends Service {
|
|
|
|
|
|
@Override
|
|
|
public boolean onUnbind(Intent intent) {
|
|
|
- // 解绑时停止扫描+断开连接
|
|
|
+ // 解绑时停止读卡+断开连接
|
|
|
stopScan();
|
|
|
disconnect();
|
|
|
return super.onUnbind(intent);
|
|
|
@@ -343,7 +354,7 @@ public class RfidService extends Service {
|
|
|
@Override
|
|
|
public void onTrimMemory(int level) {
|
|
|
super.onTrimMemory(level);
|
|
|
- // UI隐藏/内存紧张时,临时停止扫描
|
|
|
+ // UI隐藏/内存紧张时,临时停止读卡
|
|
|
if (level >= TRIM_MEMORY_UI_HIDDEN && isScanning) {
|
|
|
Log.d(RfidConstants.TAG, "UI hidden, stopping scan temporarily");
|
|
|
pauseScanOnScreenOff(); // 复用息屏暂停逻辑
|
|
|
@@ -394,17 +405,17 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 设置息屏恢复扫描延迟
|
|
|
+ * 设置息屏恢复读卡延迟
|
|
|
*/
|
|
|
public void setScanReconnectDelayMs(long delayMs) {
|
|
|
if (delayMs >= 0) {
|
|
|
this.scanReconnectDelayMs = delayMs;
|
|
|
- Log.d(RfidConstants.TAG, "息屏恢复扫描延迟已设置为:" + delayMs + "ms");
|
|
|
+ Log.d(RfidConstants.TAG, "息屏恢复读卡延迟已设置为:" + delayMs + "ms");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 设置扫描空闲超时时间(毫秒)
|
|
|
+ * 设置读卡空闲超时时间(毫秒)
|
|
|
*/
|
|
|
public void setScanIdleTimeoutMs(long timeoutMs) {
|
|
|
if (timeoutMs > 0) {
|
|
|
@@ -414,7 +425,7 @@ public class RfidService extends Service {
|
|
|
idleHandler.removeCallbacks(idleDisconnectRunnable);
|
|
|
idleHandler.postDelayed(idleDisconnectRunnable, scanIdleTimeoutMs);
|
|
|
}
|
|
|
- Log.d(RfidConstants.TAG, "扫描空闲超时时间已设置为:" + timeoutMs / 1000 + "秒");
|
|
|
+ Log.d(RfidConstants.TAG, "读卡空闲超时时间已设置为:" + timeoutMs / 1000 + "秒");
|
|
|
} else {
|
|
|
Log.w(RfidConstants.TAG, "空闲超时时间必须大于0,使用默认值:" + scanIdleTimeoutMs / 1000 + "秒");
|
|
|
}
|
|
|
@@ -555,19 +566,19 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
public boolean startScan(boolean multipleTag) {
|
|
|
- Log.d(RfidConstants.TAG, "=====>RFID设备开始扫描");
|
|
|
+ Log.d(RfidConstants.TAG, "=====>RFID设备开始读卡");
|
|
|
if (!isConnected) {
|
|
|
connect();
|
|
|
}
|
|
|
if (!isConnected) {
|
|
|
- Log.e(RfidConstants.TAG, "RFID设备未连接,无法开始扫描");
|
|
|
+ Log.e(RfidConstants.TAG, "RFID设备未连接,无法开始读卡");
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("设备未连接,扫描失败");
|
|
|
+ listener.onScanError("设备未连接,读卡失败");
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
if (isScanning) {
|
|
|
- Log.w(RfidConstants.TAG, "RFID正在扫描中,无需重复启动");
|
|
|
+ Log.w(RfidConstants.TAG, "RFID正在读卡中,无需重复启动");
|
|
|
stopIdleTimeout(); // 重复启动也重置计时
|
|
|
return true;
|
|
|
}
|
|
|
@@ -576,27 +587,27 @@ public class RfidService extends Service {
|
|
|
setReaderParameter(null);
|
|
|
setPower();
|
|
|
}
|
|
|
- Log.d(RfidConstants.TAG, "RFID设备扫描,功率:" + getPower() + "W");
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备读卡,功率:" + getPower() + "W");
|
|
|
return _startScan();
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 开始扫描标签
|
|
|
+ * 开始读卡标签
|
|
|
*/
|
|
|
private boolean _startScan() {
|
|
|
isScanning = true;
|
|
|
acquireWakeLock(); // 息屏保持唤醒
|
|
|
- stopIdleTimeout(); // 开始扫描,停止空闲计时
|
|
|
+ stopIdleTimeout(); // 开始读卡,停止空闲计时
|
|
|
try {
|
|
|
// 清空历史标签数据
|
|
|
rrlib.getInventoryTagMapList().clear();
|
|
|
rrlib.getInventoryTagResultList().clear();
|
|
|
MsgCallback callback = new MsgCallback();
|
|
|
- // 设置扫描回调
|
|
|
+ // 设置读卡回调
|
|
|
rrlib.SetCallBack(callback);
|
|
|
ErrorCount = 0;
|
|
|
ErrorCRC = 0;
|
|
|
- // 启动扫描
|
|
|
+ // 启动读卡器
|
|
|
int result = rrlib.StartRead();
|
|
|
if (result != 0) {
|
|
|
// throw new Exception("未能识别到电子标签!");
|
|
|
@@ -606,25 +617,25 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
- Log.d(RfidConstants.TAG, "RFID扫描已启动");
|
|
|
- // 1 秒后停止扫描
|
|
|
+ Log.d(RfidConstants.TAG, "RFID读卡已启动");
|
|
|
+ // 1 秒后停止读卡
|
|
|
idleHandler.postDelayed(() -> {
|
|
|
- Log.d(RfidConstants.TAG, "1秒RFID扫描自动停止");
|
|
|
+ Log.d(RfidConstants.TAG, "1秒RFID读卡自动停止");
|
|
|
if (isScanning) {
|
|
|
stopScan();
|
|
|
if (listener != null
|
|
|
&& (!isMultipleTag || isMultipleTag && rrlib.getInventoryTagMapList().size() == 0)) {
|
|
|
- listener.onScanError("未扫描到电子编号");
|
|
|
+ listener.onScanError("未读卡到电子编号");
|
|
|
}
|
|
|
}
|
|
|
}, 1 * 1000);
|
|
|
} catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "扫描失败:", e);
|
|
|
+ Log.e(RfidConstants.TAG, "读卡失败:", e);
|
|
|
isScanning = false;
|
|
|
releaseWakeLock();
|
|
|
resetIdleTimeout(); // 启动失败,启动空闲计时
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("扫描失败:" + e.getMessage());
|
|
|
+ listener.onScanError("读卡失败:" + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -632,23 +643,23 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 停止扫描标签
|
|
|
+ * 停止读卡标签
|
|
|
*/
|
|
|
public void stopScan() {
|
|
|
if (!isScanning) {
|
|
|
- // Log.w(RfidConstants.TAG, "RFID未在扫描中,无需停止");
|
|
|
+ // Log.w(RfidConstants.TAG, "RFID未在读卡中,无需停止");
|
|
|
return;
|
|
|
}
|
|
|
try {
|
|
|
rrlib.StopRead();
|
|
|
isScanning = false;
|
|
|
releaseWakeLock(); // 释放唤醒锁
|
|
|
- resetIdleTimeout(); // 停止扫描,启动空闲计时
|
|
|
- Log.d(RfidConstants.TAG, "RFID扫描已停止");
|
|
|
+ resetIdleTimeout(); // 停止读卡,启动空闲计时
|
|
|
+ Log.d(RfidConstants.TAG, "RFID读卡已停止");
|
|
|
} catch (Exception e) {
|
|
|
Log.e(RfidConstants.TAG, "Stop scan error", e);
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("停止扫描失败:" + e.getMessage());
|
|
|
+ listener.onScanError("停止读卡失败:" + e.getMessage());
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -778,10 +789,10 @@ public class RfidService extends Service {
|
|
|
private void setPower() {
|
|
|
if (isMultipleTag) {
|
|
|
setPower(RfidConstants.POWER_HIGH);
|
|
|
- Log.d(RfidConstants.TAG, "RFID设备启动多标签扫描,功率:" + getPower() + "W");
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备启动多标签读卡,功率:" + getPower() + "W");
|
|
|
} else {
|
|
|
setPower(RfidConstants.POWER_LOW);
|
|
|
- Log.d(RfidConstants.TAG, "RFID设备启动单标签扫描,功率:" + getPower() + "W");
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备启动单标签读卡,功率:" + getPower() + "W");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -886,7 +897,7 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
ErrorCount += 1;
|
|
|
|
|
|
- // 触发扫描错误回调
|
|
|
+ // 触发读卡错误回调
|
|
|
if (listener != null) {
|
|
|
listener.onScanError("CRC错误: reason=" + reason + ", 错误数=" + ErrorCount);
|
|
|
}
|
|
|
@@ -895,11 +906,11 @@ public class RfidService extends Service {
|
|
|
|
|
|
@Override
|
|
|
public void FinishCallBack() {
|
|
|
- // 停止扫描并启动空闲计时
|
|
|
+ // 停止读卡并启动空闲计时
|
|
|
isScanning = false;
|
|
|
resetIdleTimeout();
|
|
|
if (listener != null) {
|
|
|
- listener.onScanInfo("扫描已完成");
|
|
|
+ listener.onScanInfo("读卡已完成");
|
|
|
}
|
|
|
}
|
|
|
|