Чтение смарт-карты
У меня есть читатель, у которого есть док почти точный, как этот: 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
Ответы
Ответ 1
Я не могу быть уверен в том, что проблема с вашим кодом, но, похоже, проблема связана с тем, что при подключении появляется сообщение об ошибке. Поскольку SerialPort - это аппаратный ресурс, который вам нужно будет обрабатывать, SerialPort, вероятно, реализует IDisposable, что означает, что вы можете использовать его, убедитесь, что соединение закрыто и удалено. Принесите новую карту, вероятно, сделайте это, однако, когда вы используете ту же карточку, вы все еще работаете с последовательным портом в состоянии сбоя.
Ответ 2
Пока вы берете cardA рядом с устройством для чтения карт, и он терпит неудачу. После этого каждый раз, когда вы приносите карту рядом с кард-ридером, она терпит неудачу.
Я не уверен, но я угадываю, когда какая-либо ошибка 2-й позиции байтового массива rs[1]
содержит код для отказа. Итак, после этого каждый раз, когда вы приносите карточку рядом с устройством чтения карт, она терпит неудачу, потому что вторая позиция байта может иметь предыдущее значение.
Итак, попробуйте очистить массив байтов, который может решить вашу проблему.