|
|
@@ -1,14 +1,18 @@
|
|
|
package com.vber.chicken_farm.rfid;
|
|
|
|
|
|
+import androidx.annotation.NonNull;
|
|
|
import android.app.Service;
|
|
|
import android.content.BroadcastReceiver;
|
|
|
import android.content.Context;
|
|
|
import android.content.Intent;
|
|
|
import android.content.IntentFilter;
|
|
|
+import android.media.AudioManager;
|
|
|
+import android.media.SoundPool;
|
|
|
import android.os.Handler;
|
|
|
import android.os.HandlerThread;
|
|
|
import android.os.IBinder;
|
|
|
import android.os.Looper;
|
|
|
+import android.os.Message;
|
|
|
import android.os.PowerManager;
|
|
|
import android.util.Log;
|
|
|
|
|
|
@@ -20,6 +24,9 @@ import com.rfid.trans.ReadTag;
|
|
|
import com.rfid.trans.ReaderParameter;
|
|
|
import com.rfid.trans.TagCallback;
|
|
|
|
|
|
+import com.vber.chicken_farm.R;
|
|
|
+import com.vber.chicken_farm.service.SoundService;
|
|
|
+
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
@@ -36,7 +43,13 @@ import java.util.concurrent.Executors;
|
|
|
* 5. 线程安全的状态管理
|
|
|
*/
|
|
|
public class RfidService extends Service {
|
|
|
- public static final String TAG = RfidConstants.TAG;
|
|
|
+
|
|
|
+ private static final String TAG = RfidConstants.TAG;
|
|
|
+ private static final int MSG_UPDATE_LISTVIEW = 0;
|
|
|
+ private static final int MSG_STOP_SCAN = 1;
|
|
|
+
|
|
|
+ private SoundService soundService;
|
|
|
+
|
|
|
// 核心状态变量
|
|
|
private ILcUhfProduct rrlib;
|
|
|
private boolean isConnected = false;
|
|
|
@@ -46,23 +59,26 @@ public class RfidService extends Service {
|
|
|
private ExecutorService executorService;
|
|
|
private ReaderParameter readerParameter;
|
|
|
private int power;
|
|
|
- private final Map<String, Integer> tagMap = new ConcurrentHashMap<>();
|
|
|
private RfidListener listener;
|
|
|
private final RfidBinder mBinder = new RfidBinder(this);
|
|
|
|
|
|
// 可配置参数(默认值从常量类读取)
|
|
|
private int connectRetryTimes = RfidConstants.DEFAULT_CONNECT_RETRY_TIMES;
|
|
|
private long wakeLockTimeoutMs = RfidConstants.WAKE_LOCK_TIMEOUT_MS;
|
|
|
- private String[] devPorts = {RfidConstants.DEVPORT, RfidConstants.DEVPORT2};
|
|
|
+ private String[] devPorts = {RfidConstants.DEVPORT};
|
|
|
private int[] baudRates = RfidConstants.BAUD_LIST;
|
|
|
private long scanReconnectDelayMs = RfidConstants.DEFAULT_SCAN_RECONNECT_DELAY_MS;
|
|
|
private long scanIdleTimeoutMs = RfidConstants.SCAN_IDLE_TIMEOUT_MS;
|
|
|
private int asciiNum;
|
|
|
public static int ErrorCount;
|
|
|
public static int ErrorCRC;
|
|
|
+ public boolean isMultipleTag = false;
|
|
|
+
|
|
|
|
|
|
// 扫描空闲超时处理器
|
|
|
private Handler idleHandler;
|
|
|
+ // 扫描消息处理器(处理扫描结果)
|
|
|
+ private Handler msgHandler;
|
|
|
private Runnable idleDisconnectRunnable;
|
|
|
|
|
|
// 屏幕状态广播接收器(处理息屏/亮屏)
|
|
|
@@ -92,6 +108,8 @@ public class RfidService extends Service {
|
|
|
initIdleHandler(); // 初始化空闲超时处理器
|
|
|
executorService = Executors.newSingleThreadExecutor();
|
|
|
initReader();
|
|
|
+ initMsgHandler();
|
|
|
+ initSound();
|
|
|
registerScreenStateReceiver(); // 注册屏幕状态监听
|
|
|
}
|
|
|
|
|
|
@@ -111,10 +129,11 @@ public class RfidService extends Service {
|
|
|
Log.d(RfidConstants.TAG, "扫描空闲超时(" + scanIdleTimeoutMs / 1000 + "秒),自动关闭连接");
|
|
|
disconnect(); // 自动断开连接
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("扫描空闲超时,已自动断开连接");
|
|
|
+ listener.onScanInfo("扫描空闲超时,已自动断开连接");
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -125,7 +144,7 @@ public class RfidService extends Service {
|
|
|
// 移除之前的任务,重新计时
|
|
|
idleHandler.removeCallbacks(idleDisconnectRunnable);
|
|
|
idleHandler.postDelayed(idleDisconnectRunnable, scanIdleTimeoutMs);
|
|
|
- Log.d(RfidConstants.TAG, "扫描空闲计时器已重置,超时时间:" + scanIdleTimeoutMs / 1000 + "秒");
|
|
|
+ // Log.d(RfidConstants.TAG, "扫描空闲计时器已重置,超时时间:" + scanIdleTimeoutMs / 1000 + "秒");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -161,7 +180,7 @@ public class RfidService extends Service {
|
|
|
private void initReader() {
|
|
|
try {
|
|
|
PowerUtil.power("1"); // 开启电源
|
|
|
- rrlib = new LcModule(this).createProduct();
|
|
|
+ rrlib = new LcModule(this).createProduct(0x20);//0x20:国芯 0x10:荣睿
|
|
|
if (rrlib == null) {
|
|
|
throw new Exception("创建RFID阅读器实例失败");
|
|
|
}
|
|
|
@@ -175,6 +194,47 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private void initMsgHandler() {
|
|
|
+ msgHandler = new Handler() {
|
|
|
+ @Override
|
|
|
+ public void handleMessage(@NonNull Message msg) {
|
|
|
+ super.handleMessage(msg);
|
|
|
+ try {
|
|
|
+ switch (msg.what) {
|
|
|
+ case MSG_UPDATE_LISTVIEW:
|
|
|
+ if (listener != null) {
|
|
|
+ List<InventoryTagMap> inventoryTagMapList = rrlib.getInventoryTagMapList();
|
|
|
+ listener.onTagScanned(inventoryTagMapList);
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case MSG_STOP_SCAN:
|
|
|
+ stopScan();
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ } catch (Exception ex) {
|
|
|
+ ex.toString();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ private void initSound() {
|
|
|
+ // 使用SoundService播放音效
|
|
|
+ soundService = new SoundService(this);
|
|
|
+ Log.d(RfidConstants.TAG, "初始化音效服务成功");
|
|
|
+
|
|
|
+ // if(rrlib != null){
|
|
|
+ // SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 5);
|
|
|
+ // soundPool.load(this, R.raw.barcodebeep, 1);
|
|
|
+ // rrlib.setsoundid(0, soundPool);
|
|
|
+ // Log.d(RfidConstants.TAG, "初始化音效成功");
|
|
|
+ // // rrlib.beginSound(true);
|
|
|
+
|
|
|
+ // rrlib.playSound();
|
|
|
+ // }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 注册屏幕状态广播(处理息屏/亮屏)
|
|
|
*/
|
|
|
@@ -194,6 +254,7 @@ public class RfidService extends Service {
|
|
|
executorService.execute(() -> {
|
|
|
try {
|
|
|
rrlib.StopRead();
|
|
|
+ isScanning = false;
|
|
|
resetIdleTimeout(); // 暂停扫描后启动空闲计时
|
|
|
Log.d(RfidConstants.TAG, "息屏暂停扫描,保留设备连接");
|
|
|
} catch (Exception e) {
|
|
|
@@ -214,14 +275,17 @@ public class RfidService extends Service {
|
|
|
executorService.execute(() -> {
|
|
|
try {
|
|
|
Thread.sleep(scanReconnectDelayMs); // 延迟恢复
|
|
|
- rrlib.StartRead();
|
|
|
- isScanning = true;
|
|
|
+ // rrlib.StartRead();
|
|
|
+ // isScanning = true;
|
|
|
acquireWakeLock();
|
|
|
- stopIdleTimeout(); // 恢复扫描后停止空闲计时
|
|
|
- Log.d(RfidConstants.TAG, "亮屏恢复RFID扫描成功");
|
|
|
- if (listener != null) {
|
|
|
- listener.onTagScanned(rrlib.getInventoryTagMapList()); // 触发一次扫描回调
|
|
|
+ if(!isConnected){
|
|
|
+ connect();
|
|
|
}
|
|
|
+ // stopIdleTimeout(); // 恢复扫描后停止空闲计时
|
|
|
+ // Log.d(RfidConstants.TAG, "亮屏恢复RFID扫描成功");
|
|
|
+ // if (listener != null) {
|
|
|
+ // listener.onTagScanned(rrlib.getInventoryTagMapList()); // 触发一次扫描回调
|
|
|
+ // }
|
|
|
} catch (InterruptedException e) {
|
|
|
Thread.currentThread().interrupt();
|
|
|
Log.e(RfidConstants.TAG, "恢复扫描线程被中断", e);
|
|
|
@@ -388,65 +452,71 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- executorService.execute(() -> {
|
|
|
- boolean connected = false;
|
|
|
- int result = -1;
|
|
|
-
|
|
|
- try {
|
|
|
- for (int i = 0; i < retryTimes && !connected; i++) {
|
|
|
- Log.d(RfidConstants.TAG, "连接重试第 " + (i + 1) + " 次");
|
|
|
- for (String port : devPorts) {
|
|
|
- for (int baud : baudRates) {
|
|
|
- // 尝试连接端口
|
|
|
- result = rrlib.Connect(port, baud);
|
|
|
- Log.d(RfidConstants.TAG, "Connect to " + port + " with baud " + baud + ": " + result);
|
|
|
-
|
|
|
- if (result == 0) {
|
|
|
- // 连接成功
|
|
|
- isConnected = true;
|
|
|
- connected = true;
|
|
|
- Log.d(RfidConstants.TAG, "RFID设备连接成功:端口=" + port + ",波特率=" + baud);
|
|
|
- if (listener != null) {
|
|
|
- listener.onConnectSuccess(port, baud);
|
|
|
- }
|
|
|
- // 连接成功后立即获取阅读器参数
|
|
|
- readerParameter = rrlib.GetInventoryParameter();
|
|
|
- byte[] Version = new byte[4];
|
|
|
- byte[] Power = new byte[1];
|
|
|
- byte[] band = new byte[1];
|
|
|
- byte[] MaxFre = new byte[1];
|
|
|
- byte[] MinFre = new byte[1];
|
|
|
- byte[] BeepEn = new byte[1];
|
|
|
- byte[] Ant = new byte[1];
|
|
|
- byte[] ScanTime = new byte[1];
|
|
|
- byte[] powermode = new byte[1];
|
|
|
-
|
|
|
- int b_result = rrlib.GetUHFInformation(Version, Power, band, MaxFre, MinFre, BeepEn, Ant);
|
|
|
- if (b_result == 0) {
|
|
|
- this.power = Power[0];
|
|
|
- }
|
|
|
- Log.d(RfidConstants.TAG, "Reader parameter: " + readerParameter);
|
|
|
- return; // 跳出所有循环
|
|
|
+ boolean connected = false;
|
|
|
+ int result = -1;
|
|
|
+ try {
|
|
|
+ for (int i = 1; i <= retryTimes && !connected; i++) {
|
|
|
+ Log.d(RfidConstants.TAG, "====> 第 " + i + " 次连接 <====");
|
|
|
+ for (String port : devPorts) {
|
|
|
+ for (int baud : baudRates) {
|
|
|
+ // 尝试连接端口
|
|
|
+ result = rrlib.Connect(port, baud);
|
|
|
+ Log.i(RfidConstants.TAG, "RFID设备连接到" + port + ",波率: " + baud + ",结果: " + result);
|
|
|
+
|
|
|
+ if (result == 0) {
|
|
|
+ // 连接成功
|
|
|
+ isConnected = true;
|
|
|
+ connected = true;
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备连接成功:端口=" + port + ",波特率=" + baud);
|
|
|
+ if (listener != null) {
|
|
|
+ listener.onConnectSuccess(port, baud);
|
|
|
}
|
|
|
+ // 连接成功后立即获取阅读器参数
|
|
|
+ readerParameter = rrlib.GetInventoryParameter();
|
|
|
+ byte[] Version = new byte[4];
|
|
|
+ byte[] Power = new byte[1];
|
|
|
+ byte[] band = new byte[1];
|
|
|
+ byte[] MaxFre = new byte[1];
|
|
|
+ byte[] MinFre = new byte[1];
|
|
|
+ byte[] BeepEn = new byte[1];
|
|
|
+ byte[] Ant = new byte[1];
|
|
|
+ byte[] ScanTime = new byte[1];
|
|
|
+ byte[] powermode = new byte[1];
|
|
|
+
|
|
|
+ int b_result = rrlib.GetUHFInformation(Version, Power, band, MaxFre, MinFre, BeepEn, Ant);
|
|
|
+ if (b_result == 0) {
|
|
|
+ this.power = Power[0];
|
|
|
+ Log.d(RfidConstants.TAG, "Reader 功率: " + this.power);
|
|
|
+ }
|
|
|
+ Log.d(RfidConstants.TAG, "Reader 参数: " + readerParameter);
|
|
|
+ Log.d(RfidConstants.TAG, "Reader QValue: " + readerParameter.QValue);
|
|
|
+ Log.d(RfidConstants.TAG, "Reader Session: " + readerParameter.Session);
|
|
|
+ Log.d(RfidConstants.TAG, "Reader ScanTime: " + readerParameter.ScanTime);
|
|
|
+ Log.d(RfidConstants.TAG, "Reader Interval: " + readerParameter.Interval);
|
|
|
+ Log.d(RfidConstants.TAG, "Reader TidLen: " + readerParameter.TidLen);
|
|
|
+ Log.d(RfidConstants.TAG, "Reader TidPtr: " + readerParameter.TidPtr);
|
|
|
+ break; // 跳出所有循环
|
|
|
+ }else {
|
|
|
+ Log.e(RfidConstants.TAG, "连接["+ i +"]: " + result);
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 所有重试失败
|
|
|
- if (!connected) {
|
|
|
- Log.e(RfidConstants.TAG, "RFID设备连接失败,已重试 " + retryTimes + " 次");
|
|
|
- if (listener != null) {
|
|
|
- listener.onConnectFailed();
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "Connect error", e);
|
|
|
- isConnected = false;
|
|
|
+ // 所有重试失败
|
|
|
+ if (!connected) {
|
|
|
+ Log.e(RfidConstants.TAG, "RFID设备连接失败,已重试 " + retryTimes + " 次");
|
|
|
if (listener != null) {
|
|
|
listener.onConnectFailed();
|
|
|
}
|
|
|
}
|
|
|
- });
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(RfidConstants.TAG, "Connect error", e);
|
|
|
+ isConnected = false;
|
|
|
+ if (listener != null) {
|
|
|
+ listener.onConnectFailed();
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return false; // 异步连接,返回false表示正在连接中
|
|
|
}
|
|
|
@@ -480,11 +550,12 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
-
|
|
|
- /**
|
|
|
- * 开始扫描标签
|
|
|
- */
|
|
|
- public boolean startScan() {
|
|
|
+
|
|
|
+ public boolean startScan(boolean multipleTag) {
|
|
|
+ Log.d(RfidConstants.TAG, "=====>RFID设备开始扫描");
|
|
|
+ if(!isConnected){
|
|
|
+ connect();
|
|
|
+ }
|
|
|
if (!isConnected) {
|
|
|
Log.e(RfidConstants.TAG, "RFID设备未连接,无法开始扫描");
|
|
|
if (listener != null) {
|
|
|
@@ -497,38 +568,60 @@ public class RfidService extends Service {
|
|
|
stopIdleTimeout(); // 重复启动也重置计时
|
|
|
return true;
|
|
|
}
|
|
|
-
|
|
|
+ if(this.isMultipleTag != multipleTag){
|
|
|
+ this.isMultipleTag = multipleTag;
|
|
|
+ setReaderParameter(null);
|
|
|
+ setPower();
|
|
|
+ }
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备扫描,功率:" + getPower() + "W");
|
|
|
+ return _startScan();
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 开始扫描标签
|
|
|
+ */
|
|
|
+ private boolean _startScan() {
|
|
|
isScanning = true;
|
|
|
acquireWakeLock(); // 息屏保持唤醒
|
|
|
stopIdleTimeout(); // 开始扫描,停止空闲计时
|
|
|
-
|
|
|
- executorService.execute(() -> {
|
|
|
- try {
|
|
|
- // 清空历史标签数据
|
|
|
- tagMap.clear();
|
|
|
- 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("Start scan failed with result: " + result);
|
|
|
- }
|
|
|
- Log.d(RfidConstants.TAG, "RFID扫描已启动");
|
|
|
- } catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "Start scan error", e);
|
|
|
+ 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("未能识别到电子标签!");
|
|
|
isScanning = false;
|
|
|
- releaseWakeLock();
|
|
|
- resetIdleTimeout(); // 启动失败,启动空闲计时
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("开始扫描失败:" + e.getMessage());
|
|
|
+ listener.onScanError("未能识别到电子标签!");
|
|
|
}
|
|
|
+ return false;
|
|
|
}
|
|
|
- });
|
|
|
+ Log.d(RfidConstants.TAG, "RFID扫描已启动");
|
|
|
+ // 1 秒后停止扫描
|
|
|
+ idleHandler.postDelayed(() -> {
|
|
|
+ Log.d(RfidConstants.TAG, "1秒RFID扫描自动停止");
|
|
|
+ if (isScanning) {
|
|
|
+ stopScan();
|
|
|
+ if(listener != null && (!isMultipleTag || isMultipleTag && rrlib.getInventoryTagMapList().size()==0 )){
|
|
|
+ listener.onScanError("未扫描到电子编号");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, 1 * 1000);
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(RfidConstants.TAG, "扫描失败:", e);
|
|
|
+ isScanning = false;
|
|
|
+ releaseWakeLock();
|
|
|
+ resetIdleTimeout(); // 启动失败,启动空闲计时
|
|
|
+ if (listener != null) {
|
|
|
+ listener.onScanError("扫描失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
@@ -538,24 +631,21 @@ public class RfidService extends Service {
|
|
|
*/
|
|
|
public void stopScan() {
|
|
|
if (!isScanning) {
|
|
|
- Log.w(RfidConstants.TAG, "RFID未在扫描中,无需停止");
|
|
|
+ // Log.w(RfidConstants.TAG, "RFID未在扫描中,无需停止");
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
- executorService.execute(() -> {
|
|
|
- try {
|
|
|
- rrlib.StopRead();
|
|
|
- isScanning = false;
|
|
|
- releaseWakeLock(); // 释放唤醒锁
|
|
|
- resetIdleTimeout(); // 停止扫描,启动空闲计时
|
|
|
- Log.d(RfidConstants.TAG, "RFID扫描已停止");
|
|
|
- } catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "Stop scan error", e);
|
|
|
- if (listener != null) {
|
|
|
- listener.onScanError("停止扫描失败:" + e.getMessage());
|
|
|
- }
|
|
|
+ try {
|
|
|
+ rrlib.StopRead();
|
|
|
+ isScanning = false;
|
|
|
+ releaseWakeLock(); // 释放唤醒锁
|
|
|
+ resetIdleTimeout(); // 停止扫描,启动空闲计时
|
|
|
+ Log.d(RfidConstants.TAG, "RFID扫描已停止");
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(RfidConstants.TAG, "Stop scan error", e);
|
|
|
+ if (listener != null) {
|
|
|
+ listener.onScanError("停止扫描失败:" + e.getMessage());
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -586,26 +676,26 @@ public class RfidService extends Service {
|
|
|
} else {
|
|
|
paramToUse = param;
|
|
|
}
|
|
|
+ paramToUse.QValue = isMultipleTag ? 4 : 0;
|
|
|
// 打印参数
|
|
|
+ Log.d(RfidConstants.TAG, "isMultipleTag: " + isMultipleTag);
|
|
|
Log.d(RfidConstants.TAG, "ScanTime: " + paramToUse.ScanTime);
|
|
|
Log.d(RfidConstants.TAG, "QValue: " + paramToUse.QValue);
|
|
|
Log.d(RfidConstants.TAG, "Session: " + paramToUse.Session);
|
|
|
Log.d(RfidConstants.TAG, "TidLen: " + paramToUse.TidLen);
|
|
|
Log.d(RfidConstants.TAG, "TidPtr: " + paramToUse.TidPtr);
|
|
|
Log.d(RfidConstants.TAG, "AsciiPtr: " + paramToUse.AsciiPtr);
|
|
|
- Log.d(RfidConstants.TAG, "jgTimes: " + paramToUse.Interval);
|
|
|
- executorService.execute(() -> {
|
|
|
- try {
|
|
|
- rrlib.SetInventoryParameter(paramToUse);
|
|
|
- this.readerParameter = paramToUse;
|
|
|
- Log.d(RfidConstants.TAG, "阅读器参数设置成功");
|
|
|
- } catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "Set parameter error", e);
|
|
|
- if (listener != null) {
|
|
|
- listener.onScanError("设置阅读器参数失败:" + e.getMessage());
|
|
|
- }
|
|
|
+ Log.d(RfidConstants.TAG, "Interval: " + paramToUse.Interval);
|
|
|
+ try {
|
|
|
+ rrlib.SetInventoryParameter(paramToUse);
|
|
|
+ this.readerParameter = paramToUse;
|
|
|
+ Log.d(RfidConstants.TAG, "阅读器参数设置成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(RfidConstants.TAG, "阅读器参数设置错误:", e);
|
|
|
+ if (listener != null) {
|
|
|
+ listener.onScanError("设置阅读器参数失败:" + e.getMessage());
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
public void setPower(int power) {
|
|
|
@@ -624,18 +714,20 @@ public class RfidService extends Service {
|
|
|
Log.w(RfidConstants.TAG, "功率不能大于33W,忽略设置");
|
|
|
return;
|
|
|
}
|
|
|
- executorService.execute(() -> {
|
|
|
- try {
|
|
|
- rrlib.SetRfPower(power);
|
|
|
- this.power = power;
|
|
|
- Log.d(RfidConstants.TAG, "功率设置成功");
|
|
|
- } catch (Exception e) {
|
|
|
- Log.e(RfidConstants.TAG, "Set power error", e);
|
|
|
- if (listener != null) {
|
|
|
- listener.onScanError("设置功率失败:" + e.getMessage());
|
|
|
- }
|
|
|
+ try {
|
|
|
+ rrlib.SetRfPower(power);
|
|
|
+ this.power = power;
|
|
|
+ Log.d(RfidConstants.TAG, "功率设置成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(RfidConstants.TAG, "设置功率失败:", e);
|
|
|
+ if (listener != null) {
|
|
|
+ listener.onScanError("设置功率失败:" + e.getMessage());
|
|
|
}
|
|
|
- });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setMultipleTag(boolean multipleTag) {
|
|
|
+ this.isMultipleTag = multipleTag;
|
|
|
}
|
|
|
|
|
|
// -------------------------- 状态查询API --------------------------
|
|
|
@@ -648,9 +740,7 @@ public class RfidService extends Service {
|
|
|
return power;
|
|
|
}
|
|
|
|
|
|
- public Map<String, Integer> getTagMap() {
|
|
|
- return new ConcurrentHashMap<>(tagMap); // 返回副本,避免外部修改
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
public boolean isConnected() {
|
|
|
return isConnected;
|
|
|
@@ -664,6 +754,10 @@ public class RfidService extends Service {
|
|
|
return isScreenOn;
|
|
|
}
|
|
|
|
|
|
+ public boolean isMultipleTag() {
|
|
|
+ return isMultipleTag;
|
|
|
+ }
|
|
|
+
|
|
|
public int getConnectRetryTimes() {
|
|
|
return connectRetryTimes;
|
|
|
}
|
|
|
@@ -677,20 +771,17 @@ public class RfidService extends Service {
|
|
|
}
|
|
|
|
|
|
// -------------------------- 内部工具方法 --------------------------
|
|
|
- /**
|
|
|
- * 更新标签计数
|
|
|
- */
|
|
|
- private void updateTagMap(List<InventoryTagMap> tags) {
|
|
|
- for (InventoryTagMap tag : tags) {
|
|
|
- if (tag != null && tag.strEPC != null) {
|
|
|
- String epc = tag.strEPC.trim();
|
|
|
- if (!epc.isEmpty()) {
|
|
|
- tagMap.put(epc, tagMap.getOrDefault(epc, 0) + 1);
|
|
|
- }
|
|
|
- }
|
|
|
+
|
|
|
+
|
|
|
+ private void setPower() {
|
|
|
+ if(isMultipleTag){
|
|
|
+ setPower(RfidConstants.POWER_HIGH);
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备启动多标签扫描,功率:" + getPower() + "W");
|
|
|
+ }else{
|
|
|
+ setPower(RfidConstants.POWER_LOW);
|
|
|
+ Log.d(RfidConstants.TAG, "RFID设备启动单标签扫描,功率:" + getPower() + "W");
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
/**
|
|
|
* 获取唤醒锁(处理息屏场景)
|
|
|
*/
|
|
|
@@ -738,52 +829,50 @@ public class RfidService extends Service {
|
|
|
if (arg != null) {
|
|
|
// 读取EPC并处理编码格式
|
|
|
String epc = arg.epcId.toUpperCase();
|
|
|
-
|
|
|
int encodingFormat = readerParameter.AsciiPtr;
|
|
|
if (encodingFormat == 1 && readerParameter.TidLen == 0) {
|
|
|
asciiNum = 1;
|
|
|
} else {
|
|
|
asciiNum = 0;
|
|
|
}
|
|
|
-
|
|
|
// 转换EPC为ASCII格式(如果需要)
|
|
|
if (asciiNum == 1) {
|
|
|
epc = hexToAscii(epc);
|
|
|
}
|
|
|
+ final String processedEpc = epc; // 创建一个局部final变量供lambda使用
|
|
|
+ InventoryTagMap m = rrlib.getInventoryTagMapList().stream()
|
|
|
+ .filter(item -> processedEpc.equals(item.strEPC))
|
|
|
+ .findFirst()
|
|
|
+ .orElse(null);
|
|
|
|
|
|
- InventoryTagMap m;
|
|
|
- Integer findIndex = tagMap.get(epc);
|
|
|
- Log.d(RfidConstants.TAG, "tagCallback: findIndex -->" + findIndex);
|
|
|
-
|
|
|
- if (findIndex == null) {
|
|
|
+ if (m == null) {
|
|
|
// 新标签:播放提示音并添加到列表
|
|
|
- rrlib.beginSound(false);
|
|
|
- tagMap.put(epc, tagMap.size());
|
|
|
+ Log.d(RfidConstants.TAG, "tagCallback: new InventoryTagMap :" +m);
|
|
|
m = new InventoryTagMap();
|
|
|
- m.strEPC = epc;
|
|
|
+ m.strEPC = processedEpc;
|
|
|
m.antenna = arg.antId;
|
|
|
m.strRSSI = String.valueOf(arg.rssi);
|
|
|
m.nReadCount = 1;
|
|
|
rrlib.getInventoryTagMapList().add(m);
|
|
|
+ // 使用SoundService播放音效
|
|
|
+ soundService.playBeep();
|
|
|
} else {
|
|
|
- // 已有标签:更新计数和信号强度
|
|
|
- rrlib.beginSound(true);
|
|
|
- m = rrlib.getInventoryTagMapList().get(findIndex);
|
|
|
- m.antenna |= arg.antId;
|
|
|
+ if(!isMultipleTag){
|
|
|
+ msgHandler.removeMessages(MSG_STOP_SCAN);
|
|
|
+ msgHandler.sendEmptyMessage(MSG_STOP_SCAN);
|
|
|
+ if(isScanning){
|
|
|
+ msgHandler.removeMessages(MSG_UPDATE_LISTVIEW);
|
|
|
+ msgHandler.sendEmptyMessageDelayed(MSG_UPDATE_LISTVIEW, 50);
|
|
|
+ }
|
|
|
+ }
|
|
|
m.nReadCount++;
|
|
|
- m.strRSSI = String.valueOf(arg.rssi);
|
|
|
}
|
|
|
-
|
|
|
- // 更新标签计数并触发回调
|
|
|
- updateTagMap(rrlib.getInventoryTagMapList());
|
|
|
- resetIdleTimeout(); // 有数据,重置空闲计时
|
|
|
- if (listener != null) {
|
|
|
- listener.onTagScanned(rrlib.getInventoryTagMapList());
|
|
|
+ if(isMultipleTag){
|
|
|
+ Log.d(RfidConstants.TAG, "tagCallback: TAG_COUNT:" + rrlib.getInventoryTagMapList().size());
|
|
|
+ msgHandler.removeMessages(MSG_UPDATE_LISTVIEW);
|
|
|
+ msgHandler.sendEmptyMessageDelayed(MSG_UPDATE_LISTVIEW, 100);
|
|
|
}
|
|
|
- } else {
|
|
|
- rrlib.beginSound(false);
|
|
|
- }
|
|
|
-
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -808,7 +897,7 @@ public class RfidService extends Service {
|
|
|
isScanning = false;
|
|
|
resetIdleTimeout();
|
|
|
if (listener != null) {
|
|
|
- listener.onScanError("扫描已完成");
|
|
|
+ listener.onScanInfo("扫描已完成");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -822,6 +911,7 @@ public class RfidService extends Service {
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
|
|
|
private static String hexToAscii(String hexStr) {
|
|
|
StringBuilder output = new StringBuilder("");
|