首页 > 解决方案 > 如何只读取一个 rfid 标签

问题描述

我正在开发一个只需要读取一个 RFID 标签的应用程序,我尝试只读取第一个读取的 Rfid 标签,但问题是数组的零元素在不断变化。我可以在日志中看到它。

这是我的代码:

'''

// Read/Status Notify handler
// Implement the RfidEventsLister class to receive event notifications
public class EventHandler implements RfidEventsListener {
    // Read Event Notification
    public void eventReadNotify(RfidReadEvents e) {
        // Recommended to use new method getReadTagsEx for better performance in case of large tag population
        TagData[] myTags = reader.Actions.getReadTags(100);

        firstSeenTag = myTags[0].getTagID();
        Log.d(TAG, "firstSeenTag Tag ID " + firstSeenTag);

        if (myTags != null) {
            for (int index = 0; index < myTags.length; index++) {
                Log.d(TAG, "Tag ID " + myTags[index].getTagID());
                if (myTags[index].getOpCode() == ACCESS_OPERATION_CODE.ACCESS_OPERATION_READ &&
                        myTags[index].getOpStatus() == ACCESS_OPERATION_STATUS.ACCESS_SUCCESS) {
                    if (myTags[index].getMemoryBankData().length() > 0) {
                        Log.d(TAG, " Mem Bank Data " + myTags[index].getMemoryBankData());
                    }
                }
                if (myTags[index].isContainsLocationInfo()) {
                    short dist = myTags[index].LocationInfo.getRelativeDistance();
                    Log.d(TAG, "Tag relative distance " + dist);
                }
            }
            // possibly if operation was invoked from async task and still busy
            // handle tag data responses on parallel thread thus THREAD_POOL_EXECUTOR
            new AsyncDataUpdate().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, myTags);
        }
    }

    // Status Event Notification
    public void eventStatusNotify(RfidStatusEvents rfidStatusEvents) {
        Log.d(TAG, "Status Notification: " + rfidStatusEvents.StatusEventData.getStatusEventType());
        if (rfidStatusEvents.StatusEventData.getStatusEventType() == STATUS_EVENT_TYPE.HANDHELD_TRIGGER_EVENT) {
            if (rfidStatusEvents.StatusEventData.HandheldTriggerEventData.getHandheldEvent() == HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_PRESSED) {
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... voids) {
                        context.handleTriggerPress(true);
                        Log.d(TAG, "firstSeenTag TriggerPress Tag ID " + firstSeenTag);
                        return null;
                    }
                }.execute();
            }
            if (rfidStatusEvents.StatusEventData.HandheldTriggerEventData.getHandheldEvent() == HANDHELD_TRIGGER_EVENT_TYPE.HANDHELD_TRIGGER_RELEASED) {
                new AsyncTask<Void, Void, Void>() {
                    @Override
                    protected Void doInBackground(Void... voids) {
                        context.handleTriggerPress(false);
                        Log.d(TAG, "firstSeenTag TriggerRelease Tag ID " + firstSeenTag);
                        return null;
                    }
                }.execute();
            }
        }
    }
}

'''

我尝试将标签数参数更改为 1,但没有效果。

''' TagData[] myTags = reader.Actions.getReadTags(100);

        firstSeenTag = myTags[0].getTagID();
        Log.d(TAG, "firstSeenTag Tag ID " + firstSeenTag);

'''

如您所见,我将数组的零值分配给firstSeenTag变量,但从日志来看,该值分配给读取的每个标签。

读取后的 LogCat

当然,您可以在阅读器上释放触发器的那一刻为变量赋值,但这对用户来说很不方便,因为他只有释放阅读器的触发器才能看到读取 rfid 标签

读取一个 rfid 标签后如何停止读取?

标签: javaandroidrfidmotorola-emdk

解决方案


推荐阅读