当我测试此网址上提供的示例代码时(https://www.zebra.com/us/en/support-downloads/software/demo/123rfid-mobile.html),此代码读取标签几乎 10 次比我的代码更快。 大部分零件看起来都一样 我的设备型号是 Zebra RFD8500
我在有接口和没有接口的情况下都进行了测试,但我的代码总是运行缓慢。 谢谢你的帮助
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();
}
}
您似乎正在会话 0 中读取标签,目标设置为 A。这意味着您仅读取标签一次(只要它们由阅读器供电)。这可能会导致标签不经常被读取。
尝试:与目标 A 的会话 1(标签每秒响应一次)或与目标 A/B 的会话 0(标签连续响应)。
显然,“每秒观察次数”与读取大量标签的速度之间存在权衡。