When I test the sample code available at this url(https://www.zebra.com/us/en/support-downloads/software/demo/123rfid-mobile.html), this code reads tags almost 10 times faster than my code. Most of the parts look like identical My device model is Zebra RFD8500
I tested on both sides, with and without the interface, but my code always ran slowly. Thanks for your help
private class CreateInstanceTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
Log.d(TAG, "CreateInstanceTask");
// Based on support available on host device choose the reader type
InvalidUsageException invalidUsageException = null;
readers = new Readers(context, ENUM_TRANSPORT.BLUETOOTH);
try {
availableRFIDReaderList = readers.GetAvailableRFIDReaderList();
} catch (InvalidUsageException e) {
e.printStackTrace();
}
catch(Exception ex){
ex.printStackTrace();
}
if (invalidUsageException != null) {
readers.Dispose();
readers = null;
if (readers == null) {
readers = new Readers(context, ENUM_TRANSPORT.BLUETOOTH);
}
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
connectReader();
}
}
private void ConfigureReader() {
Log.d(TAG, "ConfigureReader " + reader.getHostName());
if (reader.isConnected()) {
TriggerInfo triggerInfo = new TriggerInfo();
triggerInfo.StartTrigger.setTriggerType(START_TRIGGER_TYPE.START_TRIGGER_TYPE_IMMEDIATE);
triggerInfo.StopTrigger.setTriggerType(STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_IMMEDIATE);
try {
// receive events from reader
if (eventHandler == null)
eventHandler = new EventHandler();
reader.Events.addEventsListener(eventHandler);
// HH event
reader.Events.setHandheldEvent(true);
// tag event with tag data
reader.Events.setTagReadEvent(true);
reader.Events.setAttachTagDataWithReadEvent(false);
// set trigger mode as rfid so scanner beam will not come
reader.Config.setTriggerMode(ENUM_TRIGGER_MODE.RFID_MODE, true);
// set start and stop triggers
reader.Config.setStartTrigger(triggerInfo.StartTrigger);
reader.Config.setStopTrigger(triggerInfo.StopTrigger);
// power levels are index based so maximum power supported get the last one
MAX_POWER = reader.ReaderCapabilities.getTransmitPowerLevelValues().length - 1;
// set antenna configurations
Antennas.AntennaRfConfig config = reader.Config.Antennas.getAntennaRfConfig(1);
config.setTransmitPowerIndex(MAX_POWER);
config.setrfModeTableIndex(0);
config.setTari(0);
reader.Config.Antennas.setAntennaRfConfig(1, config);
// Set the singulation control
Antennas.SingulationControl s1_singulationControl = reader.Config.Antennas.getSingulationControl(1);
s1_singulationControl.setSession(SESSION.SESSION_S0);
s1_singulationControl.Action.setInventoryState(INVENTORY_STATE.INVENTORY_STATE_A);
s1_singulationControl.Action.setSLFlag(SL_FLAG.SL_ALL);
reader.Config.Antennas.setSingulationControl(1, s1_singulationControl);
// delete any prefilters
reader.Actions.PreFilters.deleteAll();
//
} catch (InvalidUsageException | OperationFailureException e) {
e.printStackTrace();
}
}
}
synchronized void performInventory() {
// check reader connection
if (!isReaderConnected())
return;
try {
reader.Actions.Inventory.perform();
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
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);
if (myTags != null) {
for (int index = 0; index < myTags.length; index++) {
allTagCount++;
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);
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);
return null;
}
}.execute();
}
}
}
}
private void setAntennaPower(int power) {
Log.d(TAG, "setAntennaPower " + power);
try {
// set antenna configurations
Antennas.AntennaRfConfig config = reader.Config.Antennas.getAntennaRfConfig(1);
config.setTransmitPowerIndex(power);
config.setrfModeTableIndex(0);
config.setTari(0);
reader.Config.Antennas.setAntennaRfConfig(1, config);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
It seems that you are reading tags in Session 0, with target set to A. This means that you read tags only once (as long as they are powered by the reader). This can cause tags to not read often.
Try: Session 1 with Target A (tags respond every second) or Session 0 with Target A/B (tags respond continuously).
Obviously there is a trade-off in 'observations per second' versus how quick you are going to read large populations of tags.