本篇介绍如何用RFID手持枪读取RFID标签中的EPC值。
说明:
本次使用的手持枪为Zebra MC333R
本次使用的是Android SDK(RFIDAPI3Library),并非Xamarin
- Step1 初始化Reader
private void initMyReader() {
if (myReader == null) {
final Readers readers = new Readers(this, ENUM_TRANSPORT.SERVICE_SERIAL);
new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
try {
if (readers.GetAvailableRFIDReaderList() != null) {
ArrayList<ReaderDevice> availableRFIDReaderList = readers.GetAvailableRFIDReaderList();
if (availableRFIDReaderList.size() != 0) {
// get first reader from list
ReaderDevice readerDevice = availableRFIDReaderList.get(0);
myReader = readerDevice.getRFIDReader();
return true;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}.execute();
}
}
- Step2 配置Reader
private void configMyReader() {
new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... voids) {
if (myReader != null) {
try {
if (!myReader.isConnected()) {
myReader.connect();
}
Antennas.AntennaRfConfig antennaRfConfig = myReader.Config.Antennas.getAntennaRfConfig(1);
// set power level
antennaRfConfig.setTransmitPowerIndex(100);
myReader.Config.Antennas.setAntennaRfConfig(1, antennaRfConfig);
// receive events from reader
if (eventHandler == null)
eventHandler = new EventHandler();
myReader.Events.addEventsListener(eventHandler);
// HH event
myReader.Events.setHandheldEvent(true);
// tag event with tag data
myReader.Events.setTagReadEvent(true);
myReader.Events.setAttachTagDataWithReadEvent(false);
// add inventory stop listener
myReader.Events.setInventoryStopEvent(true);
// set trigger mode as RFID_MODE
myReader.Config.setTriggerMode(ENUM_TRIGGER_MODE.RFID_MODE, true);
myReader.Config.setBeeperVolume(beeperVolume);
// set start and stop triggers
TriggerInfo triggerInfo = new TriggerInfo();
triggerInfo.StartTrigger.setTriggerType(START_TRIGGER_TYPE.START_TRIGGER_TYPE_IMMEDIATE);
triggerInfo.StopTrigger.setTriggerType(STOP_TRIGGER_TYPE.STOP_TRIGGER_TYPE_TAG_OBSERVATION_WITH_TIMEOUT);
// stopped when read any one tag
triggerInfo.StopTrigger.TagObservation.setN((short) 1);
// stopped after 5s
readertriggerInfo.StopTrigger.TagObservation.setTimeout(5000);
myReader.Config.setStartTrigger(triggerInfo.StartTrigger);
myReader.Config.setStopTrigger(triggerInfo.StopTrigger);
} catch (Exception e) {
e.printStackTrace();
}
return true;
} else {
return false;
}
}
}.execute();
}
- Step3 读取处理
public class EventHandler implements RfidEventsListener {
public void eventReadNotify(RfidReadEvents rfidReadEvents) {
// Read Event Notification
TagData[] myTags = myReader.Actions.getReadTags(1);
if (myTags != null) {
final TagData myTag = myTags[0];
String currEPC = myTag.getTagID();
//TODO
startbeepingTimer();
}
}
// 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) {
startInventory();
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) {
stopInventory();
return null;
}
}.execute();
}
} else if (rfidStatusEvents.StatusEventData.getStatusEventType() == STATUS_EVENT_TYPE.INVENTORY_STOP_EVENT) {
//TODO
}
}
}
private void startInventory() {
try {
myReader.Actions.Inventory.perform();
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
Log.d(TAG, "OperationFailureException " + e.getVendorMessage());
}
}
private void stopInventory() {
try {
myReader.Actions.Inventory.stop();
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
Log.d(TAG, "OperationFailureException " + e.getVendorMessage());
}
}
private void beepSetting() {
int streamType = AudioManager.STREAM_DTMF;
int percantageVolume = 100;
if (beeperVolume == BEEPER_VOLUME.HIGH_BEEP) {
percantageVolume = 100;
} else if (beeperVolume == BEEPER_VOLUME.MEDIUM_BEEP) {
percantageVolume = 75;
} else if (beeperVolume == BEEPER_VOLUME.LOW_BEEP) {
percantageVolume = 50;
} else if (beeperVolume == BEEPER_VOLUME.QUIET_BEEP) {
percantageVolume = 0;
}
try {
toneGenerator = new ToneGenerator(streamType, percantageVolume);
} catch (RuntimeException exception) {
exception.printStackTrace();
toneGenerator = null;
}
}
private void beep() {
if (toneGenerator != null) {
int toneType = ToneGenerator.TONE_PROP_BEEP;
toneGenerator.startTone(toneType);
}
}
public void startbeepingTimer() {
if (beeperVolume != BEEPER_VOLUME.QUIET_BEEP) {
if (!beepON) {
beepON = true;
beep();
if (tbeep == null) {
TimerTask task = new TimerTask() {
@Override
public void run() {
stopbeepingTimer();
beepON = false;
}
};
tbeep = new Timer();
tbeep.schedule(task, 10);
}
}
}
}
public void stopbeepingTimer() {
if (tbeep != null && toneGenerator != null) {
toneGenerator.stopTone();
tbeep.cancel();
tbeep.purge();
}
tbeep = null;
}