2014-09-21 3 views
0

Я записываю данные в тег 14443A с помощью HTC One SV (PN544, Android 4.1.2), используя команду APDU «двоичное обновление», но я вижу между размером сообщения (байт # 5), а в начале NDEF записываются два дополнительных нулевого байта (# 6,7). Я проверил стандарт ISO7816 и не вижу цели этих двух дополнительных байтов, соответствует ли это стандарту? Я разбираю сообщение APDU/NDEF в C-программе, как я могу найти начало сообщения NDEF, могу ли я предположить, что эти два нулевых байта всегда есть или мне нужно искать байт «D1» ?NFC Update Последовательность двоичных команд нечеткая


The ISO7816, UPDATE BINARY: 
CLA   As defined in 5.4.1 
INS   'D6' 
P1-P2  See text below 
Lc field  Length of the subsequent data field 
Data field String of data units to be updated 
Le field  Empty 

Если B8 = 1 в P1, то b6-5 установлены на 0 (бит РФС). бит5-1 из P1 являются коротким идентификатором EF, а P2 является смещением первого байта, который должен обновляться в единицах данных с начала файла. Если b7 = 1 в P1, то P1 || P2 является смещением первого байта, который должен быть записан в единицах данных с начала файла.


cmdMessage = "\u0002"+"en"+"erase"; 
Tag tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG); 
NdefRecord txtRecord = new NdefRecord(NdefRecord.TNF_WELL_KNOWN, NdefRecord.RTD_TEXT, new byte[0], cmdMessage.getBytes()); 
NdefMessage newMessage = new NdefMessage(new NdefRecord[] { txtRecord}); 
writeNdefMessageToTag(newMessage, tag); 

0x00: 0x02 
0x01: 0x00 CLA 
0x02: 0xD6 INS, bin update 
0x03: 0x00 P1, Address MSB 
0x04: 0x00 P2, Address LSB 
0x05: 0x0E Lc, msg size 
0x06: 0x00 ?? 
0x07: 0x00 ?? 
0x08: 0xD1 NDEF header, TNF 
0x09: 0x01 type-len 
0x0A: 0x08 payload-len 
0x0B: 0x54 "T" 
0x0C: 0x02 0x02 
0x0D: 0x65 e "en" 
0x0E: 0x6E n 
0x0F: 0x65 e "erase" 
0x10: 0x72 r 
0x11: 0x61 a 
0x12: 0x73 s 
0x13: 0x65 e 

после отправки 0x9000 признать смартфон посылает другое сообщение записи: какова цель этого дополнительного доступа к записи? Я полагаю, что 0x0C является размером сообщения NDEF, которое было записано в предыдущей последовательности, , но зачем отправлять эту информацию в отдельный доступ для записи?

0x00: 0x03<\n> 
0x01: 0x00<\n> 
0x02: 0xD6<\n> 
0x03: 0x00<\n> 
0x04: 0x00<\n> 
0x05: 0x02<\n> 
0x06: 0x00<\n> 
0x07: 0x0C<\n> 

ответ

1

Первые два байта файла сообщений NDEF содержать размер данных (то есть количество действительных байт в файле). В первой команде записи (т. Е. При записи сообщения NDEF эти два байта устанавливаются в ноль. Таким образом, если операция записи прервана до того, как все сообщение будет записано, чтение файла NDEF покажет пустой файл вместо поврежденного NDEF. Затем, когда все сообщение NDEF было успешно записано в файл, выдается другая команда записи, чтобы обновить размер данных до размера сообщения NDEF. Теперь, если файл прочитан, читатель получит правильный NDEF и, таким образом, сможет читать полное сообщение NDEF.