public final class MifareClassic
extends Object
implements TagTechnology
java.lang.Object | |
↳ | android.nfc.tech.MifareClassic |
提供对 Tag
MIFARE Classic属性和I / O操作的 Tag
。
使用 get(Tag)
获取 MifareClassic
对象。
MIFARE Classic也被称为MIFARE标准。
MIFARE Classic标签分为多个扇区,每个扇区被细分为多个块。 块大小始终为16个字节( BLOCK_SIZE
。扇区大小各不相同。
SIZE_MINI
), with 5 sectors each of 4 blocks. SIZE_1K
), with 16 sectors each of 4 blocks. SIZE_2K
), with 32 sectors each of 4 blocks. SIZE_4K
). The first 32 sectors contain 4 blocks and the last 8 sectors contain 16 blocks. 在执行该扇区上的任何其他I / O操作之前,MIFARE Classic标签需要按扇区进行身份验证。 每个扇区有两个密钥,ACL位在使用密钥进行身份验证之后确定该扇区允许哪些I / O操作。 和。
三大知名认证密钥在这个类中定义: KEY_DEFAULT
, KEY_MIFARE_APPLICATION_DIRECTORY
, KEY_NFC_FORUM
。
KEY_DEFAULT
is the default factory key for MIFARE Classic. KEY_MIFARE_APPLICATION_DIRECTORY
is the well-known key for MIFARE Classic cards that have been formatted according to the MIFARE Application Directory (MAD) specification. KEY_NFC_FORUM
is the well-known key for MIFARE Classic cards that have been formatted according to the NXP specification for NDEF on MIFARE Classic. 在Android NFC设备上实现此类是可选的。 如果它没有实现,那么MifareClassic
将永远不会在getTechList()
枚举。 如果枚举,则将支持所有MifareClassic
I / O操作,并且还将支持MIFARE_CLASSIC
NDEF标记。 无论哪种情况, NfcA
也将枚举在标签上,因为所有MIFARE Classic标签也都是NfcA
。
注意:执行I / O操作的方法需要 NFC
权限。
Constants |
|
---|---|
int |
BLOCK_SIZE MIFARE Classic块的大小(以字节为单位) |
int |
SIZE_1K 标签包含16个扇区,每个扇区有4个块。 |
int |
SIZE_2K 标签包含32个扇区,每个扇区有4个块。 |
int |
SIZE_4K 标签包含40个扇区。 |
int |
SIZE_MINI 标签包含5个扇区,每个扇区有4个块。 |
int |
TYPE_CLASSIC MIFARE经典标签 |
int |
TYPE_PLUS MIFARE Plus标签 |
int |
TYPE_PRO MIFARE Pro标签 |
int |
TYPE_UNKNOWN 未知类型的MIFARE Classic兼容卡 |
Fields |
|
---|---|
public static final byte[] |
KEY_DEFAULT 默认的工厂密钥。 |
public static final byte[] |
KEY_MIFARE_APPLICATION_DIRECTORY 众所周知的按照MIFARE应用程序目录(MAD)规范格式化的标签密钥。 |
public static final byte[] |
KEY_NFC_FORUM 在MIFARE Classic规范中根据NDEF格式化标签的着名密钥。 |
Public methods |
|
---|---|
boolean |
authenticateSectorWithKeyA(int sectorIndex, byte[] key) 使用密钥A对扇区进行身份验证 |
boolean |
authenticateSectorWithKeyB(int sectorIndex, byte[] key) 使用密钥B对扇区进行身份验证 |
int |
blockToSector(int blockIndex) 返回包含给定块的扇区。 |
void |
close() 禁用对来自此 |
void |
connect() 对来自此 |
void |
decrement(int blockIndex, int value) 减量值块,将结果存储在标签上的临时块中。 |
static MifareClassic |
get(Tag tag) 为给定标签获取 |
int |
getBlockCount() 返回MIFARE Classic块的总数。 |
int |
getBlockCountInSector(int sectorIndex) 返回给定扇区中的块数。 |
int |
getMaxTransceiveLength() 返回可用 |
int |
getSectorCount() 返回MIFARE Classic扇区的数量。 |
int |
getSize() 以字节为单位返回标签的大小 |
Tag |
getTag() 获取 |
int |
getTimeout() 以毫秒为单位获取当前的 |
int |
getType() 返回此MIFARE Classic兼容标签的类型。 |
void |
increment(int blockIndex, int value) 增加一个值块,将结果存储在标签上的临时块中。 |
boolean |
isConnected() 帮助者指出I / O操作是否可行。 |
byte[] |
readBlock(int blockIndex) 读取16个字节的块。 |
void |
restore(int blockIndex) 从值块复制到临时块。 |
int |
sectorToBlock(int sectorIndex) 返回给定扇区的第一个块。 |
void |
setTimeout(int timeout) 以毫秒为单位设置 |
byte[] |
transceive(byte[] data) 将原始NfcA数据发送到标签并接收响应。 |
void |
transfer(int blockIndex) 从临时块复制到值块。 |
void |
writeBlock(int blockIndex, byte[] data) 写16个字节的块。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface android.nfc.tech.TagTechnology
|
|
From interface java.io.Closeable
|
|
From interface java.lang.AutoCloseable
|
byte[] KEY_MIFARE_APPLICATION_DIRECTORY
众所周知的按照MIFARE应用程序目录(MAD)规范格式化的标签密钥。
boolean authenticateSectorWithKeyA (int sectorIndex, byte[] key)
使用密钥A对扇区进行身份验证
使用密钥A对扇区进行成功验证可以启用该扇区上的其他I / O操作。 由A密钥授予的操作集取决于在该扇区中设置的ACL位。 欲了解更多信息,请参阅MIFARE Classic规范。
认证尝试失败会导致标签隐式重新连接,因此对其他扇区的认证将会丢失。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被取消, IOException
。
需要 NFC
权限。
Parameters | |
---|---|
sectorIndex |
int : index of sector to authenticate, starting from 0 |
key |
byte : 6-byte authentication key |
Returns | |
---|---|
boolean |
true on success, false on authentication failure |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
也可以看看:
boolean authenticateSectorWithKeyB (int sectorIndex, byte[] key)
使用密钥B对扇区进行身份验证
使用密钥B对扇区进行成功验证可启用该扇区上的其他I / O操作。 由密钥B授予的一组操作取决于在该扇区中设置的ACL位。 欲了解更多信息,请参阅MIFARE Classic规范。
认证尝试失败会导致标签隐式重新连接,因此对其他扇区的认证将会丢失。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被IOException
取消。
需要 NFC
权限。
Parameters | |
---|---|
sectorIndex |
int : index of sector to authenticate, starting from 0 |
key |
byte : 6-byte authentication key |
Returns | |
---|---|
boolean |
true on success, false on authentication failure |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
也可以看看:
int blockToSector (int blockIndex)
返回包含给定块的扇区。
不会导致任何RF活动并且不会阻止。
Parameters | |
---|---|
blockIndex |
int : index of block to lookup, starting from 0 |
Returns | |
---|---|
int |
sector index that contains the block |
void close ()
禁用对来自此 TagTechnology
对象的标记的I / O操作,并释放资源。
还会导致其他线程上的所有被阻止的I / O操作被取消,并返回 IOException
。
需要 NFC
权限。
Throws | |
---|---|
IOException |
void connect ()
对来自此 TagTechnology
对象的标记启用I / O操作。
可能导致RF活动并可能阻塞。 不能从主应用程序线程调用。 IOException
通过从另一个线程调用close()
来取消被阻止的呼叫。
一次只能将一个 TagTechnology
对象连接到 Tag
。
当I / O操作完成时,应用程序必须调用 close()
。
需要 NFC
权限。
Throws | |
---|---|
IOException |
void decrement (int blockIndex, int value)
减量值块,将结果存储在标签上的临时块中。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被取消, IOException
。
需要 NFC
权限。
Parameters | |
---|---|
blockIndex |
int : index of block to decrement, starting from 0 |
value |
int : non-negative to decrement by |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
MifareClassic get (Tag tag)
获取给定标签的 MifareClassic
实例。
不会导致任何RF活动并且不会阻止。
如果MifareClassic
未在getTechList()
枚举,则返回null。 这表明该标签不是MIFARE Classic兼容的,或者该Android设备不支持MIFARE Classic。
Parameters | |
---|---|
tag |
Tag : an MIFARE Classic compatible tag |
Returns | |
---|---|
MifareClassic |
MIFARE Classic object |
int getBlockCount ()
返回MIFARE Classic块的总数。
不会导致任何RF活动并且不会阻止。
Returns | |
---|---|
int |
total number of blocks |
int getBlockCountInSector (int sectorIndex)
返回给定扇区中的块数。
不会导致任何RF活动并且不会阻止。
Parameters | |
---|---|
sectorIndex |
int : index of sector, starting from 0 |
Returns | |
---|---|
int |
number of blocks in the sector |
int getMaxTransceiveLength ()
返回可以通过 transceive(byte[])
发送的最大字节数。
Returns | |
---|---|
int |
the maximum number of bytes that can be sent with transceive(byte[]) . |
int getSectorCount ()
返回MIFARE Classic扇区的数量。
不会导致任何RF活动并且不会阻止。
Returns | |
---|---|
int |
number of sectors |
int getSize ()
以字节为单位返回标签的大小
一个SIZE_MINI
, SIZE_1K
, SIZE_2K
, SIZE_4K
。 这些常量等于它们各自的字节大小。
不会导致任何RF活动并且不会阻止。
Returns | |
---|---|
int |
size in bytes |
Tag getTag ()
获取 Tag
对象支持此 TagTechnology
对象。
Returns | |
---|---|
Tag |
the Tag backing this TagTechnology object. |
int getTimeout ()
以毫秒为单位获取当前的 transceive(byte[])
超时。
需要 NFC
权限。
Returns | |
---|---|
int |
timeout value in milliseconds |
int getType ()
返回此MIFARE Classic兼容标签的类型。
一个 TYPE_UNKNOWN
, TYPE_CLASSIC
, TYPE_PLUS
或者 TYPE_PRO
。
不会导致任何RF活动并且不会阻止。
Returns | |
---|---|
int |
type |
void increment (int blockIndex, int value)
增加一个值块,将结果存储在标签上的临时块中。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被IOException
取消。
需要 NFC
权限。
Parameters | |
---|---|
blockIndex |
int : index of block to increment, starting from 0 |
value |
int : non-negative to increment by |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
boolean isConnected ()
帮助者指出I / O操作是否可行。
如果返回true connect()
已经完成,并 close()
没有被调用,并且 Tag
不知道是超出范围。
不会导致射频活动,也不会阻止。
Returns | |
---|---|
boolean |
true if I/O operations should be possible |
byte[] readBlock (int blockIndex)
读取16个字节的块。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被IOException
取消。
需要 NFC
权限。
Parameters | |
---|---|
blockIndex |
int : index of block to read, starting from 0 |
Returns | |
---|---|
byte[] |
16 byte block |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
void restore (int blockIndex)
从值块复制到临时块。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被取消, IOException
。
需要 NFC
权限。
Parameters | |
---|---|
blockIndex |
int : index of block to copy from |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
int sectorToBlock (int sectorIndex)
返回给定扇区的第一个块。
不会导致任何RF活动并且不会阻止。
Parameters | |
---|---|
sectorIndex |
int : index of sector to lookup, starting from 0 |
Returns | |
---|---|
int |
block index of first block in sector |
void setTimeout (int timeout)
以毫秒为单位设置 transceive(byte[])
超时。
超时仅适用于此对象上的 transceive(byte[])
,并在 close()
时重置为默认值。
在标签上执行需要较长处理时间的事务(例如密钥生成)时,设置较长的超时时间可能很有用。
需要 NFC
权限。
Parameters | |
---|---|
timeout |
int : timeout value in milliseconds |
byte[] transceive (byte[] data)
将原始NfcA数据发送到标签并接收响应。
这相当于通过NfcA
连接到此标签并致电transceive(byte[])
。 请注意,所有MIFARE Classic标签都基于NfcA
技术。
使用 getMaxTransceiveLength()
检索可以与发送的字节的最大数量 transceive(byte[])
。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被取消, IOException
。
需要 NFC
权限。
Parameters | |
---|---|
data |
byte
|
Returns | |
---|---|
byte[] |
Throws | |
---|---|
IOException |
也可以看看:
void transfer (int blockIndex)
从临时块复制到值块。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被取消, IOException
。
需要 NFC
权限。
Parameters | |
---|---|
blockIndex |
int : index of block to copy to |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |
void writeBlock (int blockIndex, byte[] data)
写16个字节的块。
这是一个I / O操作,将阻塞直到完成。 它不能从主应用程序线程调用。 如果从另一个线程调用close()
被阻止的呼叫将被IOException
取消。
需要 NFC
权限。
Parameters | |
---|---|
blockIndex |
int : index of block to write, starting from 0 |
data |
byte : 16 bytes of data to write |
Throws | |
---|---|
TagLostException |
if the tag leaves the field |
IOException |
if there is an I/O failure, or the operation is canceled |