#include "nfc_reader.h"
#include "tools.h"
#include <QDebug>
#include <tchar.h>
#include <stdio.h>
#include <string>
#define INI_FILE "conf.ini"
#define NTAG_CRC_SIZE 2
#define CMD_WRITE_RESP_LENGTH 1
#define CMD_FAST_WRITE_RESP_LENGTH 1
#define CMD_FAST_READ_RESP_LENGTH 1026
static NFC_Reader *instance_ = NULL;
NFC_Reader::NFC_Reader():
phContext_(NULL),
checktagThread_(NULL)
{
Tools::instance()->ReadConfigIni("szReader",readerName_,INI_FILE,"nfc_info", QSettings::IniFormat);
checktagThread_ = new CheckTagThread(this);
checktagThread_->start();
}
NFC_Reader::~NFC_Reader()
{
}
NFC_Reader *NFC_Reader::instance()
{
if(instance_ == NULL)
{
instance_ = new NFC_Reader();
}
return instance_;
}
void NFC_Reader::SetConnectReaderName(QString name)
{
readerName_ = name;
}
LONG NFC_Reader::Context(QStringList &readerList)
{
readersList_.clear();
LPTSTR pmszReaders = NULL;
DWORD cch = SCARD_AUTOALLOCATE;
phContext_ = (SCARDCONTEXT*)malloc(sizeof(SCARDCONTEXT));
LONG ret = SCardEstablishContext(SCARD_SCOPE_USER, NULL, NULL, phContext_);
if(ret == SCARD_S_SUCCESS)
{
ret = SCardListReaders(*phContext_, NULL, (LPTSTR)&pmszReaders, &cch);
if(ret == SCARD_S_SUCCESS)
{
int readerIndex = 0;
while(*pmszReaders != '\0')
{
QString readerName = QString::fromWCharArray(pmszReaders);
qDebug() << readerName;
readerList.push_back(readerName);
readersList_.push_back(readerName);
cardState_[readerIndex].szReader = pmszReaders;
cardState_[readerIndex].dwCurrentState = SCARD_STATE_UNAWARE;
pmszReaders = pmszReaders + wcslen(pmszReaders)+ 1;
readerIndex ++;
}
}
}
return ret;
}
LONG NFC_Reader::Release_Context()
{
LONG ret = SCardReleaseContext(*phContext_);
free(phContext_);
return ret;
}
LONG NFC_Reader::Card_Connect(int mode, DWORD* pActiveProtocol,QString readerName)
{
if(readerName.isEmpty())
{
readerName = readerName_;
}
LONG ret = -1;
SCARDHANDLE *phCardHandle = (SCARDHANDLE*)malloc(sizeof(SCARDHANDLE));
switch (mode)
{
case 2: // Note the colon, not a semicolon
ret = SCardConnect(*phContext_, (LPCWSTR)readerName.toStdWString().c_str(), SCARD_SHARE_SHARED, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, phCardHandle, pActiveProtocol);
break;
case 3: // Note the colon, not a semicolon
ret = SCardConnect(*phContext_, (LPCWSTR)readerName.toStdWString().c_str(), SCARD_SHARE_DIRECT, SCARD_PROTOCOL_UNDEFINED, phCardHandle, pActiveProtocol);
break;
default: // Note the colon, not a semicolon
int i = 0;
do
{
ret = SCardConnect(*phContext_, (LPCWSTR)readerName.toStdWString().c_str(), SCARD_SHARE_EXCLUSIVE, SCARD_PROTOCOL_T0 | SCARD_PROTOCOL_T1, phCardHandle, pActiveProtocol);
Sleep(50);
i++;
} while (ret == SCARD_E_SHARING_VIOLATION && i < 10);
break;
}
if(ret == SCARD_S_SUCCESS)
{
SCARD_IO_REQUEST *ppioSendPci = (SCARD_IO_REQUEST*)malloc(sizeof(SCARD_IO_REQUEST));
ppioSendPci->dwProtocol = *pActiveProtocol;
ppioSendPci->cbPciLength = 8;
readersMap_[readerName].isConnect = true;
readersMap_[readerName].phCardHandle = phCardHandle;
readersMap_[readerName].ppioSendPci = ppioSendPci;
}
ret = Reader_Beep();
return ret;
}
LONG NFC_Reader::Card_Disconnect()
{
LONG ret = SCardDisconnect(*readersMap_[readerName_].phCardHandle, SCARD_LEAVE_CARD);
if(ret == SCARD_S_SUCCESS)
{
readersMap_[readerName_].isConnect = false;
}
return ret;
}
LONG NFC_Reader::Card_Transmit(LPCBYTE rpSendBuffer, DWORD rSendLength, LPSCARD_IO_REQUEST rpRecvPci, LPBYTE rpRecvBuffer, LPDWORD rpRecvLength)
{
return SCardTransmit(*readersMap_[readerName_].phCardHandle, readersMap_[readerName_].ppioSendPci, rpSendBuffer, rSendLength, rpRecvPci, rpRecvBuffer, rpRecvLength);
}
LONG NFC_Reader::Card_Status()
{
LONG ret = -1;
//SCardLocateCards 函数调用失败,先屏蔽
// TCHAR szCard[MAX_PATH];
// _tcscat_s((char*)szCard,MAX_PATH*sizeof(TCHAR),(char*)TEXT("GemSAFE"));
// szCard[lstrlen(szCard)+1] = 0;
// ret = SCardLocateCards(*phContext_,szCard,cardState_,readersList_.size());
// if(ret == SCARD_S_SUCCESS)
// {
// for(int i=0;i<readersList_.size();i++)
// {
// if(0!= (SCARD_STATE_ATRMATCH & cardState_[i].dwEventState))
// {
// QString card = QString::fromWCharArray(szCard);
// QString readerName = QString::fromWCharArray(cardState_[i].szReader);
// qDebug() << card << readerName;
// }
// cardState_[i].dwCurrentState = cardState_[i].dwEventState;
// }
// }
if(phContext_ != NULL)
{
ret = SCardGetStatusChange(*phContext_,INFINITE,cardState_,readersList_.size());
if(ret == SCARD_S_SUCCESS)
{
for(int i=0;i<readersList_.size();i++)
{
QString readerName = QString::fromWCharArray(cardState_[i].szReader);
if((cardState_[i].dwEventState & SCARD_STATE_PRESENT) == SCARD_STATE_PRESENT )
{
readersMap_[readerName].haveTag = true;
emit checkTag(readerName,true);
}
else
{
readersMap_[readerName].haveTag = false;
readersMap_[readerName].isConnect = false;
emit checkTag(readerName,false);
}
}
}
}
return ret;
}
LONG NFC_Reader::Card_Read(int page, int len, BYTE *data)
{
LONG lReturn;
BYTE cmdFastRead[] = { 0xFF, 0xB0, 0x00, 0x00, 0x00 };
DWORD cmdFastReadLength = sizeof(cmdFastRead);
BYTE respFastRead[CMD_FAST_READ_RESP_LENGTH];
DWORD respFastReadLength = CMD_FAST_READ_RESP_LENGTH;
// Send Fast Read command
cmdFastRead[3] = page ;
cmdFastRead[4] = len;
lReturn = Card_Transmit(cmdFastRead, cmdFastReadLength, NULL, respFastRead, &respFastReadLength);
if (isReturnSuccess(lReturn)){
QByteArray array;
array = QByteArray().append((char*)respFastRead);
qDebug() << array.toHex() << respFastRead;
memcpy(data, respFastRead, respFastReadLength - NTAG_CRC_SIZE);
}
return lReturn;
}
LONG NFC_Reader::Card_Write(int page, int len, BYTE *data)
{
LONG lReturn;
BYTE *cmdFastWrite;
cmdFastWrite = (BYTE*)malloc(sizeof(BYTE)*(5+len));
DWORD cmdFastWriteLength = sizeof(BYTE)*(5+len);
BYTE respFastWrite[CMD_FAST_WRITE_RESP_LENGTH];
DWORD respFastWriteLength = 2;//CMD_FAST_WRITE_RESP_LENGTH;
// Send Fast Read command
cmdFastWrite[0] = 0xFF;
cmdFastWrite[1] = 0xD6;
cmdFastWrite[2] = 0x00;
cmdFastWrite[3] = page;
cmdFastWrite[4] = len;
memcpy(cmdFastWrite+5,data,len);
qDebug() << cmdFastWrite << QByteArray().append((char*)cmdFastWrite).toHex();
lReturn = Card_Transmit(cmdFastWrite, cmdFastWriteLength, NULL, respFastWrite, &respFastWriteLength);
if (isReturnSuccess(lReturn)){
QByteArray array;
array = QByteArray().append((char*)respFastWrite);
qDebug() << array.toHex() << respFastWrite;
}
return lReturn;
}
LONG NFC_Reader::Card_GetNO(BYTE *data)
{
LONG lReturn;
BYTE cmdFastRead[] = { 0xFF, 0xCA, 0x00, 0x00, 0x00 };
DWORD cmdFas
APDU操作NFC芯片
需积分: 43 151 浏览量
2017-06-16
17:40:32
上传
评论 2
收藏 8KB ZIP 举报
aileen5150
- 粉丝: 4
- 资源: 25
最新资源
- BLOCK_TYPE_HEARTBEAT_D70A3465D4EE4E9_046141_dump_1st.dmp
- 项目方法测试调用接口工具
- studyupdate
- 基于西瓜数据集的决策树实现.zip
- 60套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
- 贪心算法要点和难点实例代码解析
- 65套HTML网站源码-响应式-涵盖(简历&作品展示&商业&科技&培训&商城&课设等)-适配移动设备-解压即用.zip
- 多因素决策树的Python实现.zip
- 使用Python在莺尾花数据集上实现了决策树算法,文件里有数据集.zip
- python实现决策树.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈