Есть ли библиотека с открытым исходным кодом для записи и чтения данных на C# с смарт-карты с помощью считывателя смарт-карт? Моя модель смарт-карт - mifare1k
, а мой читатель - ucr122u
.Как вы пишете/читаете смарт-карту?
ответ
Заканчивать PCSC острый Дэниела Мюллера, https://github.com/danm-de/pcsc-sharp
работает очень хорошо для меня на окна и моно.
Текущая ссылка: https://github.com/danm-de/pcsc-sharp –
Я знаю, что это старый вопрос, но вы можете 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
для 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;
}
Возможный дубликат [У вас есть пример с открытым исходным кодом для сохранения данных в считывателе смарт-карт RFID ..] (http://stackoverflow.com/questions/4014037/do-you-have-an-open-source-example -for-saving-data-in-rfid-smart-card-reader) – TFD
@TFD, этот вопрос гораздо более конкретный, что также должно облегчить ответ. В нем упоминается конкретная карта и читатель. –
@Matthew_Flaschen Правда, но IIRC Mifare UCR - это азиатские клоны, нужно найти, какая базовая модель в любом случае. Спросите, это первый вопрос. Также всем, кто пользуется Mifare 1k, нужна их голова! – TFD