如何在 Android 上使用 NFC 从扇区读取数据
How to read data from a sector using NFC on Android
我正在尝试从我用于项目的 NFC 卡中读取数据。它使用 Mifare classic 1k 并有 16 个扇区。
我可以连接到卡上,并且正在尝试读取数据(我知道我想要的数据在第二个扇区 - 第二个块中)。我可以很好地扫描卡片,它会显示卡片的大小,这样可以确保卡片被正确扫描,但是当我登录“data.readBlock(2)”时得到的数据与我用来验证它的密钥。
我从代码中了解到:
卡连接
授权 == 真
我可以获得卡的整体详细信息,例如扇区数/块数
protected void onNewIntent(Intent intent){
super.onNewIntent(intent);
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
MifareClassic tag = MifareClassic.get(tagFromIntent) ;
try {
//Variables
int sectorCount = tag.getSectorCount();
int tagSize = tag.getSize();
boolean auth;
//Keys
byte[] defaultKeys = new byte[]{};
defaultKeys = MifareClassic.KEY_DEFAULT;
//Connecting to tag
tag.connect();
//auth = true
auth = tag.authenticateSectorWithKeyA(2, defaultKeys);
byte[] data = tag.readBlock(2);
Log.i("OnNewIntent", "Data in sector 2: " + Arrays.toString(data));
} catch (IOException e) {
e.printStackTrace();
}
预期=“扇区 2 中的数据:The data in sector 2 block 2
”
Actual = "扇区 2 中的数据:[B@4df9e32]"
每次扫描卡片时,上述实际结果都会发生变化。
您得到的是 Java 用来将其保存在内存中的对象引用。要获取数据的可读版本,请改用:
Arrays.toString(data);
顺便说一句,您可能想更改您的代码以检查身份验证是否成功:
authSuccessful = mfc.authenticateSectorWithKeyA(sector, key);
if(authSuccessful){
// Read the block
creditBlock = mfc.readBlock(block);
String bytesString = Arrays.toString(creditBlock);
Log.i(TAG, bytesString);
} else {
Log.e(TAG, "Auth Failed");
}
最后,我很确定您正在尝试做的只是读取标准 Mifare 卡,因此请避免仓促下结论。正如他们在医学上所说:
Think horses, not zebras
我最终解决了这个问题,方法是将内存位置转换为字符串,然后将该字符串转换为 UTF-8 格式。为帮助干杯
我正在尝试从我用于项目的 NFC 卡中读取数据。它使用 Mifare classic 1k 并有 16 个扇区。
我可以连接到卡上,并且正在尝试读取数据(我知道我想要的数据在第二个扇区 - 第二个块中)。我可以很好地扫描卡片,它会显示卡片的大小,这样可以确保卡片被正确扫描,但是当我登录“data.readBlock(2)”时得到的数据与我用来验证它的密钥。
我从代码中了解到: 卡连接 授权 == 真 我可以获得卡的整体详细信息,例如扇区数/块数
protected void onNewIntent(Intent intent){
super.onNewIntent(intent);
Tag tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
MifareClassic tag = MifareClassic.get(tagFromIntent) ;
try {
//Variables
int sectorCount = tag.getSectorCount();
int tagSize = tag.getSize();
boolean auth;
//Keys
byte[] defaultKeys = new byte[]{};
defaultKeys = MifareClassic.KEY_DEFAULT;
//Connecting to tag
tag.connect();
//auth = true
auth = tag.authenticateSectorWithKeyA(2, defaultKeys);
byte[] data = tag.readBlock(2);
Log.i("OnNewIntent", "Data in sector 2: " + Arrays.toString(data));
} catch (IOException e) {
e.printStackTrace();
}
预期=“扇区 2 中的数据:The data in sector 2 block 2
”
Actual = "扇区 2 中的数据:[B@4df9e32]"
每次扫描卡片时,上述实际结果都会发生变化。
您得到的是 Java 用来将其保存在内存中的对象引用。要获取数据的可读版本,请改用:
Arrays.toString(data);
顺便说一句,您可能想更改您的代码以检查身份验证是否成功:
authSuccessful = mfc.authenticateSectorWithKeyA(sector, key);
if(authSuccessful){
// Read the block
creditBlock = mfc.readBlock(block);
String bytesString = Arrays.toString(creditBlock);
Log.i(TAG, bytesString);
} else {
Log.e(TAG, "Auth Failed");
}
最后,我很确定您正在尝试做的只是读取标准 Mifare 卡,因此请避免仓促下结论。正如他们在医学上所说:
Think horses, not zebras
我最终解决了这个问题,方法是将内存位置转换为字符串,然后将该字符串转换为 UTF-8 格式。为帮助干杯