2016-11-25 2 views
1

Я пытаюсь написать некоторые данные тега NXP ICODE SLIX SL2S2002 (ISO 15693) с помощью WRITE НЕСКОЛЬКО БЛОКОВ команды через NfcV объекта:Запись несколько блоков Сбой команды над NfcV

private void writeTagData(Tag tag) throws Exception { 
    int offset = 0; 
    int blocks = 19; 

    String _writedata = "1hello34567850000071234561815064150220161603201016022018112233445552031033"; 
    byte[] data = _writedata.getBytes(StandardCharsets.UTF_8); 
    data = Arrays.copyOfRange(data, 0, 4 * blocks); 

    byte[] id = tag.getId(); 
    boolean techFound = false; 
    for (String tech : tag.getTechList()) { 
     if (tech.equals(NfcV.class.getName())) { 
      techFound = true; 
      NfcV nfcvTag = NfcV.get(tag); 
      try { 
       nfcvTag.connect(); 
      } catch (IOException e) { 
       Toast.makeText(this, "IO Exception", Toast.LENGTH_LONG).show(); 
       return; 
      } 
      try { 
       byte[] cmd = new byte[] { 
         (byte)0x20, 
         (byte)0x24, 
         (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
         (byte)(offset & 0x0ff), 
         (byte)((blocks - 1) & 0x0ff) 
       }; 
       System.arraycopy(id, 0, cmd, 2, 8); 

       byte[] cmd_plus_data = new byte[88]; 
       System.arraycopy(cmd, 0, cmd_plus_data, 0, cmd.length); 
       System.arraycopy(data, 0, cmd_plus_data, 12, data.length); 

       byte[] response = nfcvTag.transceive(cmd_plus_data); 
       String strResponse = Common.toHexString(response); 
      } catch (IOException e) { 
       Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); 
       return; 
      } 

      try { 
       nfcvTag.close(); 
      } catch (IOException e) { 
       Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show(); 
       return; 
      } 
     } 
    } 
} 

Ответ от transceive(...) метод 010f (с указанием «Неизвестная ошибка»). Раньше я смог прочитать данные с помощью команды READ MULTIPLE BLOCKS из того же тега успешно.

Я пытался вызвать getMaxTransceiveLength() на NfcV объекта и значение 253.

+0

Какой конкретный продукт тега вы пытаетесь написать? Учитывая, что вы указали значение UID тега 'e004015057da807b' в предыдущем сообщении, я бы предположил, что это NXP ICODE SLIX SL2S2xx2, верно? –

+0

NXP ICODE SLIX SL2S2002 – ibrahim

ответ

2

ИСО/МЭК 15693 определяет ЗАПИСИ несколько блоков команд, как дополнительный команду. Для реализации этой команды требуется фишка (или ее производитель).

В вашем случае NXP ICODE SLIX SL2S2xx2 (как и все (большинство?) Тегов ICODE SLI/SLIX) не поддерживает команду WRITE MULTIPLE BLOCKS. Следовательно, тег возвращает код ошибки 0x0F. Спецификация ICODE SLIX SL2S2xx2 определяет, что этот код ошибки возвращается в случае, если команда не поддерживается.

Вместо этого SL2S2xx2 поддерживает команду WRITE SINGLE BLOCK (0x21). Вы можете использовать эту команду в цикле для записи всех ваших данных:

byte[] cmd = new byte[] { 
     /* FLAGS */ (byte)0x20, 
     /* COMMAND */ (byte)0x21, 
     /* UID  */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00, 
     /* OFFSET */ (byte)0x00, 
     /* DATA */ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00 
}; 
System.arraycopy(id, 0, cmd, 2, 8); 

for (int i = 0; i < blocks; ++i) { 
    cmd[10] = (byte)((offset + i) & 0x0ff); 
    System.arraycopy(data, 4 * i, cmd, 11, 4); 

    byte[] response = nfcvTag.transceive(cmd); 
} 
Смежные вопросы