2010-11-07 18 views
15

¿Existe una biblioteca de código abierto para escribir y leer datos en C# desde una tarjeta inteligente que utiliza un lector de tarjeta inteligente? Mi modelo de tarjeta inteligente es mifare1k y mi lector es ucr122u.¿Cómo se escribe/lee en una tarjeta inteligente?

+0

posible duplicado de [¿Tiene un ejemplo de código abierto para guardar datos en el lector de tarjetas inteligentes RFID ...] (http://stackoverflow.com/questions/4014037/do-you-have-an-open-source-example -for-saving-data-in-rfid-smart-card-reader) – TFD

+2

@TFD, esta pregunta es mucho más específica, lo que también debería facilitar la respuesta. Menciona una tarjeta y un lector específicos. –

+0

@Matthew_Flaschen Cierto, pero IIRC Mifare UCR son clones asiáticos, necesitan encontrar qué modelo base es de todos modos. Han pedido es la primera pregunta. ¡También cualquiera que use Mifare 1k necesita que le lean la cabeza! – TFD

Respuesta

1

Sé que esto es una vieja pregunta, pero es posible que desee PCSC-Sharp, que es clases de envoltura/SC

PC para .NET, escrito en C#. El paquete contiene clases a , acceda al Administrador de Recursos de la Computadora Personal/Tarjeta Inteligente utilizando la API nativa PC/SC del sistema . Implementa el soporte parcial ISO7816. La biblioteca está escrita para ejecutarse tanto en Windows como en Unix (Linux con Mono usando PCSC Lite).

El proyecto se encuentra en GitHub: https://github.com/danm-de/pcsc-sharp

También puede comprobar la documentación aquí: https://danm.de/docs/pcsc-sharp/index.html

0

para acr1252u

he encontrado la solución en un código C++: Sólo en el enlazador necesitamos agregar 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; 
} 
Cuestiones relacionadas