如何读取mifare卡的二进制块?

时间:2015-01-30 03:56:14

标签: nfc smartcard mifare ndef pcsc

我开发了从读卡器读取NFC卡的应用程序。 我知道读取二进制块的代码如下:

FF B0 00 04 10

04表示块4,10表示16字节数据。我的卡上有数据“TEST009996”。 我从4-8运行5个读取二进制块的代码,如下所示:

FF B0 00 04 10
FF B0 00 05 10
FF B0 00 06 10
FF B0 00 07 10
FF B0 00 08 10

我得到了以下结果:

T☻enTEÉ ☺
T☻enTEST00É
T☻enTEST009996É
enTEST009996■  6É
ST009996■  6    É

或十六进制:

01 03 A0 10 44 03 11 D1 01 0D 54 02 65 6E 48 43 90 00
44 03 11 D1 01 0D 54 02 65 6E 48 43 49 44 30 30 90 00
01 0D 54 02 65 6E 48 43 49 44 30 30 39 39 39 36 90 00
65 6E 48 43 49 44 30 30 39 39 39 36 FE 00 00 36 90 00
49 44 30 30 39 39 39 36 FE 00 00 36 00 00 00 00 90 00

我应该创建算法来削减结果以获取数据吗?有什么更好的方法吗?


来源:

http://downloads.acs.com.hk/drivers/en/API-ACR122U-2.02.pdf

1 个答案:

答案 0 :(得分:9)

因此,您的标签似乎是NFC论坛类型2标签(在NFC Forum website上找到NFC论坛类型2标签操作规范)。例如,当您使用MIFARE时,可以使用MIFARE Ultralight,MIFARE Ultralight C或NTAG标签。

Type 2标签上的块由4个字节组成。 read命令一次读取4个块。因此,read命令为您提供4个块(每个4个字节),从给定的块偏移量开始,再加上读取命令的状态字(0x9000表示成功)。在你的情况下,你得到

Read(4, 16): 0103A010 440311D1 010D5402 656E4843 9000
Read(5, 16):          440311D1 010D5402 656E4843 49443030 9000
Read(6, 16):                   010D5402 656E4843 49443030 39393936 9000
Read(7, 16):                            656E4843 49443030 39393936 FE000036 9000
Read(8, 16):                                     49443030 39393936 FE000036 00000000 9000

因此,标签的内存如下所示:

0103A010 
440311D1
010D5402
656E4843
49443030
39393936
FE000036
00000000

类型2标记(顺便说一下,为了确保此标记实际上符合类型2标记操作规范,您还需要读取位于块3中的功能容器)包含一系列标记长度-value(TLV)结构:

01 (Tag: Lock Control TLV)
  03 (Length: 3 bytes)
  A0 10 44 (Value: Information on position and function of lock bytes)
03 (Tag: NDEF Message TLV)
  11 (Length: 17 bytes)
  D1010D5402656E48434944303039393936 (Value: NDEF message)
FE (Tag: Terminator TLV; has no length field)

所以你的标签包含NDEF消息

D1010D5402656E48434944303039393936

这转换为

D1 (Header byte of record 1)
    - Message begin is set (= first record of an NDEF message)
    - Message end is set (= last record of an NDEF message)
    - Short record flag is set (= Payload length field consists of 1 byte only)
    - Type Name Format = 0x1 (= Type field contains an NFC Forum well-known type)
  01 (Type length: 1 byte)
  0D (Payload length: 13 bytes)
  54 (Type: "T")
  02656E48434944303039393936 (Payload field)

NFC论坛文本记录的有效负载字段解码如下:

02 (Status byte: Text is UTF-8 encoded, Language code has a length of 2 bytes)
656E (Language code: "en")
48434944303039393936 (Text: "TEST009996")