Overview
This guide covers detail walk-through to perform Write operation
General Steps
Following are the general steps for performing write operation successfully
- Disable DPO in case of RFD8500 (step not required in case of fixed readers)
- Set Power equal or greater than 220dbm
- Use Session S0
- Isolate the TAG while performing write operation
- Use prefilter to singulate the tag
- Add retry mechanism and handle partial writes
Setting it up
Following is the generic setup or moving reader to known state suitable for access operation
- Set Antenna power to 240dbm
- Disable DPO in case of RFD8500
- Seting up access operation timeout
// configuration
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();
}
}
private void setSingulation(SESSION session, INVENTORY_STATE state) {
Log.d(TAG, "setSingulation " + session);
try {
// Set the singulation control
Antennas.SingulationControl s1_singulationControl = reader.Config.Antennas.getSingulationControl(1);
s1_singulationControl.setSession(session);
s1_singulationControl.Action.setInventoryState(state);
s1_singulationControl.Action.setSLFlag(SL_FLAG.SL_ALL);
reader.Config.Antennas.setSingulationControl(1, s1_singulationControl);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
private void setDPO(boolean bEnable) {
Log.d(TAG, "setDPO " + bEnable);
try {
// control the DPO
reader.Config.setDPOState(bEnable ? DYNAMIC_POWER_OPTIMIZATION.ENABLE : DYNAMIC_POWER_OPTIMIZATION.DISABLE);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
private void setAccessOperationConfiguration() {
// set required power and profile
setAntennaPower(240);
// in case of RFD8500 disable DPO
if (reader.getHostName().contains("RFD8500"))
setDPO(false);
//
try {
// set access operation time out value to 1 second, so reader will tries for a second
// to perform operation before timing out
reader.Config.setAccessOperationWaitTimeout(1000);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
In case of fixed readers
- Set Antenna power to 240dbm
// configuration
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();
}
}
private void setSingulation(SESSION session, INVENTORY_STATE state) {
Log.d(TAG, "setSingulation " + session);
try {
// Set the singulation control
Antennas.SingulationControl s1_singulationControl = reader.Config.Antennas.getSingulationControl(1);
s1_singulationControl.setSession(session);
s1_singulationControl.Action.setInventoryState(state);
s1_singulationControl.Action.setSLFlag(SL_FLAG.SL_ALL);
reader.Config.Antennas.setSingulationControl(1, s1_singulationControl);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
Perform Write
Following shows usage of write operation with SDK applying prefilter and number of retries internally and thus simplified application
//
// method to write data
//
private void writeTag(String sourceEPC, String Password, MEMORY_BANK memory_bank, String targetData, int offset) {
Log.d(TAG, "WriteTag " + targetData);
try {
TagData tagData = null;
String tagId = sourceEPC;
TagAccess tagAccess = new TagAccess();
TagAccess.WriteAccessParams writeAccessParams = tagAccess.new WriteAccessParams();
String writeData = targetData; //write data in string
writeAccessParams.setAccessPassword(Long.parseLong(Password,16));
writeAccessParams.setMemoryBank(memory_bank);
writeAccessParams.setOffset(offset); // start writing from word offset 0
writeAccessParams.setWriteData(writeData);
// set retries in case of partial write happens
writeAccessParams.setWriteRetries(3);
// data length in words
writeAccessParams.setWriteDataLength(writeData.length() / 4);
// 5th parameter bPrefilter flag is true which means API will apply pre filter internally
// 6th parameter should be true in case of changing EPC ID it self i.e. source and target both is EPC
boolean useTIDfilter = memory_bank == MEMORY_BANK.MEMORY_BANK_EPC;
reader.Actions.TagAccess.writeWait(tagId, writeAccessParams, null, tagData, true, useTIDfilter);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
Incase of Fixed readers
//
// method to write data
//
private void writeTag(String sourceEPC, String Password, MEMORY_BANK memory_bank, String targetData, int offset) {
Log.d(TAG, "WriteTag " + targetData);
try {
TagData tagData = null;
String tagId = sourceEPC;
TagAccess tagAccess = new TagAccess();
TagAccess.WriteAccessParams writeAccessParams = tagAccess.new WriteAccessParams();
String writeData = targetData; //write data in string
writeAccessParams.setAccessPassword(Long.parseLong(Password,16));
writeAccessParams.setMemoryBank(memory_bank);
writeAccessParams.setOffset(offset); // start writing from word offset 0
writeAccessParams.setWriteData(writeData);
// set retries in case of partial write happens
writeAccessParams.setWriteRetries(3);
// data length in words
writeAccessParams.setWriteDataLength(writeData.length());
// 5th parameter bPrefilter flag is true which means API will apply pre filter internally
// 6th parameter should be true in case of changing EPC ID it self i.e. source and target both is EPC
boolean useTIDfilter = memory_bank == MEMORY_BANK.MEMORY_BANK_EPC;
reader.Actions.TagAccess.writeWait(tagId, writeAccessParams, null, tagData, true, useTIDfilter);
} catch (InvalidUsageException e) {
e.printStackTrace();
} catch (OperationFailureException e) {
e.printStackTrace();
}
}
Write User data
Following shows storing data in tag USER memory bank - it uses methods defined above
private void WriteUser() {
// one time setup to suite the access operation, if reader is already in that state it can be avoided
setAccessOperationConfiguration();
// all are hex strings
String EPC = "3005FB63AC1F3681EC880468";
String data = "437573746F6D204461746120696E2055736572206D656D6F72792062616E6B0D";
String password = "0";//"5A454252";
// perform write
writeTag(EPC, password, MEMORY_BANK.MEMORY_BANK_USER, data, 0);
}
Write access password
Following shows setting up access operation password
private void WritePassword() {
// one time setup to suite the access operation, if reader is already in that state it can be avoided
//setAccessOperationConfiguration();
//
String EPC = "3005FB63AC1F3681EC880468";
String data = "5A454252"; // new password
String password = "0"; // no existing password
// perform write, offset is two for access password
writeTag(EPC, password, MEMORY_BANK.MEMORY_BANK_RESERVED, data, 2);
}
Change EPC ID
Following shows changing EPC ID
private void WriteEPC() {
// one time setup to suite the access operation, if reader is already in that state it can be avoided
//setAccessOperationConfiguration();
//
String EPC = "3005FB63AC1F3681EC880468";
String data = "3005FB63AC1F3681EC880468";
String password = "0";
// perform write, offset is two for EPC ID
writeTag(EPC, password, MEMORY_BANK.MEMORY_BANK_EPC, data, 2);
}