У меня есть читатель, у которого есть док почти точный, как этот: http://www.jinmuyu.com/download/JMY680A_EN.pdf основное отличие заключается в том, что мой читатель утверждает, что он поддерживает также карты TYPE B.
У меня есть три карты ISO 14443, которые я тестирую последовательно, и следующий код:
byte[] rs = null;
Thread.Sleep(500);
// Set module Idle
Random r = new Random();
byte rInt = (byte) r.Next(0, 255);
rs = send(new byte[] { 0x12, rInt });
if (rs[1] == 0xED)
throw new Exception("Failed set idle");
Thread.Sleep(500);
//// Request B
//rs = send(new byte[] { 0x60, 0x00, 0x00 });
//if (rs[1] == 0x9F)
// throw new Exception("Failed card requestB");
// RequestA
rs = send(new byte[] { 0x20, 0x00 });
if (rs[1] == 0xDF)
throw new Exception("Failed card requestA");
// Reset cardA
rs = send(new byte[] { 0x30 });
if(rs[1] == 0xCF)
throw new Exception("Failed card reset");
// Do other work, Send some APDU to card, etc.
// ........
// Exit program
В большинстве случаев этот код хорошо работает со всеми тремя картами.
Однако иногда, когда я привожу одну из карт рядом с считывателем, вызов запроса карты A (RequestA
)
вызов не выполняется. Он всегда будет терпеть неудачу с этой картой, пока я не принесу новую карту читателю.
Кто-нибудь знает, что может быть причиной этого? Может быть, мне нужны задержки между звонками? Или нужно вызвать некоторую другую (функцию, связанную с ISO14443), прежде чем вызывать RequestA
?
send
- метод, реализованный с использованием класса SerialPort
. Следующим образом:
- При каждом вызове отправки создается новый
SerialPort
объект - Вызов
Open
объекта, созданного выше -
Write
иRead
некоторые данные - Закройте соединение с помощью
Close
объекта, который был создан в экземпляре этого метода.
кстати. это успешный ответ от одной из карт (по которой один раз не удалось выполнить проверку) в команде RequestA:
ID | ATQ | SAK
0xe1 0x8f 0x68 0xe6 0x04 0x00 0x28