| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737 |
- #include "contactless.nantian.1.1.h"
- #include <cstring>
- #include <cstdio>
- ErrCode_Msg m_ErrCode_Msg;
- ContactlessCardImpl::ContactlessCardImpl()
- : m_mode(0)
- {
- memset(m_ErrCode_Msg.szErrMsg, 0, sizeof(m_ErrCode_Msg.szErrMsg));
- memset(m_ErrCode_Msg.Function,0,sizeof(m_ErrCode_Msg.Function));
- m_ErrCode_Msg.ErrMsgLen = 0;
- m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
- m_pTrace = new CILIXTrace(NULL, "Contactless", "Contactless_DeCard_T10N");
- // m_pTrace = new CILIXTrace(NULL, "Contactless", "Contactless_CRT_603");
- char INIPath[100] = "";
- CILIX_AUX_X::CILIX_GetModuleCurPath(INIPath);
- strcat(INIPath, "log.nantian.ini");
- char log_dir[100] = "";
- CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_dir", log_dir, "/etc/nantian");
- char log_level[100] = "";
- CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_level", log_level, "3");
- cmb::log_init_config config;
- config.dev_name = "contactlessso";
- config.log_dir = log_dir;
- config.log_level = atoi(log_level);
- std::string str;
- cmb::log4vendor::init(config, str);
- LOG4VTM(WARN, "<Contactless::ContactlessCardImpl> - "
- << "libContactless.nantian.1.1.so v1.0.0.1");
- bCancelFlag = false;
- bDevOpen = false;
- pHandle = NULL;
- drv_CardReader = NULL;
- bDrvFlag = LoadDrvDll();
- // if (!LoadDrvDll())
- // return;
- }
- ContactlessCardImpl::~ContactlessCardImpl()
- {
- if (drv_CardReader)
- Destroy_DRV_XCardReader(drv_CardReader);
- if (pHandle)
- dlclose(pHandle);
- drv_CardReader = NULL;
- pHandle = NULL;
- }
- bool ContactlessCardImpl::LoadDrvDll()
- {
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "Enter-");
- char szInIPath[1024], szNTDRVPath[1024];
- CILIX_AUX_X::CILIX_GetModuleCurPath(szInIPath);
- sprintf(szNTDRVPath, "%snantian/%s", szInIPath, "libDRV_DeCard_T10N.nantian.so");
- // sprintf(szNTDRVPath, "%snantian/%s", szInIPath, "libDRV_CRT_603.nantian.so");
- pHandle = NULL;
- void *pszErr = NULL;
- pHandle = dlopen(szNTDRVPath, RTLD_LAZY);
- if (!pHandle || pszErr)
- {
- m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "LoadNTDRVDLL", "加载底层库%s失败", szNTDRVPath);
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "加载底层库" << szNTDRVPath << "失败");
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "Exit-");
- return false;
- }
- Create_DRV_XCardReader = NULL;
- Create_DRV_XCardReader = (pCreate_DRV_XCardReader)dlsym(pHandle, "Create_DRV_XCardReader");
- if (Create_DRV_XCardReader == NULL)
- {
- m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "LoadNTDRVDLL", "加载底层库方法 Create_DRV_XCardReader 失败");
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "加载底层库方法 Create_DRV_XCardReader 失败");
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "Exit-");
- return false;
- }
- Destroy_DRV_XCardReader = NULL;
- Destroy_DRV_XCardReader = (pDestroy_DRV_XCardReader)dlsym(pHandle, "Destroy_DRV_XCardReader");
- if (Destroy_DRV_XCardReader == NULL)
- {
- m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "LoadNTDRVDLL", "加载底层库方法 Destroy_DRV_XCardReader 失败");
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "加载底层库方法 Destroy_DRV_XCardReader 失败");
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "Exit-");
- return false;
- }
- drv_CardReader = Create_DRV_XCardReader();
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "加载底层库成功");
- LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
- << "Exit-");
- return true;
- }
- void m_ErrCode_Msg_Input_Struct(int ErrCode, char *Function, char *szErrMsg, int ErrLine)
- {
- memset(m_ErrCode_Msg.szErrMsg,0,sizeof(m_ErrCode_Msg.szErrMsg));
- memset(m_ErrCode_Msg.Function,0,sizeof(m_ErrCode_Msg.Function));
- strcpy(m_ErrCode_Msg.szErrMsg,szErrMsg);
- strcpy(m_ErrCode_Msg.Function,Function);
- m_ErrCode_Msg.ErrMsgLen=ErrLine;
- m_ErrCode_Msg.ErrCode=ErrCode;
- }
- //DeviceBaseClass
- ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
- {
- LOG4VTM(WARN, "<Contactless::GetDevCategory> - "
- << "Enter-");
- ErrorCodeEnum err = Error_Succeed;
- std::strcpy(devCategory.szModel, "FWID=1.0.2");
- std::strcpy(devCategory.szType, "PVER=DeCard#MID=DeCard_T10N");
- // std::strcpy(devCategory.szType, "PVER=CRT#MID=CRT_603");
- std::strcpy(devCategory.szVendor, "nantian");
- LOG4VTM(WARN, "<Contactless::GetDevCategory> - "
- << "Exit-");
- return err;
- }
- ErrorCodeEnum ContactlessCardImpl::Reset()
- {
- LOG4VTM(WARN, "<Contactless::Reset> - "
- << "Enter-");
- ErrorCodeEnum err = Error_Succeed;
- m_mode = 0;
- LOG4VTM(WARN, "<Contactless::Reset> - "
- << "Exit-");
- return err;
- }
- ErrorCodeEnum ContactlessCardImpl::DevClose()
- {
- LOG4VTM(WARN, "<Contactless::DevClose> - "
- << "Enter-");
- ErrorCodeEnum err = Error_Succeed;
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "DevClose", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::DevClose> - "
- << "依赖库加载失败");
- err = Error_NotInit;
- }
- else
- {
- int iRet = drv_CardReader->CloseDev();
- if (iRet != Error_Succeed)
- {
- bDevOpen = false;
- err = Error_DevConnFailed;
- LOG4VTM(WARN, "<Contactless::DevClose> - "
- << "执行CloseDev失败返回" << iRet);
- }
- }
- LOG4VTM(WARN, "<Contactless::DevClose> - "
- << "Exit-");
- return err;
- }
- ErrorCodeEnum ContactlessCardImpl::GetLastErr(DevErrorInfo &devErrInfo)
- {
- //memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
- //devErrInfo.dwErrMsgLen = m_ErrInfo.dwErrMsgLen;
- //memcpy(devErrInfo.szErrMsg, m_ErrInfo.szErrMsg, m_ErrInfo.dwErrMsgLen);
- //return Error_Succeed;
- LOG4VTM(WARN, "GetLastErr "
- << "Enter");
- memset(devErrInfo.szErrMsg,0,MAX_DEV_ERROR_MSG_LEN);
- sprintf(devErrInfo.szErrMsg,"{Errcode:%d,Description:'Func:%s,Line:%d,Msg:%s'}",m_ErrCode_Msg.ErrCode,m_ErrCode_Msg.Function,m_ErrCode_Msg.ErrMsgLen,m_ErrCode_Msg.szErrMsg);
- devErrInfo.dwErrMsgLen = strlen(devErrInfo.szErrMsg);
- LOG4VTM(WARN, "GetLastErr "
- << "Exit");
- return Error_Succeed;
- }
- DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
- {
- baseObj = new ContactlessCardImpl();
- if (baseObj == NULL)
- {
- return Error_Resource;
- }
- else
- {
- return Error_Succeed;
- }
- }
- DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
- {
- if (pBaseObj == NULL)
- {
- return Error_Param;
- }
- // if (ContactlessCardImpl *pTmp = dynamic_cast<ContactlessCardImpl *>(pBaseObj))
- // {
- // delete pTmp;
- // pTmp = NULL;
- // return Error_Succeed;
- // }
- delete (ContactlessCardImpl *)pBaseObj;
- pBaseObj = NULL;
- return Error_Param;
- }
- //device initialization
- ErrorCodeEnum ContactlessCardImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
- {
- LOG4VTM(WARN, "<Contactless::DevOpen> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_DevLoadFileFailed, "DevOpen", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::DevOpen> - "
- << "依赖库加载失败");
- iRet = Error_DevLoadFileFailed;
- throw iRet;
- }
- // memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"DevOpen","",__LINE__);
- iRet = drv_CardReader->OpenDev(NULL, NULL);
- if (iRet != Error_Succeed)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Connect Device Failed.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"DevOpen","Connect Device Failed",__LINE__);
- LOG4VTM(WARN, "<Contactless::DevOpen> - "
- << "执行OpenDev失败返回" << iRet);
- bDevOpen = false;
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- bDevOpen = true;
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::DevOpen> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // Get card reader status
- //
- ErrorCodeEnum ContactlessCardImpl::GetDevStatus(RFICReaderStatus &devStatus)
- {
- LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "GetDevStatus", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"GetDevStatus","",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"GetDevStatus","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- char drv_Device[100] = "\0";
- char drv_Media[100] = "\0";
- char drv_Chiper[100] = "\0";
- char *DevStatus[100] = {NULL};
- DevStatus[1] = drv_Device;
- DevStatus[2] = drv_Media;
- DevStatus[4] = drv_Chiper;
- iRet = drv_CardReader->GetDevStatus(0, DevStatus);
- if (iRet != Error_Succeed)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_Hardware,"GetDevStatus","Hardware Error",__LINE__);
- LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
- << "执行GetDevStatus失败返回" << iRet);
- iRet = Error_Hardware;
- throw iRet;
- }
- switch ((int)(drv_Media[8] - 0x30))
- {
- case MOTORCARDREADER_MEDIAPRESENT:
- m_tempStatus.eMediaPos = CI_MEDIA_RF;
- break;
- case MOTORCARDREADER_MEDIANOTPRESENT:
- m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
- break;
- default:
- m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
- break;
- }
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- devStatus = m_tempStatus;
- LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // Abort current operation.
- //
- ErrorCodeEnum ContactlessCardImpl::AbortRead()
- {
- LOG4VTM(WARN, "<Contactless::AbortRead> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "AbortRead", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::AbortRead> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"AbortRead","",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"AbortRead","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::AbortRead> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- bCancelFlag = true;
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::AbortRead> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // Active contactless card(Type A,B,Mifare)
- // The first,second,third activation order decided by fstType,scdType,thdType respectively
- // fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
- // outType indicates the type of activation result
- //
- ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType, char scdType, char thdType, char &outType)
- {
- LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "ActiveContactlessICCard", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"ActiveContactlessICCard","",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"ActiveContactlessICCard","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- if (fstType == 'A')
- {
- drv_CardReader->SetCardType(0x08);
- char sAtr[1024] = "\0";
- int iAtr = 0;
- iRet = drv_CardReader->ICCPower(3, sAtr, &iAtr);
- if (iRet != Error_Succeed)
- {
- if (iRet == -2)
- {
- //sprintf(m_ErrInfo.szErrMsg, "\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevMedia,"ActiveContactlessICCard","\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"",__LINE__);
- LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
- << "执行ICCPower失败返回" << iRet);
- iRet = Error_DevMedia;
- throw iRet;
- }
- else
- {
- //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_Hardware,"ActiveContactlessICCard","Hardware Error",__LINE__);
- LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
- << "执行ICCPower失败返回" << iRet);
- iRet = Error_Hardware;
- throw iRet;
- }
- }
- outType = 'A';
- }
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // Deactivate contactless IC card
- //
- ErrorCodeEnum ContactlessCardImpl::DeactContactlessICCard()
- {
- LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "DeactContactlessICCard", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"DeactContactlessICCard","",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"DeactContactlessICCard","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- drv_CardReader->SetCardType(0x08);
- iRet = drv_CardReader->ICCPower(0x0C, NULL, NULL);
- if (iRet != Error_Succeed)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_Hardware,"DeactContactlessICCard","Hardware Error",__LINE__);
- LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
- << "执行ICCPower失败返回" << iRet);
- iRet = Error_Hardware;
- throw iRet;
- }
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // Warm reset card(IC)
- //
- ErrorCodeEnum ContactlessCardImpl::WarmReset()
- {
- LOG4VTM(WARN, "<Contactless::WarmReset> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "WarmReset", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::WarmReset> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"WarmReset","Error_Succeed",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- // m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"WarmReset","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::WarmReset> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- drv_CardReader->SetCardType(0x08);
- iRet = drv_CardReader->ICCPower(0x0C, NULL, NULL);
- char sAtr[1024] = "\0";
- int iAtr = 0;
- iRet = drv_CardReader->ICCPower(3, sAtr, &iAtr);
- if (iRet != Error_Succeed)
- {
- if (iRet == -2)
- {
- //sprintf(m_ErrInfo.szErrMsg, "\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevMedia,"WarmReset","\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"",__LINE__);
- LOG4VTM(WARN, "<Contactless::WarmReset> - "
- << "执行ICCPower失败返回" << iRet);
- iRet = Error_DevMedia;
- throw iRet;
- }
- else
- {
- //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_Hardware,"WarmReset","Hardware Error",__LINE__);
- LOG4VTM(WARN, "<Contactless::WarmReset> - "
- << "执行ICCPower失败返回" << iRet);
- iRet = Error_Hardware;
- throw iRet;
- }
- }
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::WarmReset> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // Mifare operation
- // Arguments:
- // - eFunType:function type as load key,authentication and so on
- // - return/data(hex) byte order like BIG EDIAN. ex:0x12345678 --> data[i] = 0x12,data[i+1] = 0x34,data[i+2] = 0x56,data[i+3] = 0x78
- // - sendBuf:[parameter(hex)][data(hex)]
- // - recvBuf:[status(1byte)][return data(hex)]
- // -- [eFunType],[parameter,data],[status(1byte),return data]
- // -- [CI_MIFARE_LOAD_KEY],[key select(1byte),sector num(1byte),uncoded keys(6bytes)],[status(1byte)]
- // -- [CI_MIFARE_AUTH],[key select(1byte),sector num(1byte)],[status(1byte)]
- // -- [CI_MIFARE_READ],[block num(1byte)],[status(1byte),data(16bytes)]
- // -- [CI_MIFARE_WRITE],[block num(1byte),data(16bytes)],[status(1byte)]
- // -- [CI_MIFARE_INC],[source block num(1byte),destination block num(1byte),inc value(4bytes)],[status(1byte)]
- // -- [CI_MIFARE_DEC],[source block num(1byte),destination block num(1byte),dec value(4bytes)],[status(1byte)]
- // -- key select(1byte):AKey(00h),BKey(01h)
- // -- status(1byte):OK(00h),other error code(!00h)
- ErrorCodeEnum ContactlessCardImpl::MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo &recvBuf)
- {
- LOG4VTM(WARN, "<Contactless::MifareCommand> - "
- << "Enter-");
- int iRet = Error_Succeed;
- LOG4VTM(WARN, "<Contactless::MifareCommand> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //
- // RF Type A,B command.
- // APDU:Application Protocol Data Unit
- // Arguments:
- // - CmdSend.lpCmd:Command-APDU
- // - CmdRecv.lpData:Response-APDU
- //
- ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo &recvBuf)
- {
- LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "RFTypeABCommand", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"RFTypeABCommand","",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"RFTypeABCommand","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- drv_CardReader->SetCardType(0x08);
- unsigned char szSendData[1024] = "";
- memset(szSendData, 0, sizeof(szSendData));
- int iSendLength = 0;
- memcpy(szSendData, sendBuf.data, sendBuf.dwSize);
- iSendLength = sendBuf.dwSize;
- unsigned char szRecvData[1024] = "";
- int iRecvLength = 0;
- TRANSMIT:
- memset(szRecvData, 0, sizeof(szRecvData));
- iRet = drv_CardReader->ICCTransmit(0, (char *)szSendData, iSendLength, (char *)szRecvData, &iRecvLength);
- if (iRet != Error_Succeed)
- {
- if (iRet == -2)
- {
- //sprintf(m_ErrInfo.szErrMsg, "\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevMedia,"RFTypeABCommand","\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"",__LINE__);
- LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
- << "执行ICCTransmit失败返回" << iRet);
- iRet = Error_DevMedia;
- throw iRet;
- }
- else
- {
- //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_Hardware,"RFTypeABCommand","Hardware Error",__LINE__);
- LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
- << "执行ICCTransmit失败返回" << iRet);
- iRet = Error_Hardware;
- throw iRet;
- }
- }
- if (szRecvData[iRecvLength - 2] == 0x61)
- {
- memset(szSendData, 0, sizeof(szSendData));
- szSendData[0] = 0x00;
- szSendData[1] = 0xC0;
- szSendData[2] = 0x00;
- szSendData[3] = 0x00;
- szSendData[4] = szRecvData[iRecvLength - 1];
- iSendLength = 5;
- goto TRANSMIT;
- }
- else if (szRecvData[iRecvLength - 2] == 0x6C)
- {
- szSendData[iSendLength - 1] = szRecvData[iRecvLength - 1];
- goto TRANSMIT;
- }
- memcpy(recvBuf.data, szRecvData, iRecvLength);
- recvBuf.dwSize = iRecvLength;
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
- //halt card
- //card have been halted must move from induction zone then can be found again
- ErrorCodeEnum ContactlessCardImpl::HaltCard()
- {
- LOG4VTM(WARN, "<Contactless::HaltCard> - "
- << "Enter-");
- int iRet = Error_Succeed;
- try
- {
- if (!bDrvFlag)
- {
- m_ErrCode_Msg_Input_Struct(Error_NotInit, "HaltCard", "drv load error", __LINE__);
- LOG4VTM(WARN, "<Contactless::HaltCard> - "
- << "依赖库加载失败");
- iRet = Error_NotInit;
- throw iRet;
- }
- //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
- m_ErrCode_Msg_Input_Struct(Error_Succeed,"HaltCard","",__LINE__);
- if (!bDevOpen)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"HaltCard","Device Not Connected",__LINE__);
- LOG4VTM(WARN, "<Contactless::HaltCard> - "
- << "设备未连接");
- iRet = Error_DevConnFailed;
- throw iRet;
- }
- drv_CardReader->SetCardType(0x08);
- iRet = drv_CardReader->ICCPower(0x0C, NULL, NULL);
- if (iRet != Error_Succeed)
- {
- //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
- //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
- m_ErrCode_Msg_Input_Struct(Error_Hardware,"HaltCard","Hardware Error",__LINE__);
- LOG4VTM(WARN, "<Contactless::HaltCard> - "
- << "执行ICCPower失败返回" << iRet);
- iRet = Error_Hardware;
- throw iRet;
- }
- }
- catch (int ierror)
- {
- iRet = ierror;
- }
- LOG4VTM(WARN, "<Contactless::HaltCard> - "
- << "Exit-");
- return (ErrorCodeEnum)iRet;
- }
|