|
|
@@ -0,0 +1,576 @@
|
|
|
+package com.vber.chicken_farm.service;
|
|
|
+
|
|
|
+import android.content.Context;
|
|
|
+import android.os.Handler;
|
|
|
+import android.os.Looper;
|
|
|
+import android.os.PowerManager;
|
|
|
+import android.util.Log;
|
|
|
+
|
|
|
+import com.uhf.lcrrgxmodule.factory.ILcUhfProduct;
|
|
|
+import com.uhf.lcrrgxmodule.factory.LcModule;
|
|
|
+import com.rfid.InventoryTagMap;
|
|
|
+import com.rfid.PowerUtil;
|
|
|
+import com.rfid.trans.ReaderParameter;
|
|
|
+import com.rfid.trans.ReadTag;
|
|
|
+import com.rfid.trans.TagCallback;
|
|
|
+
|
|
|
+import java.util.List;
|
|
|
+import java.util.Timer;
|
|
|
+import java.util.TimerTask;
|
|
|
+
|
|
|
+/**
|
|
|
+ * RFID服务类 - 完善版
|
|
|
+ * 包含:连接管理、读写操作、自动断开、息屏/亮屏处理
|
|
|
+ */
|
|
|
+public class RFIDService {
|
|
|
+ private static final String TAG = "RFIDService";
|
|
|
+ private static final String DEVICE_PORT1 = "/dev/ttyS3";
|
|
|
+ private static final String DEVICE_PORT2 = "/dev/ttyS2";
|
|
|
+ private static final int[] BAUD_RATE_LIST = {115200, 460800, 57600};
|
|
|
+
|
|
|
+ // 自动断开阈值(默认5分钟,单位:毫秒)
|
|
|
+ private static final long DEFAULT_IDLE_DISCONNECT_TIME = 5 * 60 * 1000;
|
|
|
+ // 心跳检测间隔(默认30秒)
|
|
|
+ private static final long HEARTBEAT_INTERVAL = 30 * 1000;
|
|
|
+
|
|
|
+ private Context mContext;
|
|
|
+ private ILcUhfProduct rrlib;
|
|
|
+ private boolean isConnected = false;
|
|
|
+ private boolean isReading = false;
|
|
|
+ private ReaderParameter readerParameter;
|
|
|
+
|
|
|
+ // 自动断开相关
|
|
|
+ private Timer idleTimer;
|
|
|
+ private Handler mainHandler;
|
|
|
+ private long idleDisconnectTime = DEFAULT_IDLE_DISCONNECT_TIME;
|
|
|
+ private PowerManager.WakeLock wakeLock; // 息屏保活锁
|
|
|
+
|
|
|
+ // 外部回调
|
|
|
+ private RFIDStatusCallback statusCallback;
|
|
|
+ private TagReadCallback tagReadCallback;
|
|
|
+
|
|
|
+ // 构造函数
|
|
|
+ public RFIDService(Context context) {
|
|
|
+ this.mContext = context.getApplicationContext(); // 避免内存泄漏
|
|
|
+ this.mainHandler = new Handler(Looper.getMainLooper());
|
|
|
+ initReader();
|
|
|
+ initWakeLock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化RFID阅读器
|
|
|
+ */
|
|
|
+ private void initReader() {
|
|
|
+ try {
|
|
|
+ rrlib = new LcModule(mContext).createProduct();
|
|
|
+ } catch (Throwable e) {
|
|
|
+ Log.e(TAG, "初始化RFID阅读器失败", e);
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_INIT_FAILED);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 初始化息屏唤醒锁
|
|
|
+ */
|
|
|
+ private void initWakeLock() {
|
|
|
+ PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
|
|
|
+ if (powerManager != null) {
|
|
|
+ wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "RFIDService:WakeLock");
|
|
|
+ wakeLock.setReferenceCounted(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 连接管理核心API ========================
|
|
|
+ /**
|
|
|
+ * 连接RFID设备
|
|
|
+ * @param retryTimes 重试次数
|
|
|
+ * @return 连接结果
|
|
|
+ */
|
|
|
+ public synchronized boolean connect(int retryTimes) {
|
|
|
+ if (isConnected) {
|
|
|
+ resetIdleTimer(); // 重置闲置计时器
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ Log.d(TAG, "开始连接RFID设备,重试次数:" + retryTimes);
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_CONNECTING);
|
|
|
+
|
|
|
+ PowerUtil.power("1"); // 设备上电
|
|
|
+ boolean connected = false;
|
|
|
+
|
|
|
+ // 多端口+多波特率重试连接
|
|
|
+ for (int i = 0; i < retryTimes && !connected; i++) {
|
|
|
+ for (int baud : BAUD_RATE_LIST) {
|
|
|
+ if (tryConnect(DEVICE_PORT1, baud) || tryConnect(DEVICE_PORT2, baud)) {
|
|
|
+ connected = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (connected) {
|
|
|
+ isConnected = true;
|
|
|
+ readerParameter = rrlib.GetInventoryParameter();
|
|
|
+ startIdleTimer(); // 启动闲置计时器
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_CONNECTED);
|
|
|
+ Log.d(TAG, "RFID设备连接成功");
|
|
|
+ } else {
|
|
|
+ PowerUtil.power("0"); // 连接失败下电
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_CONNECT_FAILED);
|
|
|
+ Log.e(TAG, "RFID设备连接失败");
|
|
|
+ }
|
|
|
+ return connected;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 尝试单个端口+波特率连接
|
|
|
+ */
|
|
|
+ private boolean tryConnect(String port, int baud) {
|
|
|
+ try {
|
|
|
+ int result = rrlib.Connect(port, baud);
|
|
|
+ Log.d(TAG, "尝试连接 - 端口:" + port + " 波特率:" + baud + " 结果:" + result);
|
|
|
+ return result == 0;
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "端口连接异常", e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 断开RFID连接
|
|
|
+ */
|
|
|
+ public synchronized void disconnect() {
|
|
|
+ if (!isConnected) return;
|
|
|
+
|
|
|
+ Log.d(TAG, "断开RFID设备连接");
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_DISCONNECTING);
|
|
|
+
|
|
|
+ // 停止读取和计时器
|
|
|
+ stopReading();
|
|
|
+ stopIdleTimer();
|
|
|
+
|
|
|
+ // 断开硬件连接
|
|
|
+ try {
|
|
|
+ if (rrlib != null) {
|
|
|
+ rrlib.DisConnect();
|
|
|
+ }
|
|
|
+ PowerUtil.power("0"); // 设备下电
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "断开连接异常", e);
|
|
|
+ }
|
|
|
+
|
|
|
+ isConnected = false;
|
|
|
+ releaseWakeLock(); // 释放唤醒锁
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_DISCONNECTED);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 自动断开相关 ========================
|
|
|
+ /**
|
|
|
+ * 设置自动断开闲置时间(毫秒)
|
|
|
+ * @param time 闲置时间,<=0则关闭自动断开
|
|
|
+ */
|
|
|
+ public void setIdleDisconnectTime(long time) {
|
|
|
+ this.idleDisconnectTime = time;
|
|
|
+ if (isConnected) {
|
|
|
+ restartIdleTimer();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 启动闲置计时器
|
|
|
+ */
|
|
|
+ private void startIdleTimer() {
|
|
|
+ stopIdleTimer();
|
|
|
+ if (idleDisconnectTime <= 0) return;
|
|
|
+
|
|
|
+ idleTimer = new Timer("RFIDIdleTimer", true);
|
|
|
+ idleTimer.scheduleAtFixedRate(new TimerTask() {
|
|
|
+ private long lastActiveTime = System.currentTimeMillis();
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void run() {
|
|
|
+ long currentTime = System.currentTimeMillis();
|
|
|
+ // 检测闲置超时
|
|
|
+ if (currentTime - lastActiveTime >= idleDisconnectTime) {
|
|
|
+ mainHandler.post(() -> {
|
|
|
+ Log.d(TAG, "RFID闲置超时,自动断开连接");
|
|
|
+ disconnect();
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_IDLE_DISCONNECT);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 心跳检测(可选)
|
|
|
+ if (isConnected && !isReading) {
|
|
|
+ checkHeartbeat();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }, HEARTBEAT_INTERVAL, HEARTBEAT_INTERVAL);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置闲置计时器(有操作时调用)
|
|
|
+ */
|
|
|
+ private void resetIdleTimer() {
|
|
|
+ if (idleTimer != null) {
|
|
|
+ idleTimer.cancel();
|
|
|
+ startIdleTimer();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 停止闲置计时器
|
|
|
+ */
|
|
|
+ private void stopIdleTimer() {
|
|
|
+ if (idleTimer != null) {
|
|
|
+ idleTimer.cancel();
|
|
|
+ idleTimer = null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重启闲置计时器
|
|
|
+ */
|
|
|
+ private void restartIdleTimer() {
|
|
|
+ stopIdleTimer();
|
|
|
+ startIdleTimer();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 心跳检测(确保连接有效)
|
|
|
+ */
|
|
|
+ private void checkHeartbeat() {
|
|
|
+ try {
|
|
|
+ if (rrlib != null) {
|
|
|
+ rrlib.GetInventoryParameter(); // 简单的心跳指令
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "心跳检测失败,连接已失效", e);
|
|
|
+ mainHandler.post(this::disconnect);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 息屏/亮屏处理API ========================
|
|
|
+ /**
|
|
|
+ * 息屏时的处理(外部调用)
|
|
|
+ * 建议在Activity的onPause/onStop中调用
|
|
|
+ */
|
|
|
+ public void onScreenOff() {
|
|
|
+ Log.d(TAG, "屏幕熄灭,处理RFID操作");
|
|
|
+ // 息屏时停止读取,但保持连接(可根据需求调整)
|
|
|
+ stopReading();
|
|
|
+ // 申请唤醒锁,保证后台连接不被系统杀死
|
|
|
+ acquireWakeLock();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 亮屏时的处理(外部调用)
|
|
|
+ * 建议在Activity的onResume中调用
|
|
|
+ */
|
|
|
+ public void onScreenOn() {
|
|
|
+ Log.d(TAG, "屏幕点亮,恢复RFID操作");
|
|
|
+ releaseWakeLock(); // 释放唤醒锁
|
|
|
+ resetIdleTimer(); // 重置闲置计时器
|
|
|
+ // 亮屏后可自动恢复读取(可选,根据业务需求)
|
|
|
+ // if (isConnected) startReading(tagReadCallback);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 申请唤醒锁
|
|
|
+ */
|
|
|
+ private void acquireWakeLock() {
|
|
|
+ if (wakeLock != null && !wakeLock.isHeld()) {
|
|
|
+ wakeLock.acquire(10 * 60 * 1000); // 最多持有10分钟
|
|
|
+ Log.d(TAG, "唤醒锁已申请");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 释放唤醒锁
|
|
|
+ */
|
|
|
+ private void releaseWakeLock() {
|
|
|
+ if (wakeLock != null && wakeLock.isHeld()) {
|
|
|
+ wakeLock.release();
|
|
|
+ Log.d(TAG, "唤醒锁已释放");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 读写操作核心API ========================
|
|
|
+ /**
|
|
|
+ * 开始读取标签
|
|
|
+ */
|
|
|
+ public synchronized boolean startReading(TagReadCallback callback) {
|
|
|
+ if (!isConnected) {
|
|
|
+ notifyError("未连接RFID设备");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.tagReadCallback = callback;
|
|
|
+ isReading = true;
|
|
|
+ resetIdleTimer(); // 重置闲置计时器
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 清空历史数据
|
|
|
+ rrlib.getInventoryTagMapList().clear();
|
|
|
+ rrlib.getInventoryTagResultList().clear();
|
|
|
+ // 设置回调
|
|
|
+ rrlib.SetCallBack(new InternalTagCallback());
|
|
|
+ boolean success = rrlib.StartRead() == 0;
|
|
|
+
|
|
|
+ if (success) {
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_READING);
|
|
|
+ Log.d(TAG, "开始读取标签成功");
|
|
|
+ } else {
|
|
|
+ notifyError("开始读取标签失败");
|
|
|
+ }
|
|
|
+ return success;
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "开始读取标签异常", e);
|
|
|
+ notifyError("读取异常:" + e.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 停止读取标签
|
|
|
+ */
|
|
|
+ public synchronized void stopReading() {
|
|
|
+ if (!isConnected || !isReading) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (rrlib != null) {
|
|
|
+ rrlib.StopRead();
|
|
|
+ }
|
|
|
+ isReading = false;
|
|
|
+ resetIdleTimer(); // 重置闲置计时器
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_READ_STOPPED);
|
|
|
+ Log.d(TAG, "停止读取标签成功");
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "停止读取标签异常", e);
|
|
|
+ notifyError("停止读取异常:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 读取标签数据
|
|
|
+ */
|
|
|
+ public String readData(String epc, byte mem, int wordPtr, byte num, byte[] password) {
|
|
|
+ if (!isConnected) {
|
|
|
+ notifyError("未连接RFID设备");
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ resetIdleTimer(); // 重置闲置计时器
|
|
|
+ try {
|
|
|
+ ReaderParameter param = rrlib.GetInventoryParameter();
|
|
|
+ if (param.AsciiPtr == 1) {
|
|
|
+ epc = asciiToHex(epc);
|
|
|
+ }
|
|
|
+
|
|
|
+ String result = param.TidLen == 0
|
|
|
+ ? rrlib.ReadDataByEPC(epc, mem, wordPtr, num, password)
|
|
|
+ : rrlib.ReadDataByTID(epc, mem, wordPtr, num, password);
|
|
|
+
|
|
|
+ Log.d(TAG, "读取标签数据成功:" + result);
|
|
|
+ return result;
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "读取标签数据异常", e);
|
|
|
+ notifyError("读取数据异常:" + e.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 写入标签数据
|
|
|
+ */
|
|
|
+ public boolean writeData(String epc, byte mem, int wordPtr, byte[] password, String data) {
|
|
|
+ if (!isConnected) {
|
|
|
+ notifyError("未连接RFID设备");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ resetIdleTimer(); // 重置闲置计时器
|
|
|
+ try {
|
|
|
+ ReaderParameter param = rrlib.GetInventoryParameter();
|
|
|
+ if (param.AsciiPtr == 1) {
|
|
|
+ epc = asciiToHex(epc);
|
|
|
+ }
|
|
|
+
|
|
|
+ int result = param.TidLen == 0
|
|
|
+ ? rrlib.WriteDataByEPC(epc, mem, wordPtr, password, data)
|
|
|
+ : rrlib.WriteDataByTID(epc, mem, (byte) wordPtr, password, data);
|
|
|
+
|
|
|
+ boolean success = result == 0;
|
|
|
+ if (success) {
|
|
|
+ Log.d(TAG, "写入标签数据成功");
|
|
|
+ } else {
|
|
|
+ notifyError("写入数据失败,错误码:" + result);
|
|
|
+ }
|
|
|
+ return success;
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "写入标签数据异常", e);
|
|
|
+ notifyError("写入数据异常:" + e.getMessage());
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 辅助方法 ========================
|
|
|
+ private String asciiToHex(String asciiStr) {
|
|
|
+ char[] chars = asciiStr.toCharArray();
|
|
|
+ StringBuilder hex = new StringBuilder();
|
|
|
+ for (char ch : chars) {
|
|
|
+ hex.append(Integer.toHexString((int) ch));
|
|
|
+ }
|
|
|
+ return hex.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 回调与通知 ========================
|
|
|
+ /**
|
|
|
+ * 设置RFID状态回调(外部监听连接/读取状态)
|
|
|
+ */
|
|
|
+ public void setRFIDStatusCallback(RFIDStatusCallback callback) {
|
|
|
+ this.statusCallback = callback;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通知状态变化
|
|
|
+ */
|
|
|
+ private void notifyStatusChange(RFIDStatus status) {
|
|
|
+ if (statusCallback != null) {
|
|
|
+ mainHandler.post(() -> statusCallback.onStatusChange(status));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通知错误信息
|
|
|
+ */
|
|
|
+ private void notifyError(String error) {
|
|
|
+ if (tagReadCallback != null) {
|
|
|
+ mainHandler.post(() -> tagReadCallback.onReadError(error));
|
|
|
+ }
|
|
|
+ if (statusCallback != null) {
|
|
|
+ mainHandler.post(() -> statusCallback.onError(error));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 内部标签读取回调
|
|
|
+ */
|
|
|
+ private class InternalTagCallback implements TagCallback {
|
|
|
+ @Override
|
|
|
+ public void tagCallback(ReadTag readTag) {
|
|
|
+ mainHandler.post(() -> {
|
|
|
+ if (tagReadCallback != null && isReading) {
|
|
|
+ List<InventoryTagMap> tagList = rrlib.getInventoryTagMapList();
|
|
|
+ tagReadCallback.onTagRead(tagList);
|
|
|
+ resetIdleTimer(); // 有数据读取,重置计时器
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void FinishCallBack() {
|
|
|
+ // 标签读取完成回调
|
|
|
+ isReading = false;
|
|
|
+ mainHandler.post(() -> {
|
|
|
+ notifyStatusChange(RFIDStatus.STATUS_READ_STOPPED);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int CRCErrorCallBack(int reason) {
|
|
|
+ // CRC错误回调处理
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public int tagCallbackFailed(int reason) {
|
|
|
+ // 标签回调失败处理
|
|
|
+ mainHandler.post(() -> {
|
|
|
+ if (tagReadCallback != null) {
|
|
|
+ tagReadCallback.onReadError("标签读取失败,错误码:" + reason);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 外部接口定义 ========================
|
|
|
+ /**
|
|
|
+ * 标签读取回调
|
|
|
+ */
|
|
|
+ public interface TagReadCallback {
|
|
|
+ void onTagRead(List<InventoryTagMap> tagList);
|
|
|
+ void onReadError(String error);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * RFID状态枚举
|
|
|
+ */
|
|
|
+ public enum RFIDStatus {
|
|
|
+ STATUS_INIT_FAILED, // 初始化失败
|
|
|
+ STATUS_CONNECTING, // 连接中
|
|
|
+ STATUS_CONNECTED, // 已连接
|
|
|
+ STATUS_CONNECT_FAILED, // 连接失败
|
|
|
+ STATUS_DISCONNECTING, // 断开中
|
|
|
+ STATUS_DISCONNECTED, // 已断开
|
|
|
+ STATUS_IDLE_DISCONNECT,// 闲置自动断开
|
|
|
+ STATUS_READING, // 读取中
|
|
|
+ STATUS_READ_STOPPED // 读取已停止
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * RFID状态回调(外部监听整体状态)
|
|
|
+ */
|
|
|
+ public interface RFIDStatusCallback {
|
|
|
+ void onStatusChange(RFIDStatus status);
|
|
|
+ void onError(String errorMsg);
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 状态查询API ========================
|
|
|
+ public boolean isConnected() {
|
|
|
+ return isConnected;
|
|
|
+ }
|
|
|
+
|
|
|
+ public boolean isReading() {
|
|
|
+ return isReading;
|
|
|
+ }
|
|
|
+
|
|
|
+ public ReaderParameter getInventoryParameter() {
|
|
|
+ if (isConnected && rrlib != null) {
|
|
|
+ try {
|
|
|
+ readerParameter = rrlib.GetInventoryParameter();
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "获取参数失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return readerParameter;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void setInventoryParameter(ReaderParameter param) {
|
|
|
+ if (isConnected && rrlib != null) {
|
|
|
+ try {
|
|
|
+ rrlib.SetInventoryParameter(param);
|
|
|
+ readerParameter = param;
|
|
|
+ resetIdleTimer();
|
|
|
+ } catch (Exception e) {
|
|
|
+ Log.e(TAG, "设置参数失败", e);
|
|
|
+ notifyError("设置参数异常:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ======================== 生命周期管理 ========================
|
|
|
+ /**
|
|
|
+ * 销毁服务(外部调用,释放所有资源)
|
|
|
+ */
|
|
|
+ public void destroy() {
|
|
|
+ disconnect();
|
|
|
+ stopIdleTimer();
|
|
|
+ releaseWakeLock();
|
|
|
+ mContext = null;
|
|
|
+ statusCallback = null;
|
|
|
+ tagReadCallback = null;
|
|
|
+ Log.d(TAG, "RFIDService已销毁,资源释放完成");
|
|
|
+ }
|
|
|
+}
|