2010-11-07 3 views
15

Есть ли библиотека с открытым исходным кодом для записи и чтения данных на C# с смарт-карты с помощью считывателя смарт-карт? Моя модель смарт-карт - mifare1k, а мой читатель - ucr122u.Как вы пишете/читаете смарт-карту?

+0

Возможный дубликат [У вас есть пример с открытым исходным кодом для сохранения данных в считывателе смарт-карт RFID ..] (http://stackoverflow.com/questions/4014037/do-you-have-an-open-source-example -for-saving-data-in-rfid-smart-card-reader) – TFD

+2

@TFD, этот вопрос гораздо более конкретный, что также должно облегчить ответ. В нем упоминается конкретная карта и читатель. –

+0

@Matthew_Flaschen Правда, но IIRC Mifare UCR - это азиатские клоны, нужно найти, какая базовая модель в любом случае. Спросите, это первый вопрос. Также всем, кто пользуется Mifare 1k, нужна их голова! – TFD

ответ

8

Заканчивать PCSC острый Дэниела Мюллера, https://github.com/danm-de/pcsc-sharp

работает очень хорошо для меня на окна и моно.

+3

Текущая ссылка: https://github.com/danm-de/pcsc-sharp –

1

Я знаю, что это старый вопрос, но вы можете PCSC-Sharp, которая

PC/SC классы-оболочки для .NET, написанных на языке C#. Пакет содержит классы до , чтобы получить доступ к диспетчеру ресурсов персонального компьютера/смарт-карты, используя собственный интерфейс ПК/SC . Обеспечивает частичную поддержку ISO7816. Библиотека написана для работы как на Windows, так и на Unix (Linux с Mono с использованием PCSC Lite).

Проект на GitHub: https://github.com/danm-de/pcsc-sharp

Вы также можете проверить документацию здесь: https://danm.de/docs/pcsc-sharp/index.html

0

для acr1252u

Я нашел решение в C++ код: только в линкере мы должны добавить winscard.h

#include <iostream> 
#include <iomanip> 
#include <vector> 
#include <string> 
#include <cstdint> 
#include <cstring> 
#include <winscard.h> 

std::wstring s2ws(const std::string& s); 

int main(int argc, char* argv[]) { 
    SCARDCONTEXT context = 0; 
    LONG ret = SCardEstablishContext(SCARD_SCOPE_SYSTEM, nullptr, nullptr, &context); 

    if (ret != SCARD_S_SUCCESS) { 
     std::cout << "SCardEstablishContext: " << ret<< std::endl; 
    } 
    else { 
     LPTSTR allReaderNames = nullptr; 
     DWORD readerCount = SCARD_AUTOALLOCATE; 

     ret = SCardListReaders(context, nullptr, reinterpret_cast<LPTSTR>(&allReaderNames), &readerCount); 

     if (ret != SCARD_S_SUCCESS) { 
      std::cout << "SCardListReaders: " << ret << std::endl; 
     } 
     else { 
      std::string readerName("ACS ACR1252 1S CL Reader PICC 0"); 
      std::wstring stemp = s2ws(readerName); 
      LPCWSTR result = stemp.c_str(); 
      DWORD activeProtocol = 0; 
      SCARDHANDLE card = 0; 

      ret = SCardConnect(context, result, SCARD_SHARE_DIRECT, 0, &card, &activeProtocol); 

      if (ret != SCARD_S_SUCCESS) { 
       std::cout << "SCardConnect: " << ret << std::endl; 
      } 
      else { 
       std::vector<std::uint8_t> outputBuffer{ 0xE0, 0x0, 0x0, 0x21, 0x01, 0x71 }; 
       std::vector<std::uint8_t> inputBuffer(64, 0); 
       DWORD bytesReturned = 0; 

       DWORD controlcode = SCARD_CTL_CODE(3500); 
       ret = SCardControl(card, controlcode, outputBuffer.data(), outputBuffer.size(), inputBuffer.data(), inputBuffer.size(), &bytesReturned); 

       if (ret != SCARD_S_SUCCESS) { 
        std::cout << "SCardControl: " << ret << std::endl; 
       } 
       else { 
        std::cout << "Response: " << std::hex << std::setfill('0'); 
        for (std::size_t i = 0; i < bytesReturned; ++i) { 
         std::cout << std::setw(2) << static_cast<std::uint32_t>(inputBuffer[i]) << " "; 
        } 
        std::cout << std::dec << std::endl; 

        SCardDisconnect(card, SCARD_LEAVE_CARD); 
       } 
      } 

      // Release the memory that SCardListReaders allocated for us 
      SCardFreeMemory(context, allReaderNames); 
     } 

     ret = SCardReleaseContext(context); 

     if (ret != SCARD_S_SUCCESS) { 
      std::cout << "SCardReleaseContext: " << ret << std::endl; 
     } 
     std::getchar(); 
    } 

    return 0; 
} 

std::wstring s2ws(const std::string& s) 
{ 
    int len; 
    int slength = (int)s.length() + 1; 
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
    wchar_t* buf = new wchar_t[len]; 
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len); 
    std::wstring r(buf); 
    delete[] buf; 
    return r; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^