Включить/отключить счетчик для NTAG213

    MifareUltralight mifareUltralight = MifareUltralight.get(tag);
    byte[] toggleCounterCommand = new byte[]{(byte)0xA2, // NTAG213 command to write
                                    (byte)0x2A,  // page 42(dec) 2A(hex)    
                                     (byte)___};// not sure what to put here. 

В спецификации для NTAG213 сказано, что 0-й байт страницы 42 содержит информацию о доступе.

0-й байт структурирован следующим образом:

 7       6         5        *4*            3          2  1  0
PROT  CFGLCK   RFUI    *NFC_CNT_EN*  NFC_CNT_PWD_PROT   AUTHLIM

Установка 4-го бита в 0 или 1 должна включать или отключать счетчик. Но я не уверен, как установить 4-й бит при записи на теге.


person Roehit Kadam    schedule 27.04.2017    source источник
comment
Возможный дубликат Java: побитовая операция для проверки флагов   -  person ThomasRS    schedule 29.04.2017


Ответы (1)


Контекст для тех, кто придет к этому в будущем:

NTAG21x имеет функцию счетчика NFC. Эта функция позволяет NTAG21x автоматически увеличивать значение 24-битного счетчика, запускаемое первым допустимым значением.

  • ЧИТАТЬ команду или
  • БЫСТРОЕ ЧТЕНИЕ

после того, как метка NTAG21x получает питание от радиочастотного поля. Как только счетчик NFC достигнет максимального значения FF FF FF hex, значение счетчика NFC больше не изменится. Счетчик NFC включается или отключается с помощью бита NFC_CNT_EN (см. Раздел 8.5.7) http://www.nxp.com/documents/data_sheet/NTAG213_215_216.pdf.

Насколько я понимаю, вы находитесь на правильном пути с записью в тег, вы хотите использовать метод transceive для обновления этого бита, но вы не уверены, какие данные нужно записать для этого. Обратите внимание, что MifraUltralight.transceieve(byte[]) эквивалентно подключению к этому тегу через NfcA и вызову transceive(byte[]).

Важно отметить, что «приложения должны отправлять только полные байты команд» (из Android docs), поэтому мы должны обновить весь этот байт. Однако мы хотим записать в тег, который поддерживает только полезную нагрузку размером 4 байта (1 страница), поэтому мы будем перезаписывать всю страницу.

Вот где мой опыт начинает немного ломаться, но я бы предложил подход:

  1. Прочитайте страницу 42, скопируйте байты в буфер
  2. Запишите эти скопированные байты на страницу 42, но сначала обновите бит счетчика.

Делаем шаг 1:

NfcA transaction = NfcA.get(tag);
transaction.connect(); // error handle
byte cmdRead = (byte)0x30;
byte page = (byte)(0x42 & 0xff); // AND to make sure it is the correct size
byte[] command = new byte[] {cmdRead, page};
byte[] page42 = nfcAtransaction.transceive(command); // error handle

byte mask = 0b00010000; // 3rd bit, or should it be 4th?
byte newData = page42[0] | mask; 

Делаем шаг 2:

byte cmdWrite = (byte)0xA2;
byte page = (byte)(42 & 0xff);
byte[] command = new byte[] { cmdWrite, page, newData, page42[1], page42[2], page42[3]};
byte[] result = nfcA.transceive(command); 

Полностью не проверено, но я надеюсь, что это поможет.

person henrycjc    schedule 01.05.2017