Reputation: 1537
I have an IDBlue RFID Reader(IDBLUE-HF-70F3) with me.I have also downloaded the sample android application using their SDK.http://idblue.com/support/drivers-software.I could pair my phone with the reader and my office id card has RFID in it, so what im trying is i want to get some details from my id card using this IDBLUE Reader.But it shows reading failed.
I have also tried with the offical IDBLUE apps from playstore and itunes, No luck from them also.Im completely new to this can some one help me to proceed forward
public class AndroidTestAppActivity extends ListActivity implements ISessionHandler
{
private static final RfidTag blankRfidTag = RfidTag.fromString("0000000000000000", Endianness.Msb);
private static final String blockData_Ascii = "Data";
private static final String blockData_Hex = "FF01CB99";
private static final String READ_TAG_ID_MODE = "Read Tag ID";
private static final String WRITE_READ_MULTIPLE_BLOCKS_MODE = "Write/Read Multiple Blocks";
private static final String WRITE_READ_SINGLE_BLOCK_MODE = "Write/Read Single Block";
private static String mode = READ_TAG_ID_MODE;
private static Boolean isHF = false;
@Override
public boolean onContextItemSelected(MenuItem item)
{
mode = (String) item.getTitle();
return super.onContextItemSelected(item);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
{
if(sdk().isSessionOpen())
{
menu.setHeaderTitle("Select Test Mode:");
menu.add(READ_TAG_ID_MODE);
if(isHF)
{
menu.add(WRITE_READ_SINGLE_BLOCK_MODE);
menu.add(WRITE_READ_MULTIPLE_BLOCKS_MODE);
}
}
super.onCreateContextMenu(menu, v, menuInfo);
}
/**
* ResponseProcessor illustrates how to handle RFID tag id responses from IDBLUE.
*
*/
class ResponseProcessor extends IDBlueProcessor
{
@Override
public void getRfidProtocolResponse(IDBlueCommand command,
RfidProtocolProperty response)
{
if(response.value() != RfidProtocol.EPC_GEN2)
{
isHF = true;
}
}
@Override
public void buttonPressResponse(IDBlueResponse response)
{
if (!sdk().beginCommands().successful())
{
return;
}
if(mode == READ_TAG_ID_MODE)
{
if(!readTagId().successful())
{
OnFailure(READ_TAG_ID_MODE);
}
}
else if(mode == WRITE_READ_SINGLE_BLOCK_MODE)
{
CByteArray blockData = CByteArray.createFromAsciiString(blockData_Ascii);
if(!sdk().writeBlock(blankRfidTag, (short) 0,
blockData).successful())
{
OnFailure(WRITE_READ_SINGLE_BLOCK_MODE);
}
}
else if(mode == WRITE_READ_MULTIPLE_BLOCKS_MODE)
{
if(!sdk().writeBlocks(blankRfidTag, (short) 0, (short) 2,
new CByteArray(blockData_Hex + blockData_Hex)).successful())
{
OnFailure(WRITE_READ_MULTIPLE_BLOCKS_MODE);
}
}
else
{
sdk().endCommands(false);
}
}
private void OnFailure(String mode)
{
sdk().endCommands(false);
setStatus(mode + " Failed");
}
private void OnSuccess(String mode, String details)
{
sdk().endCommands(true);
String status = mode + " Succeeded";
if(details.length() > 0)
{
status = status + ('\n' + details);
}
setStatus(status);
}
@Override
public void readBlockResponse(IDBlueCommand command, ReadBlockResponse response)
{
if(response.blockIndex() != 0 ||
!Arrays.equals(response.blockData().data(), CByteArray.createFromAsciiString(blockData_Ascii).data()))
{
OnFailure(WRITE_READ_SINGLE_BLOCK_MODE);
}
else
{
OnSuccess(WRITE_READ_SINGLE_BLOCK_MODE, "");
}
}
@Override
public void readBlockFailed(IDBlueCommand command, NackResponse response)
{
OnFailure(WRITE_READ_SINGLE_BLOCK_MODE);
}
@Override
public void readBlocksResponse(IDBlueCommand command, ReadBlocksResponse response)
{
if(response.blockIndex() != 0 || response.blockCount() != 2 ||
!Arrays.equals(response.blockData().data(), new CByteArray(blockData_Hex + blockData_Hex).data()))
{
OnFailure(WRITE_READ_MULTIPLE_BLOCKS_MODE);
}
else
{
OnSuccess(WRITE_READ_MULTIPLE_BLOCKS_MODE, "");
}
}
@Override
public void readBlocksFailed(IDBlueCommand command, NackResponse response)
{
OnFailure(WRITE_READ_MULTIPLE_BLOCKS_MODE);
}
/**
* Callback method that is called when an RFID tag was successfully read by IDBLUE.
* If a request was sent to IDBLUE to read the tag, then the response is said
* to be synchronous. If however, the front button of IDBLUE is pressed, IDBLUE
* will send the tag id asynchronously (or async for short).
*/
@Override
public void readTagIdResponse(IDBlueCommand command, ReadTagIdResponse response)
{
// response.async() indicates whether the tag scan resulted from
// a button press of IDBLUE (async), or from a call to readTagId (sync).
String async = response.async() ? "Async Tag ID" : "Sync Tag ID";
RfidTag tag = response.rfidTag();
IDBlueTimestamp scanTime = response.timestamp();
String tagId = tag.toString();
String ts = scanTime.toString();
OnSuccess(READ_TAG_ID_MODE, String.format("%s: %s, Timestamp: %s.", async, tagId, ts));
}
/**
* Callback method that is called when IDBLUE cannot find an RFID tag is response
* to a synchronous read tag id request. readTagIdFailed will never be called
* asynchronously since IDBLUE does not notify of asynchronous tag scan failures.
*
*/
@Override
public void readTagIdFailed(IDBlueCommand command, NackResponse response)
{ if(command!=null) {
Log.e("readTagIdFailed", ""+command.message());
Log.e("readTagIdFailed", ""+command.name);
Log.e("readTagIdFailed", ""+command.toStringReversed());
Log.e("readTagIdFailed", ""+ String.valueOf(command.info()));
Log.e("readTagIdFailed", ""+ String.valueOf(command.status()));
Log.e("readTagIdFailed", ""+String.valueOf(command.successful()));
}else {
Log.e("command null","command null");
}
Log.e("********************************","&&&&&&&&&&&&&&&&&&&");
if(response!=null) {
Log.e("readTagIdFailed", ""+ String.valueOf(response.successful()));
Log.e("readTagIdFailed", ""+ String.valueOf(response.failedCommand()));
Log.e("readTagIdFailed", ""+ String.valueOf(response.info()));
Log.e("readTagIdFailed", ""+String.valueOf(response.infoLen()));
Log.e("readTagIdFailed", ""+ String.valueOf(response.message()));
}else
{
Log.e("response null","response null");
}
OnFailure(READ_TAG_ID_MODE);
}
@Override
public void writeBlockResponse(IDBlueCommand command, WriteBlockResponse response)
{
if(response.blockIndex() != 0 ||
!sdk().readBlock(blankRfidTag, (short) 0).successful())
{
OnFailure(WRITE_READ_SINGLE_BLOCK_MODE);
}
}
@Override
public void writeBlockFailed(IDBlueCommand command, NackResponse response)
{
OnFailure(WRITE_READ_SINGLE_BLOCK_MODE);
}
@Override
public void writeBlocksResponse(IDBlueCommand command, WriteBlocksResponse response)
{
if(response.blockIndex() != 0 || response.blockCount() != 2 ||
!sdk().readBlocks(blankRfidTag, (short) 0, (short) 2).successful())
{
OnFailure(WRITE_READ_MULTIPLE_BLOCKS_MODE);
}
}
@Override
public void writeBlocksFailed(IDBlueCommand command, NackResponse response)
{
OnFailure(WRITE_READ_MULTIPLE_BLOCKS_MODE);
}
}
/**
* Updates the status label
* @param status The test to assign to the status label
*/
private void setStatus(String status) {
// Display data/text of the item/row clicked
Toast.makeText(this, status, Toast.LENGTH_SHORT).show();
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
BluetoothDevice[] devices = this.getPairedDevices();
ArrayAdapter<BluetoothDevice> adapter = new ArrayAdapter<BluetoothDevice>(this,android.R.layout.simple_list_item_single_choice,devices);
// Get the activity's ListView and set its choice mode as single choice
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
setListAdapter(adapter);
registerForContextMenu(getListView());
// Set the current TestAppActivity to listen for session events
sdk().addSessionHandler(this);
// Hook up an async response processor, to process tag scans
// from IDBLUE as a result of the front button being pressed.
//
// If you register a response handler, it will also receive
// synchronous responses. Be careful that you don't process
// the same response multiple times. In this example, we'll
// specify ASYNC_ONLY so that the TagIdProcessor registered
// with addResponseHandler is listens for asynchronous responses,
// and ignores synchronous responses.
sdk().addResponseHandler(new ResponseProcessor());
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
// Get the data associated with selected item
Object item = l.getItemAtPosition(position);
// Display data/text of the item/row clicked
setStatus("Selection: " + item.toString());
BluetoothDevice device = (BluetoothDevice) item;
close();
Log.e("IDBLUE","onListItemClick: " +open(device));
}
/**
* Get the instance of the IDBlueSdk that is used to communicate
* with IDBLUE devices.
* @return The one and only instance of IDBlueSdk
*/
private IDBlueSdk sdk() {
return IDBlueSdk.getInstance();
}
/**
* Gets the list of all Bluetooth Devices that are paired with
* the Android OS (via the Bluetooth Settings of the Android Device).
* @return An array of Bluetooth Devices that are paired with the Android Device
*/
private BluetoothDevice[] getPairedDevices() {
return sdk().getPairedDevices();
}
/**
* Get the IDBLUE device that's selected in the List View
* @return The BluetoothDevice that's selected, null if no
* deivce is selected
*/
private BluetoothDevice selectedIDBlueDevice() {
ListView list = this.getListView();
View row;
BluetoothDevice device;
int count = list.getChildCount();
for (int i = 0; i < count; i++) {
row = (View)list.getChildAt(i);
Object obj = row.getTag();
if (obj instanceof BluetoothDevice) {
device = (BluetoothDevice)obj;
return device;
}
}
return null;
}
/**
* Open a session to the selected IDBLUE device
* @return true if the session was opened, false otherwise
*/
private boolean open() {
return open(selectedIDBlueDevice());
}
/**
* Open a session to the given IDBLUE device
* @return true if the session was opened, false otherwise
*/
private boolean open(BluetoothDevice device) {
return sdk().open(device);
}
/**
* Close the current session to IDBLUE
* @return True if the session was closed, false otherwise
*/
private boolean close() {
sdk().setConnectedMode(ConnectedMode.TAGID);
return sdk().close();
}
/**
* Requests IDBLUE to scan for an RFID tag.
* A few seconds later, IDBLUE will notify you of the results of the
* tag scan via the readTagIdResponse, or the readTagIdFailed methods
* of the registered TagIdProcessor
* @return a SendStatus indicating whether the request was sent to IDBLUE
*/
private SendStatus readTagId() {
return sdk().readTagId();
}
/**
* Requests IDBLUE to scan for an RFID tag.
* A few seconds later, IDBLUE will notify you of the results of the
* tag scan via the readTagIdResponse, or the readTagIdFailed methods
* of the registered TagIdProcessor
* @param processor An IDBlueProcessor object that will be notified of
* once the RFID read tag id operation completes
* @return a SendStatus indicating whether the request was sent to IDBLUE
*/
private SendStatus readTagId(IDBlueProcessor processor ) {
return sdk().readTagId(processor);
}
/**
* onSessionCloseFailed is a method of ISessionHandler
* that is called when closing of a session to an IDBLUE device fails.
*/
public void onSessionCloseFailed(IDBlueSession session) {
}
/**
* onSessionClosed is a method of ISessionHandler
* that is called when a session to an IDBLUE device is closed.
*/
public void onSessionClosed(IDBlueSession session) {
System.out.println("IDBLUE session closed");
}
/**
* onSessionClosing is a method of ISessionHandler
* that is called when a session to an IDBLUE device is closing.
*/
public void onSessionClosing(IDBlueSession session) {
}
/**
* onSessionOpenFailed is a method of ISessionHandler
* that is called when opening of a session to an IDBLUE device fails.
*/
public void onSessionOpenFailed(IDBlueSession session) {
}
/**
* onSessionOpenFailed is a method of ISessionHandler
* that is called when a session to an IDBLUE device is opened successfully.
*/
public void onSessionOpened(IDBlueSession session) {
System.out.println(String.format("Session to %s is now open", sdk().device().Name));
isHF = false;
sdk().getRfidProtocol();
sdk().setConnectedMode(ConnectedMode.REACTIVE);
}
/**
* onSessionOpening is a method of ISessionHandler
* that is called when a session to an IDBLUE device is opening.
*/
public void onSessionOpening(IDBlueSession session) {
}
}
Attaching the log i get after i receive read failed message
04-02 13:13:37.268 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Received 1 bytes: 70
04-02 13:13:37.274 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Received 7 bytes: 000070ff0000ff
04-02 13:13:37.274 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Processed response: 70000070
04-02 13:13:37.275 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Processed response: ff0000ff
04-02 13:13:37.275 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Sent 80 command (80000080)
04-02 13:13:37.276 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Sent 01 command (01000001)
04-02 13:13:37.392 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Received 4 bytes: 80000080
04-02 13:13:37.392 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Processed response: 80000080
04-02 13:13:41.537 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Received 5 bytes: 1f00080104
04-02 13:13:41.544 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Received 7 bytes: 2c010100023a06
04-02 13:13:41.545 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Processed response: 1f000801042c010100023a06
04-02 13:13:41.546 2087-2087/coders.com.idblue E/readTagIdFailed﹕ null
04-02 13:13:41.546 2087-2087/coders.com.idblue E/readTagIdFailed﹕ Read Tag ID
04-02 13:13:41.546 2087-2087/coders.com.idblue E/readTagIdFailed﹕ 01000001
04-02 13:13:41.546 2087-2087/coders.com.idblue E/readTagIdFailed﹕ null
04-02 13:13:41.546 2087-2087/coders.com.idblue E/readTagIdFailed﹕ 0
04-02 13:13:41.546 2087-2087/coders.com.idblue E/readTagIdFailed﹕ true
04-02 13:13:41.547 2087-2087/coders.com.idblue E/********************************﹕ &&&&&&&&&&&&&&&&&&&
04-02 13:13:41.547 2087-2087/coders.com.idblue E/readTagIdFailed﹕ false
04-02 13:13:41.549 2087-2087/coders.com.idblue E/readTagIdFailed﹕ 1
04-02 13:13:41.550 2087-2087/coders.com.idblue E/readTagIdFailed﹕ 2c010100023a
04-02 13:13:41.550 2087-2087/coders.com.idblue E/readTagIdFailed﹕ 6
04-02 13:13:41.550 2087-2087/coders.com.idblue E/readTagIdFailed﹕ null
04-02 13:13:41.556 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Sent 88 command (8800010089)
04-02 13:13:41.933 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Received 4 bytes: 88000088
04-02 13:13:41.934 2087-2087/coders.com.idblue I/System.out﹕ TRACE: Processed response: 88000088
Upvotes: 1
Views: 1000
Reputation: 1418
I had a look at the IDBlue HF/UHF datasheet. It lists the RFid standards supported, and ISO 14443 is not among them. It is very likely that your office's ID card follows that standard, so probably that's the reason why the IDBlue reader does not detect it. If you have an Android phone around that supports NFC, it is easy to confirm that: install an NFC diagnostics app (I normally use NXP TagInfo, https://play.google.com/store/apps/details?id=com.nxp.taginfolite&hl=en) and use it to verify your office ID card's technology.
Upvotes: 1