Как прочитать полезную нагрузку записи из тега NXP MIFARE Ultralight?

У меня есть пара тегов NXP MIFARE Ultralight (тип 2), которые содержат некоторые данные в первой записи. Я использую ACS 1252U для чтения тегов, и я попытался вручную перебрать некоторые данные, чтобы понять, что находится на теге, но я не могу понять, как определить, где начинается запись. и где он заканчивается.

Вот некоторая подробная информация о теге NFC и записи, которую я пытаюсь прочитать:

А вот некоторые данные из одного из моих тегов, начиная со страницы 04:

03 ff 01 5a
c4 0f 00 00
01 45 62 63
61 72 64 2e
6e 65 74 3a
62 63 61 72
64 39 39 37
30 31 1e 34

Теперь, если я конвертирую все это в ASCII, я получаю следующее:

ÿZÄEbcard.net:bcard997014

Все, что я знаю, это то, что фактические данные, которые мне нужны (или полезная нагрузка), начинаются с 99701, но откуда мне это знать? Наверняка в данных есть что-то, что может сказать мне, где начинается полезная нагрузка записи и где она заканчивается?


person user928112    schedule 18.02.2019    source источник
comment
Я также хочу отметить, что в соответствии с этим (apps4android. org/nfc-specifications/), то, что я вижу в начале страницы 4, — это TLV сообщения NDEF. Это не имеет абсолютно никакого смысла, потому что я не вижу заголовка записи или чего-либо еще, соответствующего этой диаграмме сообщения NDEF: infocenter.nordicsemi.com/topic/   -  person user928112    schedule 18.02.2019


Ответы (1)


Данные точно соответствуют спецификации тега типа 2. Страницы данных тега типа 2 начинаются со страницы/блока 4. Данные встраиваются в структуры TLV.

В вашем случае первый байт страницы 4 является тегом TLV сообщения NDEF (0x03). Следующий байт указывает, что поле длины закодировано в 3-байтовом формате. Следовательно, длина равна 0x015A (= 346 байт). Таким образом, вам нужно прочитать следующие 87 страниц (= ceil(346/4), поскольку данные начинаются на границе страницы), чтобы получить полное сообщение NDEF.

Само сообщение NDEF состоит из 1 записи NDEF (байт заголовка 0xC4 указывает, что запись является первой (MB=1) и последней (ME=1) записью сообщения). Запись является внешним типом NFC Forum (TNF=4 в байте заголовка). Имя типа имеет длину 0x0F (= 15 байт). Полезная нагрузка имеет длину 0x0145 (= 325 байт). Следовательно, имя типа — «bcard.net:bcard», а полезная нагрузка — «39 39 37 30 31 1E 34…» (похоже, ITN не опубликовала спецификацию того, как структурирован их тип bcard).

См. Как интерпретировать содержимое NDEF в Mifare Classic 1K, чтобы узнать, как декодировать эти структуры TLV и сообщение NDEF.

person Michael Roland    schedule 19.02.2019
comment
Ах, я не понимал, что длина может быть представлена ​​​​в трехбайтовом формате. Когда вы говорите, что данные начинаются на границе страницы, означает ли это, что в случаях, когда длина представлена ​​одним байтом, данные все равно будут начинаться на странице 5? Например: ‹[Страница 04h] 03 B4 00 00, [Страница 05h] 94 0F ED 62› - person user928112; 19.02.2019
comment
@user928112 user928112 Нет, я имел в виду, что в вашем конкретном случае данные начинаются с границы страницы. Это просто совпадение и может быть не так для других тегов. - person Michael Roland; 19.02.2019
comment
Поскольку я работаю на Android, возникнут ли потенциальные проблемы, если я воспользуюсь классом android.nfc.NdefMessage, чтобы помочь мне проанализировать сообщение NDEF после того, как я извлек его из структуры TLV? - person user928112; 19.02.2019
comment
@user928112 user928112 Ничего, о чем я знаю. - person Michael Roland; 19.02.2019
comment
Наконец-то мне удалось успешно извлечь полезную нагрузку. Спасибо за толчок в правильном направлении. - person user928112; 19.02.2019
comment
Для справки другим, анализ TLV, особенно того, почему поле длины FF 01 5A равно 346 байтам, здесь для кристально ясного объяснения apps4android.org/nfc-specifications/ стр. 14 в разделе 2.3 TLV Blocks - person eigenfield; 10.01.2020