#include "contactless.nantian.1.1.h" #include #include ContactlessCardImpl::ContactlessCardImpl() : m_mode(0) { memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); m_ErrInfo.dwErrMsgLen = 0; m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT; m_pTrace = new CILIXTrace(NULL, "Contactless", "Contactless_DeCard_T10N"); 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, " - " << "libContactless.nantian.1.1.so v1.0.0.0"); 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, " - " << "Enter-"); char szInIPath[1024], szNTDRVPath[1024]; CILIX_AUX_X::CILIX_GetModuleCurPath(szInIPath); sprintf(szNTDRVPath, "%snantian/%s", szInIPath, "libDRV_DeCard_T10N.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, " - " << "加载底层库" << szNTDRVPath << "失败"); LOG4VTM(WARN, " - " << "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, " - " << "加载底层库方法 Create_DRV_XCardReader 失败"); LOG4VTM(WARN, " - " << "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, " - " << "加载底层库方法 Destroy_DRV_XCardReader 失败"); LOG4VTM(WARN, " - " << "Exit-"); return false; } drv_CardReader = Create_DRV_XCardReader(); LOG4VTM(WARN, " - " << "加载底层库成功"); LOG4VTM(WARN, " - " << "Exit-"); return true; } //DeviceBaseClass ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory) { LOG4VTM(WARN, " - " << "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.szVendor, "nantian"); LOG4VTM(WARN, " - " << "Exit-"); return err; } ErrorCodeEnum ContactlessCardImpl::Reset() { LOG4VTM(WARN, " - " << "Enter-"); ErrorCodeEnum err = Error_Succeed; m_mode = 0; LOG4VTM(WARN, " - " << "Exit-"); return err; } ErrorCodeEnum ContactlessCardImpl::DevClose() { LOG4VTM(WARN, " - " << "Enter-"); ErrorCodeEnum err = Error_Succeed; if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); err = Error_NotInit; } else { int iRet = drv_CardReader->CloseDev(); if (iRet != Error_Succeed) { bDevOpen = false; err = Error_DevConnFailed; LOG4VTM(WARN, " - " << "执行CloseDev失败返回" << iRet); } } LOG4VTM(WARN, " - " << "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; } 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(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, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); iRet = drv_CardReader->OpenDev(NULL, NULL); if (iRet != Error_Succeed) { sprintf(m_ErrInfo.szErrMsg, "Connect Device Failed."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "执行OpenDev失败返回" << iRet); bDevOpen = false; iRet = Error_DevConnFailed; throw iRet; } bDevOpen = true; } catch (int ierror) { iRet = ierror; } LOG4VTM(WARN, " - " << "Exit-"); return (ErrorCodeEnum)iRet; } // // Get card reader status // ErrorCodeEnum ContactlessCardImpl::GetDevStatus(RFICReaderStatus &devStatus) { LOG4VTM(WARN, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); 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); LOG4VTM(WARN, " - " << "执行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, " - " << "Exit-"); return (ErrorCodeEnum)iRet; } // // Abort current operation. // ErrorCodeEnum ContactlessCardImpl::AbortRead() { LOG4VTM(WARN, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); iRet = Error_DevConnFailed; throw iRet; } bCancelFlag = true; } catch (int ierror) { iRet = ierror; } LOG4VTM(WARN, " - " << "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, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); 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) { sprintf(m_ErrInfo.szErrMsg, "Hardware Error."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "执行ICCPower失败返回" << iRet); iRet = Error_Hardware; throw iRet; } outType = 'A'; } } catch (int ierror) { iRet = ierror; } LOG4VTM(WARN, " - " << "Exit-"); return (ErrorCodeEnum)iRet; } // // Deactivate contactless IC card // ErrorCodeEnum ContactlessCardImpl::DeactContactlessICCard() { LOG4VTM(WARN, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); 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); LOG4VTM(WARN, " - " << "执行ICCPower失败返回" << iRet); iRet = Error_Hardware; throw iRet; } } catch (int ierror) { iRet = ierror; } LOG4VTM(WARN, " - " << "Exit-"); return (ErrorCodeEnum)iRet; } // // Warm reset card(IC) // ErrorCodeEnum ContactlessCardImpl::WarmReset() { LOG4VTM(WARN, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); 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) { sprintf(m_ErrInfo.szErrMsg, "Hardware Error."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "执行ICCPower失败返回" << iRet); iRet = Error_Hardware; throw iRet; } } catch (int ierror) { iRet = ierror; } LOG4VTM(WARN, " - " << "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, " - " << "Enter-"); int iRet = Error_Succeed; LOG4VTM(WARN, " - " << "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, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); 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) { sprintf(m_ErrInfo.szErrMsg, "Hardware Error."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "执行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, " - " << "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, " - " << "Enter-"); int iRet = Error_Succeed; try { if (!bDrvFlag) { LOG4VTM(WARN, " - " << "依赖库加载失败"); iRet = Error_NotInit; throw iRet; } memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg)); if (!bDevOpen) { sprintf(m_ErrInfo.szErrMsg, "Device Not Connected."); m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg); LOG4VTM(WARN, " - " << "设备未连接"); 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); LOG4VTM(WARN, " - " << "执行ICCPower失败返回" << iRet); iRet = Error_Hardware; throw iRet; } } catch (int ierror) { iRet = ierror; } LOG4VTM(WARN, " - " << "Exit-"); return (ErrorCodeEnum)iRet; }