2010-11-07 103 views
15

是否有一个开源库,用于使用智能卡读卡器从智能卡中写入和读取C#中的数据?我的智能卡型号是mifare1k,我的读卡器是ucr122u你如何写/读智能卡?

+0

可能的重复[你有一个开源的RFID智能卡读卡器保存数据的例子..](http://stackoverflow.com/questions/4014037/do-you-have-an-open-source-example为了节省数据在rfid智能卡读卡器) – TFD 2010-11-07 06:13:09

+2

@TFD,这个问题是更具体,这也应该更容易回答。它提到了一个特定的卡片和读卡器。 – 2010-11-07 06:17:29

+0

@Matthew_Flaschen真的,但是IIRC Mifare UCR是亚洲克隆,无论如何都需要找到基础模型。询问是第一个问题。另外任何使用Mifare 1k的人都需要阅读他们的头像! – TFD 2010-11-08 03:00:04

回答

1

我知道这是一个老问题,但你可能要PCSC,夏普这是.NET

PC/SC的包装类,C#编写的。该软件包包含的类别为 使用系统的 本地PC/SC API访问个人计算机/智能卡资源管理器。实现部分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; 
}