2014-09-23 3 views
1

Я только что получил Mifare Ultralight C. Я могу легко считывать значения с нее с помощью телефона Android (Galaxy Ace 3).Чтение, когда запись ограничена на Mifare Ultralight C

0 hex: 04 9a 6f 79 
1 hex: 52 02 3a 80 
2 hex: ea 48 00 00 
3 hex: 00 00 00 00 
4 hex: 02 00 00 10 
5 hex: 00 06 01 10 
6 hex: 11 ff 00 00 
7 hex: 00 00 00 00 
8 hex: 00 00 00 00 
9 hex: 00 00 00 00 
10 hex: 00 00 00 00 
11 hex: 00 00 00 00 
12 hex: 00 00 00 00 
13 hex: 00 00 00 00 
14 hex: 00 00 00 00 
15 hex: 00 00 00 00 
16 hex: 00 00 00 00 
17 hex: 00 00 00 00 
18 hex: 00 00 00 00 
19 hex: 00 00 00 00 
20 hex: 00 00 00 00 
21 hex: 00 00 00 00 
22 hex: 00 00 00 00 
23 hex: 00 00 00 00 
24 hex: 00 00 00 00 
25 hex: 00 00 00 00 
26 hex: 00 00 00 00 
27 hex: 00 00 00 00 
28 hex: 00 00 00 00 
29 hex: 00 00 00 00 
30 hex: 00 00 00 00 
31 hex: 00 00 00 00 
32 hex: 00 00 00 00 
33 hex: 00 00 00 00 
34 hex: 00 00 00 00 
35 hex: 00 00 00 00 
36 hex: 00 00 00 00 
37 hex: 00 00 00 00 
38 hex: 00 00 00 00 
39 hex: 00 00 00 00 
40 hex: 00 00 00 00 
41 hex: 00 00 00 00 
42 hex: 30 00 00 00 
43 hex: 00 00 00 00 

Тогда я меняю значение в странице 43 для 0x80 и страниц 42 до 0x2A. Теперь, когда я читаю значений этого пути:

Log.e(LOG, "read"); 
for(int j = 0; j <= 40; j += 4){ 
byte[] resp = mifare.readPages(j); 
logResponse(j, resp); 


private void logResponse(int j, byte[] resp){ 
    for(int i = 0; i < resp.length; i += 4){ 
      Log.e(LOG, String.valueOf(j + i/4) + " hex: " 
        + String.format("%02x ", resp[i]) 
        + String.format("%02x ", resp[i + 1]) 
        + String.format("%02x ", resp[i + 2]) 
        + String.format("%02x", resp[i + 3])); 
     } 
} 

Я получаю значения от страницы 0 и 1 вместо 42 и 43.
Следующая вещь, что когда я отправить сообщение 0x1A00, чтобы отождествить, я Получается transceive failed.
Есть ли способ проверить, действительно ли это Mifare Ultralight C или какой-либо другой тег? Или я ошибаюсь, что значение 0x80 на стр. 43 ограничивает доступ только для записи?

ответ

1

Содержимое, которое вы читаете из тега, выглядит так, как если бы это был тег MIFARE Ultralight C (в частности, вы могли читать страницы 42 и 43).

  • Ожидаемое поведение при переходе от AUTH0 до 42 (0x2A). То есть когда вы защищаете память тегов, начиная со страницы X, команда READ перевернется после страницы X - 1.

  • Установка AUTH1 в 0x80 не будет делать то, что вы ожидали. Только самый младший бит в AUTH1 имеет значение, поэтому вы обычно устанавливаете AUTH1 на 0x00 (ограничиваете чтение и запись) или 0x01 (ограничивайте только запись).

  • Я не совсем уверен, почему команда аутентификации не работает.

    byte[] cmd = { (byte)0x1A, (byte)0x00 }; 
    byte[] result = mifare.transceive(cmd); 
    

    Как правило, если эта команда возвращает ничего другого, что 0xAF (или бросает исключение), что является явным показателем того, что тег не MIFARE Ultralight C.

+0

Только проверенные значения auth1 и вы правы в этом, моя ошибка. Это действительно странно, что он ограничивает чтение/запись правильно, но имеет проблемы с командой аутентификации. Чтобы быть ясным, я использую MifareUltralight как объект mifare, хорошо? –

+0

Оба MifareUltralight и NfcA в порядке. Вы посылаете нулевой байт после байта 0x1A, правильно? Также, какие операции вы используете * перед отправкой команды аутентификации? Выполняете ли вы какие-либо операции чтения/записи? –

+0

Моя команда точно такая же, как и в вашем посте. Только connect() перед этой командой. Я уже пробовал также читать перед командой auth, такое же поведение. –