Подтвердить что ты не робот

Чтение смарт-карты

У меня есть читатель, у которого есть док почти точный, как этот: 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
4b9b3361

Ответ 1

Я не могу быть уверен в том, что проблема с вашим кодом, но, похоже, проблема связана с тем, что при подключении появляется сообщение об ошибке. Поскольку SerialPort - это аппаратный ресурс, который вам нужно будет обрабатывать, SerialPort, вероятно, реализует IDisposable, что означает, что вы можете использовать его, убедитесь, что соединение закрыто и удалено. Принесите новую карту, вероятно, сделайте это, однако, когда вы используете ту же карточку, вы все еще работаете с последовательным портом в состоянии сбоя.

Ответ 2

Пока вы берете cardA рядом с устройством для чтения карт, и он терпит неудачу. После этого каждый раз, когда вы приносите карту рядом с кард-ридером, она терпит неудачу.

Я не уверен, но я угадываю, когда какая-либо ошибка 2-й позиции байтового массива rs[1] содержит код для отказа. Итак, после этого каждый раз, когда вы приносите карточку рядом с устройством чтения карт, она терпит неудачу, потому что вторая позиция байта может иметь предыдущее значение.

Итак, попробуйте очистить массив байтов, который может решить вашу проблему.