如何向MIFARE卡发送NfcA命令?
How send NfcA command to the MIFARE card?
我正在编写 Android 应用程序。我正在尝试向我的 Mifare Plus S 卡发送 NfcA
低级命令(在我的例子中:HALT 和 WAKE-UP)。 NfcA
技术用于 "low-level" 访问 ISO 14443 A 类标签(即
ISO 14443-3 中提到的专有协议。
这是我的代码的一部分:
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
UID = Utils.byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
}
NfcA nfca = null;
try {
Log.e(TAG, "WakeUpCMD and HaltCMD");
nfca = NfcA.get(tagFromIntent);
nfca.connect();
Short s = nfca.getSak();
byte[] a = nfca.getAtqa();
byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
byte[] WakeUpCMD = {0x35, 0x32, 0x00};
byte[] data = null;
try {
data = nfca.transceive(HaltCMD);
length = data.length;
}
catch (Exception e){
Log.e(TAG, "HALT complete "+Utils.byteArrayToHexString(data));
}
Log.e(TAG, "Tag is connected: "+nfca.isConnected());
//Log.e(TAG, "Response from tag "+Utils.byteArrayToHexString(data));
nfca.setTimeout(100);
data = nfca.transceive(WakeUpCMD);
Log.e(TAG, "Response from tag"+Utils.byteArrayToHexString(data));
nfca.close();
} catch (Exception e) {
Log.e(TAG, "Error when reading tag");
}
}
WAKE-UP命令由PCD发送,将进入HALT
状态的PICC恢复到READY
状态
状态。然后他们将参与进一步的防碰撞和选择程序。
|b7| |b6| |b5| |b4| |b3| |b2| |b1|
|1 | | 0 | | 1| | 0| | 0| | 1| | 0| {‘52’} = WAKE-UP
HALT 命令由四个字节组成,应使用标准帧传输。
传输的第一位
S | ‘50’ | ‘00’ | CRC_A | E
如果 PICC 在 HALT
帧结束后的 1 ms 内响应任何调制,则此响应应被解释为 'not acknowledge'。
这是我尝试发送到我的卡的 ISO 14443-3 中的两个命令的描述。
当我启动我的应用程序时,出现 "Tag Lost" 异常。你能帮助我吗?怎么了?如何发送这些命令?
看起来好像你在用 NfcA.transceive()
:
发送它们之前将命令代码转换成空终止的 ASCII 字符串
byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
byte[] WakeUpCMD = {0x35, 0x32, 0x00};
0x35 0x30 0x30 0x30
给出 "5000"
0x35 0x32
给出 "52"
这没有任何意义,因为命令(50 00
用于 HLTA,52
用于 WUPA)已经是命令值的十六进制表示。
对于 HLTA 命令,您需要发送 50 00
:
data = nfca.transceive(new byte[] { (byte)0x50, (byte)0x00 });
请注意,S(通信开始)、E(通信结束)和CRC_A将由NFC控制器(或NFC堆栈)自动添加。
对于 WUPA 命令,您可以尝试发送 52
:
data = nfca.transceive(new byte[] { (byte)0x52 });
但是,很可能NFC堆栈不允许您使用收发方法发送7位指令。相反,堆栈可能会自动将此命令值用作一个完整字节并添加 CRC_A.
发送ISO/IEC14443-3初始化和防冲突命令的一般注意事项
发送此类命令可能有效也可能无效(取决于 NFC 堆栈实现和 NFC 控制器)。一般来说,我强烈建议您 而不是 发送此类命令。特别是 HLTA 命令会混淆某些设备上 NFC 堆栈的内部状态保持,并会导致意外结果。 通常情况下,您不需要交换此类命令,因为 NFC 设备会自动处理防碰撞、初始化和激活。
我正在编写 Android 应用程序。我正在尝试向我的 Mifare Plus S 卡发送 NfcA
低级命令(在我的例子中:HALT 和 WAKE-UP)。 NfcA
技术用于 "low-level" 访问 ISO 14443 A 类标签(即
ISO 14443-3 中提到的专有协议。
这是我的代码的一部分:
protected void onNewIntent(Intent intent) {
if (NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction())) {
tagFromIntent = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG);
UID = Utils.byteArrayToHexString(intent.getByteArrayExtra(NfcAdapter.EXTRA_ID));
}
NfcA nfca = null;
try {
Log.e(TAG, "WakeUpCMD and HaltCMD");
nfca = NfcA.get(tagFromIntent);
nfca.connect();
Short s = nfca.getSak();
byte[] a = nfca.getAtqa();
byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
byte[] WakeUpCMD = {0x35, 0x32, 0x00};
byte[] data = null;
try {
data = nfca.transceive(HaltCMD);
length = data.length;
}
catch (Exception e){
Log.e(TAG, "HALT complete "+Utils.byteArrayToHexString(data));
}
Log.e(TAG, "Tag is connected: "+nfca.isConnected());
//Log.e(TAG, "Response from tag "+Utils.byteArrayToHexString(data));
nfca.setTimeout(100);
data = nfca.transceive(WakeUpCMD);
Log.e(TAG, "Response from tag"+Utils.byteArrayToHexString(data));
nfca.close();
} catch (Exception e) {
Log.e(TAG, "Error when reading tag");
}
}
WAKE-UP命令由PCD发送,将进入HALT
状态的PICC恢复到READY
状态
状态。然后他们将参与进一步的防碰撞和选择程序。
|b7| |b6| |b5| |b4| |b3| |b2| |b1|
|1 | | 0 | | 1| | 0| | 0| | 1| | 0| {‘52’} = WAKE-UP
HALT 命令由四个字节组成,应使用标准帧传输。 传输的第一位
S | ‘50’ | ‘00’ | CRC_A | E
如果 PICC 在 HALT
帧结束后的 1 ms 内响应任何调制,则此响应应被解释为 'not acknowledge'。
这是我尝试发送到我的卡的 ISO 14443-3 中的两个命令的描述。
当我启动我的应用程序时,出现 "Tag Lost" 异常。你能帮助我吗?怎么了?如何发送这些命令?
看起来好像你在用 NfcA.transceive()
:
byte[] HaltCMD = {0x35, 0x30, 0x30,0x30, 0x00};
byte[] WakeUpCMD = {0x35, 0x32, 0x00};
0x35 0x30 0x30 0x30
给出"5000"
0x35 0x32
给出"52"
这没有任何意义,因为命令(50 00
用于 HLTA,52
用于 WUPA)已经是命令值的十六进制表示。
对于 HLTA 命令,您需要发送 50 00
:
data = nfca.transceive(new byte[] { (byte)0x50, (byte)0x00 });
请注意,S(通信开始)、E(通信结束)和CRC_A将由NFC控制器(或NFC堆栈)自动添加。
对于 WUPA 命令,您可以尝试发送 52
:
data = nfca.transceive(new byte[] { (byte)0x52 });
但是,很可能NFC堆栈不允许您使用收发方法发送7位指令。相反,堆栈可能会自动将此命令值用作一个完整字节并添加 CRC_A.
发送ISO/IEC14443-3初始化和防冲突命令的一般注意事项
发送此类命令可能有效也可能无效(取决于 NFC 堆栈实现和 NFC 控制器)。一般来说,我强烈建议您 而不是 发送此类命令。特别是 HLTA 命令会混淆某些设备上 NFC 堆栈的内部状态保持,并会导致意外结果。 通常情况下,您不需要交换此类命令,因为 NFC 设备会自动处理防碰撞、初始化和激活。