Android NfcV оставайся тихой командой
Я пытаюсь реализовать различные команды NfcV на телефоне Android (Nexus 4). В настоящее время я использую эти теги. Согласно техническому заданию, они должны поддерживать команду "Будь тише".
К сожалению, я не могу получить приведенный ниже исходный код для правильной работы. Я ожидаю, что команды "Inventory" и "Read Single Block" после команды "Stay Quiet" потерпят неудачу, потому что обе команды не адресованы, что тег в состоянии Quiet должен игнорировать. Но я все еще получаю правильный ответ, содержащий UID или полезную нагрузку из тега.
Кроме того, я получаю исключение "Tag is lost", выполняя команду "Stay Quiet". Однако, согласно ISO 15693-3, тег не должен давать ответ на эту команду, что в любом случае может привести к этому исключению.
Тем не менее, я предполагаю, что что-то не так с командой "Stay Quiet" в этом коде, но я не могу понять, что именно.
Любая помощь приветствуется.
Исходный код:
NfcV nfcv = NfcV.get(mtag);
try{
nfcv.connect(); //Connect
} catch(IOException e){
mUIDs = mUIDs + "\nConnection Error 1";
}
byte[] response1 = {(byte) 0x00};
try{
byte[] UIDreq1 = InventoryRequest(); //Inventory Request
response1 = nfcv.transceive(UIDreq1);
} catch(IOException e){
mUIDs = mUIDs + "\nInventory Error 1";
}
mUIDs = mUIDs +"\n" + bytesToHex(response1);
byte[] UID = response2UID(response1);
mUIDs = mUIDs + "\n" + bytesToHex(UID);
try{
byte[] command = ReadSingleBlockUnadressed((byte) 0x04); //Reading Single Block
byte[] data = nfcv.transceive(command);
mUIDs = mUIDs +"\n"+bytesToHex(data);
}catch(IOException e){
Log.e("Reading Single Block", e.getMessage());
mUIDs = mUIDs + "\nReading Error";
}
try{
try{
byte[] command = StayQuiet(UID); //Stay Quiet, SHOULD FAIL
nfcv.transceive(command);
}catch(TagLostException e){
Log.e("Stay Quiet", e.getMessage());
mUIDs = mUIDs + "\nTag was lost.";
}
}catch(IOException x){
mUIDs = mUIDs + "\nStay Quiet Error";
}
try{
byte[] command = ReadSingleBlockUnadressed((byte) 0x04); //Reading Single Block
byte[] data = nfcv.transceive(command);
mUIDs = mUIDs +"\n"+bytesToHex(data);
}catch(IOException e){
Log.e("Reading Single Block", e.getMessage());
mUIDs = mUIDs + "\nReading Error";
}
try{
byte[] UIDreq2 = InventoryRequest(); //Inventory Request, SHOULD FAIL
byte[] response2 = nfcv.transceive(UIDreq2);
mUIDs = mUIDs +"\n" + bytesToHex(response2);
} catch(IOException e){
mUIDs = mUIDs + "\nInventory Error 2";
}
try{
nfcv.close(); //Disconnect
} catch(IOException x){
mUIDs = mUIDs + "\nDisconnection Error 1";
}
mTagTextView.setText(mUIDs);
Со следующими функциями:
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
int v;
for ( int j = 0; j < bytes.length; j++ ) {
v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
private byte[] response2UID(byte[] response){
byte[] UID = new byte[response.length-2];
for(int i = 2; i < response.length; i++){
UID[i-2]=response[i];
}
return UID;
}
private byte[] ReadSingleBlockUnadressed(byte blocknumber){
return new byte[] {(byte) 0x00, (byte) 0x20, blocknumber};
}
private byte[] StayQuiet(byte[] UID){
byte[] beQuiet = new byte[] {(byte) 0x04, (byte) 0x02};
byte[] command = combine(beQuiet, UID);
return command;
}
private byte[] InventoryRequest(){
return new byte[] { (byte) 0x24, (byte) 0x01, (byte) 0x00};
}
1 ответ
Когда вы отправляете команду STAY QUITE, вы переводите тег из выбранного в невыбранное состояние.
Затем вы отправляете команду READ SINGLE BLOCK со значением флага 0x00.
Согласно стандарту ИСО / МЭК 15693-3 это означает, что флажок Select_flag (бит 5) равен нулю. Стандарт определяет использование этого бита следующим образом:
Bit 5 = 0: Request shall be executed by any VICC according to the
setting of Address_flag
Bit 5 = 1: Request shall be executed only by VICC in selected state
Здесь указан Address_flag (его значение равно нулю):
Bit 6 = 0: Request is not addressed. UID field is not present. It shall be
executed by any VICC.
Bit 6 = 1: Request is addressed. UID field is present. It shall be
executed only by the VICC whose UID matches the UID
specified in the request.
С флагами, которые вы использовали в своей команде READ SINGLE BLOCK, вы указали тегу ответить, даже если он не выбран. Вот почему это работает.
Для вашего варианта использования вы хотите, чтобы Select_flag (бит 5) был один, а Address_flag - ноль.
Я предлагаю вам взглянуть на стандарт ISO/IEC 15693-3. Его копию можно найти в Интернете здесь: http://www.waazaa.org/download/fcd-15693-3.pdf
Кстати, вы получаете исключение "Тег был потерян", потому что Сервис NFC постоянно проверяет наличие тега. В случае ISO15693 он, вероятно, делает это, отправляя команду INVENTORY за вашей спиной, поскольку INVENTORY - одна из немногих команд, которую понимают все теги ISO15693.
У вас нет контроля над этим, поэтому вполне вероятно, что это помешает вашим попыткам заглушить тег.