我正在编写基于Microsoft提供的NFC Example的代码。
Windows.Devices.SmartCards中的所有内容都与APDU命令有关。例如,TransmitAsync方法描述为:
异步传输提供的应用程序协议数据单元(APDU)命令并返回响应。
但是,由于这是一个带有字节数组参数的方法,我以为我能够通过使用这种方法摆脱APDU。我在文件CardReader.xaml.cs中插入了一些代码:
private async Task HandleCard(SmartCard card){
......
// Handle MIFARE Standard/Classic
LogMessage("MIFARE Standard/Classic card detected");
var mfStdAccess = new MifareStandard.AccessHandler(connection);
var uid = await mfStdAccess.GetUidAsync();
LogMessage("UID: " + BitConverter.ToString(uid));
// My code
LogMessage("==============");
await SendBytes(connection, new byte[] { 0xFF, 0xCA, 0, 0, 0 }); //APDU Test
await SendBytes(connection, new byte[] { 0x50, 0x00 }); // Halt card
await SendBytes(connection, new byte[] { 0x52 }); //Wake card
return;
......
}
private async Task<byte[]> SendBytes(SmartCardConnection connection, byte[] RawData)
{
LogMessage("> " + BitConverter.ToString(RawData).Replace("-", " ").ToUpper());
byte[] res = (await connection.TransmitAsync(RawData.AsBuffer())).ToArray();
LogMessage("< " + BitConverter.ToString(res).Replace("-", " ").ToUpper());
return res;
}
我在手机上运行应用程序,向Mifare Classic 1K卡发送命令。但是,我得到的是:
> FF CA 00 00 00
< 02 27 9F 8F 90 00
> 50 00
< 63 00
> 52
< 63 00
显然,APDU可以工作。我不知道63 00是什么,但我想这是APUD命令中的SW响应?我在论坛上看到你可以使用NfcAdapter在Android手机上做到这一点。我的代码出了什么问题?或者甚至可以在Windows 10 Mobile上发送低级命令(摆脱APDU)?
谢谢。
答案 0 :(得分:0)
PCSC具有特定于存储卡的命令。这样你就可以得到Mifare的支持。当然,您必须从读卡器制造商处获得Mifare卡的支持,但Mifare仍然非常受欢迎。
然而,不支持Native Mifare命令。您需要将这些命令转换为2.01 specification,第3.2.2.1节中的PCSC命令。
所以你不需要摆脱本机命令。只需将存储卡特定的APDU发送到阅读器,阅读器就会将本机命令发送到卡上。
答案 1 :(得分:0)
您必须发送由Maarten提供的PCSC命令。在c#上编写了一个库,它将低级Mirafe命令封装到PCSC APDU中。