rficclassimpl_crt603cz7.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
  1. #include "rficclassimpl_crt603cz7.h"
  2. #include "CkLog.h"
  3. LOG_EXTERN()
  4. //获取当前模块所在路径
  5. void GetModulePath(char* lpStrPath)
  6. {
  7. LOG_FUNCTION();
  8. char szBuff[MAX_PATH];
  9. Dl_info path_info;
  10. std::string strLog = "";
  11. memset(&path_info, 0x00, sizeof(path_info));
  12. memset(szBuff, 0x00, sizeof(szBuff));
  13. int iRet = dladdr((const void*)GetModulePath, &path_info);
  14. if(!iRet)
  15. {
  16. return;
  17. }
  18. else
  19. {
  20. strcpy(szBuff, path_info.dli_fname);
  21. char *pLast=strrchr(szBuff, '/'); //find last '/'
  22. if(nullptr != pLast) *pLast = 0; //cut
  23. strcat(szBuff, "/"); //
  24. if(nullptr != lpStrPath) strcpy(lpStrPath, szBuff);
  25. }
  26. }
  27. RFICClassImpl::RFICClassImpl():
  28. m_bDevOpen(FALSE)
  29. ,m_pDll(nullptr)
  30. {
  31. LOG_FUNCTION();
  32. memset(m_strModulePath, 0x00, sizeof(m_strModulePath));
  33. GetModulePath(m_strModulePath); //获取so所在路径
  34. m_strIniPath = m_strModulePath;
  35. m_strIniPath += "CK-VTM-E1000.INI";
  36. m_strDllPath = m_strModulePath;
  37. SaveErrorInfo("RFICClassImpl 成功", DEP_SUCCESS, __FUNCTION__ , __LINE__);
  38. //--------------------------------------------------------------------
  39. }
  40. RFICClassImpl::~RFICClassImpl()
  41. {
  42. LOG_FUNCTION();
  43. DevClose();
  44. if(m_pDll != nullptr)
  45. {
  46. delete m_pDll;
  47. }
  48. m_bDevOpen = false;
  49. }
  50. int getFileVer(char* sFile, short &ch1, short &ch2)
  51. {
  52. ch1 = 0;
  53. ch2 = 0;
  54. char* pFind = strstr(sFile, ".so");
  55. char* pTemp = pFind;
  56. while(pTemp)
  57. {
  58. pFind = pTemp;
  59. pTemp = strstr(pFind + 3, ".so");
  60. }
  61. if(pFind == nullptr) return 0;
  62. pTemp = pFind - 1;
  63. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  64. if(*pTemp == '.')
  65. ch2 = atoi(pTemp + 1);
  66. pTemp--;
  67. while(isdigit(*pTemp) && pTemp > sFile) pTemp--;
  68. if(*pTemp == '.')
  69. ch1 = atoi(pTemp + 1);
  70. return 1;
  71. }
  72. ErrorCodeEnum RFICClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  73. {
  74. LOG_FUNCTION();
  75. LogM("RFICClassImpl::Entry->ContactlessCard GetDevCategory()!");
  76. memset(devCategory.szType, 0, MAX_DEV_TYPE_LEN);
  77. memset(devCategory.szModel, 0, MAX_DEV_MODEL_LEN);
  78. memset(devCategory.szVendor, 0, MAX_DEV_VENDOR_LEN);
  79. memcpy(devCategory.szType, "Keba.RFIC.CRT603CZ7-V1.00.01", strlen("Keba.RFIC.CRT603CZ7-V1.00.01"));
  80. memcpy(devCategory.szVendor, "keba", strlen("keba"));
  81. char sPath[256], sFile[128] = {0};
  82. GetCurModulePath(sPath, sFile);
  83. short v1,v2;
  84. getFileVer(sFile, v1, v2);
  85. devCategory.version.wMajor = v1;
  86. devCategory.version.wMinor = v2;
  87. devCategory.version.wRevision = 0xffff;
  88. devCategory.version.wBuild = FILE_VERSION;
  89. LogM("devCategory.szType = %s",devCategory.szType);
  90. LogM("devCategory.szVendor = %s",devCategory.szVendor);
  91. LogM("RFICClassImpl::Leave->ContactlessCard GetDevCategory() sucessfull!");
  92. return Error_Succeed;
  93. }
  94. // Reset device.
  95. // Do the cleaning work and initialize device again in order to return to
  96. // the normal condition.
  97. ErrorCodeEnum RFICClassImpl::Reset()
  98. {
  99. LOG_FUNCTION();
  100. char szErrorMsg[256] = {0};
  101. LogM("RFICClassImpl::Entry->ContactlessCard Reset()!");
  102. int nRet = CRT_SUCCESS;
  103. if (m_bDevOpen == FALSE)
  104. {
  105. return Error_NotInit;
  106. }
  107. nRet = m_pDll->CrtReset();
  108. if (nRet != CRT_SUCCESS)
  109. {
  110. sprintf(szErrorMsg, "复位失败");
  111. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CHIPPOWER, __FUNCTION__, __LINE__);
  112. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  113. }
  114. LogM("RFICClassImpl::Leave->ContactlessCard Reset() sucessfull!");
  115. return Error_Succeed;
  116. }
  117. //
  118. // Close device and do the cleaning work.
  119. // ex. close connection,close port,release memery and so on
  120. ErrorCodeEnum RFICClassImpl::DevClose()
  121. {
  122. LOG_FUNCTION();
  123. char szErrorMsg[256] = {0};
  124. LogM("RFICClassImpl::Entry->ContactlessCard DevClose()!");
  125. int nRet = CRT_SUCCESS;
  126. nRet = m_pDll->CrtDevCLose();
  127. if (nRet != CRT_SUCCESS)
  128. {
  129. sprintf(szErrorMsg, "关闭智能读卡器失败");
  130. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CONNECT, __FUNCTION__, __LINE__);
  131. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  132. }
  133. m_bDevOpen = false;
  134. LogM("RFICClassImpl::Leave->ContactlessCard DevClose() sucessfull!");
  135. return Error_Succeed;
  136. }
  137. // Get last error the device issued.
  138. // Error message must include explanatory memorandum ,the original error
  139. // code and anything in favour of location problem.
  140. ErrorCodeEnum RFICClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  141. {
  142. LOG_FUNCTION();
  143. LogM("RFICClassImpl::Entry->ContactlessCard GetLastErr()!");
  144. devErrInfo.dwErrMsgLen = 0;
  145. memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
  146. devErrInfo.dwErrMsgLen = (m_shErrCode << 16);
  147. sprintf(devErrInfo.szErrMsg, m_szErrMsg);
  148. devErrInfo.dwErrMsgLen += (strlen(devErrInfo.szErrMsg) & 0x0000FFFF);
  149. LogM("devErrInfo.szErrMsg = %s",devErrInfo.szErrMsg);
  150. LogM("RFICClassImpl::Leave->ContactlessCard GetLastErr() sucessfull!");
  151. return Error_Succeed;
  152. }
  153. //device initialization
  154. ErrorCodeEnum RFICClassImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  155. {
  156. LOG_FUNCTION();
  157. char szErrorMsg[256] = {0};
  158. LogM("RFICClassImpl::Entry->ContactlessCard DevOpen()!");
  159. int nRet = CRT_SUCCESS;
  160. CHAR strDllPath[256] = {0};
  161. char sDevInfo[64+1] = {0};
  162. char sID[1024] = {0};
  163. const char * tmpStr = "libCRT_603_CZ7.keba.so";
  164. strncat(strDllPath, "libCRT_603_CZ7.keba.so",strlen(tmpStr));
  165. m_pDll = new CDevDllLoad(strDllPath);
  166. if (nullptr == m_pDll)
  167. {
  168. LogM("RFICClassImpl::Entry->ContactlessCard DevOpen() new object CDevDllLoad failed!");
  169. sprintf(szErrorMsg, "加载依赖的DLL失败");
  170. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_LOADDLL, __FUNCTION__, __LINE__);
  171. return Error_DevNotAvailable;
  172. }
  173. nRet = m_pDll->CrtDevOpen();
  174. if (nRet != CRT_SUCCESS)
  175. {
  176. LogM("RFICClassImpl::Entry->ContactlessCard DevOpen() failed! <=> iRet = %d",nRet);
  177. if (nRet == CRT_ERR_LOADDLL)
  178. {
  179. sprintf(szErrorMsg, "加载依赖的DLL失败");
  180. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_LOADDLL, __FUNCTION__, __LINE__);
  181. }
  182. else
  183. {
  184. switch(nRet)
  185. {
  186. case CRT_ERR_SET_READERTYPE:
  187. sprintf(szErrorMsg, "设置读卡器类型失败");
  188. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_SET_TYPE_CAP, __FUNCTION__, __LINE__);
  189. break;
  190. case CRT_ERR_SET_READERNAME:
  191. sprintf(szErrorMsg, "设置读卡器名称失败");
  192. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_SET_TYPE_CAP, __FUNCTION__, __LINE__);
  193. break;
  194. case CRT_ERR_CONNECT:
  195. sprintf(szErrorMsg, "模块链接设备失败");
  196. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CONNECT, __FUNCTION__, __LINE__);
  197. break;
  198. default:
  199. break;
  200. }
  201. }
  202. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  203. }
  204. LogM("RFICClassImpl::Entry->ContactlessCard DevOpen() success! <=> iRet = %d",nRet);
  205. nRet = m_pDll->CrtInitSet();
  206. if (nRet != CRT_SUCCESS)
  207. {
  208. LogM("RFICClassImpl::Entry->ContactlessCard CrtInitSet() failed! <=> iRet = %d",nRet);
  209. switch(nRet)
  210. {
  211. case CRT_ERR_SET_CONTRAL_CMD:
  212. sprintf(szErrorMsg, "控制命令错");
  213. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_SET_CONTRAL_CMD, __FUNCTION__, __LINE__);
  214. break;
  215. case CRT_ERR_SET_TYPE_CAP:
  216. sprintf(szErrorMsg, "设置读卡器能读取TYPE B卡能力失败");
  217. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_SET_TYPE_CAP, __FUNCTION__, __LINE__);
  218. break;
  219. default:
  220. break;
  221. }
  222. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  223. }
  224. LogM("RFICClassImpl::Entry->ContactlessCard CrtInitSet() success! <=> iRet = %d",nRet);
  225. m_bDevOpen = TRUE;
  226. LogM("RFICClassImpl::Leave->ContactlessCard DevOpen() sucessfull!");
  227. return Error_Succeed;
  228. }
  229. //
  230. // Get card reader status
  231. //
  232. ErrorCodeEnum RFICClassImpl::GetDevStatus(RFICReaderStatus &devStatus)
  233. {
  234. LOG_FUNCTION();
  235. char szErrorMsg[256] = {0};
  236. LogM("RFICClassImpl::Entry->ContactlessCard GetDevStatus()!");
  237. int nRet = CRT_SUCCESS;
  238. int nType = CRT_CARD_TYPE_UNKNOWN;
  239. BOOL bFind = FALSE;
  240. if (m_bDevOpen == FALSE)
  241. {
  242. return Error_NotInit;
  243. }
  244. nRet = m_pDll->CrtFindCard(&bFind);
  245. if (nRet != CRT_SUCCESS)
  246. {
  247. LogM("RFICClassImpl::Entry->ContactlessCard CrtFindCard() failed! <=> iRet = %d",nRet);
  248. sprintf(szErrorMsg, "获取卡状态失败");
  249. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_GET_SATUTS, __FUNCTION__, __LINE__);
  250. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  251. }
  252. LogM("RFICClassImpl::Entry->ContactlessCard CrtFindCard() success! <=> iRet = %d",nRet);
  253. if (bFind == TRUE)
  254. {
  255. devStatus.eMediaPos = CI_MEDIA_PRESENT;
  256. nRet = m_pDll->CrtGetCardType(&nType);
  257. if (nRet != CRT_SUCCESS)
  258. {
  259. LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() failed! <=> iRet = %d",nRet);
  260. sprintf(szErrorMsg, "获取卡类型失败");
  261. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_GET_CARD_TYPE, __FUNCTION__, __LINE__);
  262. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  263. }
  264. LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %d",nType);
  265. if (nType == CRT_CARD_TYPE_TYPEA || nType == CRT_CARD_TYPE_TYPEB)
  266. {
  267. devStatus.eMediaPos = CI_MEDIA_RF;
  268. }
  269. else if (nType == CRT_CARD_TYPE_IDCARD)
  270. {
  271. devStatus.eMediaPos = CI_MEDIA_IDCARD;
  272. }
  273. else if (nType == CRT_CARD_TYPE_NOCARD)
  274. {
  275. devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
  276. }
  277. }
  278. else
  279. {
  280. devStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
  281. }
  282. LogM("RFICClassImpl::Entry->ContactlessCard GetDevStatus() success! <=> devStatus.eMediaPos = %d",devStatus.eMediaPos);
  283. LogM("RFICClassImpl::Leave->ContactlessCard GetDevStatus() sucessfull!");
  284. return Error_Succeed;
  285. }
  286. //
  287. // Abort current operation.
  288. //
  289. ErrorCodeEnum RFICClassImpl::AbortRead()
  290. {
  291. LOG_FUNCTION();
  292. LogM("RFICClassImpl::Entry->ContactlessCard AbortRead()!");
  293. if (m_bDevOpen == FALSE)
  294. {
  295. return Error_NotInit;
  296. }
  297. LogM("RFICClassImpl::Leave->ContactlessCard AbortRead() sucessfull!");
  298. return Error_Succeed;
  299. }
  300. //
  301. // Active contactless card(Type A,B,Mifare)
  302. // The first,second,third activation order decided by fstType,scdType,thdType respectively
  303. // fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
  304. // outType indicates the type of activation result
  305. //
  306. ErrorCodeEnum RFICClassImpl::ActiveContactlessICCard(char fstType,char scdType,char thdType,char &outType)
  307. {
  308. LOG_FUNCTION();
  309. char szErrorMsg[256] = {0};
  310. LogM("RFICClassImpl::Entry->ContactlessCard ActiveContactlessICCard()!");
  311. int nRet = CRT_SUCCESS;
  312. int nType = CRT_CARD_TYPE_UNKNOWN;
  313. WORD wTime = 0;
  314. char szGetUID[16] = {0x00};
  315. CRT_ART_Info crtGetATR = {0x00};
  316. if (m_bDevOpen == FALSE)
  317. {
  318. return Error_NotInit;
  319. }
  320. do
  321. {
  322. nRet = m_pDll->CrtGetCardType(&nType);
  323. if (nRet == CRT_SUCCESS)
  324. {
  325. LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %d",nType);
  326. if (nType == CRT_CARD_TYPE_TYPEA)
  327. {
  328. outType = 'A';
  329. break;
  330. }
  331. else if (nType == CRT_CARD_TYPE_TYPEB)
  332. {
  333. outType = 'B';
  334. break;
  335. }
  336. else
  337. {
  338. wTime++;
  339. LogM("Do CrtGetCardType() success! <=> nType = %c",nType);
  340. //return Error_NotImpl;
  341. }
  342. }
  343. else
  344. {
  345. wTime++;
  346. }
  347. usleep(100*1000);
  348. if (wTime > 5)
  349. {
  350. LogM("Do CrtGetCardType() Break!");
  351. break;
  352. }
  353. } while ((nRet != CRT_SUCCESS) || ((nType != CRT_CARD_TYPE_TYPEA) && (nType != CRT_CARD_TYPE_TYPEB)));
  354. if (nType == 0 || nType > 2)
  355. {
  356. LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %c",nType);
  357. return Error_NotImpl;
  358. }
  359. if (nRet != CRT_SUCCESS)
  360. {
  361. LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() failed! <=> iRet = %d",nRet);
  362. sprintf(szErrorMsg, "获取卡类型失败");
  363. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_GET_CARD_TYPE, __FUNCTION__, __LINE__);
  364. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  365. }
  366. LogM("RFICClassImpl::Entry->ContactlessCard CrtGetCardType() success! <=> nType = %c",outType);
  367. nRet = m_pDll->CrtActiveCard(&crtGetATR);
  368. if (nRet != CRT_SUCCESS)
  369. {
  370. LogM("RFICClassImpl::Entry->ContactlessCard CrtActiveCard() failed! <=> nRet = %d",nRet);
  371. sprintf(szErrorMsg, "无卡或不支持的卡片");
  372. SaveErrorInfo(szErrorMsg, DEP_PROTOCOL_UNSUPPORTED, __FUNCTION__, __LINE__);
  373. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  374. }
  375. m_EjectCard = false;
  376. LogM("RFICClassImpl::Entry->ContactlessCard CrtActiveCard() success! <=> nRet = %d",nRet);
  377. LogM("RFICClassImpl::Entry->ContactlessCard CrtActiveCard() <=> crtGetATR = %x",crtGetATR.byATR);
  378. LogM("RFICClassImpl::Leave->ContactlessCard ActiveContactlessICCard() sucessfull!");
  379. return Error_Succeed;
  380. }
  381. //
  382. // Deactivate contactless IC card
  383. //
  384. ErrorCodeEnum RFICClassImpl::DeactContactlessICCard()
  385. {
  386. LOG_FUNCTION();
  387. char szErrorMsg[256] = {0};
  388. LogM("RFICClassImpl::Entry->ContactlessCard DeactContactlessICCard()!");
  389. int nRet = CRT_SUCCESS;
  390. if (m_bDevOpen == FALSE)
  391. {
  392. return Error_NotInit;
  393. }
  394. nRet = m_pDll->CrtDeActive();
  395. if (nRet != CRT_SUCCESS)
  396. {
  397. LogM("RFICClassImpl::Entry->ContactlessCard CrtDeActive() failed! <=> iRet = %d",nRet);
  398. sprintf(szErrorMsg, "弹卡下电失败");
  399. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CHIPPOWER, __FUNCTION__, __LINE__);
  400. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  401. }
  402. m_EjectCard = true;
  403. LogM("RFICClassImpl::Entry->ContactlessCard CrtDeActive() success! <=> iRet = %d",nRet);
  404. LogM("RFICClassImpl::Leave->ContactlessCard DeactContactlessICCard() sucessfull!");
  405. return Error_Succeed;
  406. }
  407. //
  408. // Warm reset card(IC)
  409. //
  410. ErrorCodeEnum RFICClassImpl::WarmReset()
  411. {
  412. LOG_FUNCTION();
  413. char szErrorMsg[256] = {0};
  414. LogM("RFICClassImpl::Entry->ContactlessCard WarmReset()!");
  415. int nRet = CRT_SUCCESS;
  416. if (m_bDevOpen == FALSE)
  417. {
  418. return Error_NotInit;
  419. }
  420. nRet = m_pDll->CrtWarmReset();
  421. if (nRet != CRT_SUCCESS)
  422. {
  423. LogM("RFICClassImpl::Entry->ContactlessCard CrtWarmReset() failed! <=> iRet = %d",nRet);
  424. sprintf(szErrorMsg, "热复位失败");
  425. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CHIPPOWER, __FUNCTION__, __LINE__);
  426. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  427. }
  428. LogM("RFICClassImpl::Entry->ContactlessCard CrtWarmReset() success! <=> iRet = %d",nRet);
  429. LogM("RFICClassImpl::Leave->ContactlessCard WarmReset() sucessfull!");
  430. return Error_Succeed;
  431. }
  432. //
  433. // Mifare operation
  434. // Arguments:
  435. // - eFunType:function type as load key,authentication and so on
  436. // - 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
  437. // - sendBuf:[parameter(hex)][data(hex)]
  438. // - recvBuf:[status(1byte)][return data(hex)]
  439. // -- [eFunType],[parameter,data],[status(1byte),return data]
  440. // -- [CI_MIFARE_LOAD_KEY],[key select(1byte),sector num(1byte),uncoded keys(6bytes)],[status(1byte)]
  441. // -- [CI_MIFARE_AUTH],[key select(1byte),sector num(1byte)],[status(1byte)]
  442. // -- [CI_MIFARE_READ],[block num(1byte)],[status(1byte),data(16bytes)]
  443. // -- [CI_MIFARE_WRITE],[block num(1byte),data(16bytes)],[status(1byte)]
  444. // -- [CI_MIFARE_INC],[source block num(1byte),destination block num(1byte),inc value(4bytes)],[status(1byte)]
  445. // -- [CI_MIFARE_DEC],[source block num(1byte),destination block num(1byte),dec value(4bytes)],[status(1byte)]
  446. // -- key select(1byte):AKey(00h),BKey(01h)
  447. // -- status(1byte):OK(00h),other error code(!00h)
  448. ErrorCodeEnum RFICClassImpl::MifareCommand(MifareFuctionEnum eFunType,CmdInfo sendBuf,CmdInfo &recvBuf)
  449. {
  450. LOG_FUNCTION();
  451. LogM("RFICClassImpl::Entry->ContactlessCard MifareCommand()!");
  452. LogM("RFICClassImpl::Leave->ContactlessCard MifareCommand() sucessfull!");
  453. return Error_Succeed;
  454. }
  455. //
  456. // RF Type A,B command.
  457. // APDU:Application Protocol Data Unit
  458. // Arguments:
  459. // - CmdSend.lpCmd:Command-APDU
  460. // - CmdRecv.lpData:Response-APDU
  461. //
  462. ErrorCodeEnum RFICClassImpl::RFTypeABCommand(CmdInfo sendBuf,CmdInfo &recvBuf)
  463. {
  464. LOG_FUNCTION();
  465. char szErrorMsg[256] = {0};
  466. LogM("RFICClassImpl::Entry->ContactlessCard RFTypeABCommand()!");
  467. int nRet = CRT_SUCCESS;
  468. if(m_EjectCard == true)
  469. {
  470. sprintf(szErrorMsg, "IC卡已下电");
  471. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CHIPPOWER, __FUNCTION__, __LINE__);
  472. return Error_Param;
  473. }
  474. CRT_Chip_Info sendChip = {0x00};
  475. CRT_Chip_Info recvChip = {0x00};
  476. if (sendBuf.data == NULL || sendBuf.dwSize == 0)
  477. {
  478. return Error_Param;
  479. }
  480. sendChip.nLen = sendBuf.dwSize;
  481. memcpy(sendChip.byData, sendBuf.data, sendBuf.dwSize);
  482. LogM("RFICClassImpl::Entry->ContactlessCard CrtChipIO() <=> sendChip.byData = %x",sendChip.byData);
  483. nRet = m_pDll->CrtChipIO(sendChip, &recvChip);
  484. if (nRet != CRT_SUCCESS)
  485. {
  486. LogM("RFICClassImpl::Entry->ContactlessCard CrtChipIO() failed! <=> iRet = %d",nRet);
  487. switch(nRet)
  488. {
  489. case CRT_ERR_PARAM:
  490. sprintf(szErrorMsg, "参数错");
  491. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_PARAM, __FUNCTION__, __LINE__);
  492. break;
  493. case CRT_ERR_CHIPIO:
  494. sprintf(szErrorMsg, "CHIPIO失败");
  495. SaveErrorInfo(szErrorMsg, DEP_NO_E_ContactlessCard_CHIPIO, __FUNCTION__, __LINE__);
  496. break;
  497. default:
  498. break;
  499. }
  500. return ErrorCodeToCMB(m_pDll->CrtGetErrorType(nRet));
  501. }
  502. LogM("RFICClassImpl::Entry->ContactlessCard CrtChipIO() success! <=> iRet = %d",nRet);
  503. if (recvChip.nLen > 0)
  504. {
  505. recvBuf.dwSize = recvChip.nLen;
  506. memcpy(recvBuf.data, recvChip.byData, recvChip.nLen);
  507. LogM("RFICClassImpl::Entry->ContactlessCard CrtChipIO() <=> recvBuf.data = %x",recvBuf.data);
  508. }
  509. return Error_Succeed;
  510. }
  511. //halt card
  512. //card have been halted must move from induction zone then can be found again
  513. ErrorCodeEnum RFICClassImpl::HaltCard()
  514. {
  515. return Error_Succeed;
  516. }
  517. //Private
  518. void RFICClassImpl::SaveErrorInfo(CHAR* errMsg, int errCode, const CHAR* strFunc, int nLine)
  519. {
  520. CHAR chJson[MAX_DEV_ERROR_MSG_LEN] = {0};
  521. sprintf(chJson, "Func:%s,Line:%d,Msg:%s", strFunc, nLine, errMsg);
  522. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  523. sprintf(m_szErrMsg, "{\"Errcode\":%d,\"Description\":%s}", errCode,chJson);
  524. LogM(m_szErrMsg);
  525. /*
  526. CHAR chJson[MAX_DEV_ERROR_MSG_LEN] = {0};
  527. QJsonObject root_Obj;
  528. QJsonDocument root_Doc;
  529. sprintf(chJson, "Func:%s,Line:%d,Msg:%s", strFunc, nLine, errMsg);
  530. root_Obj.insert("ErrCode", errCode);
  531. root_Obj.insert("Description", chJson);
  532. root_Doc.setObject(root_Obj);
  533. //QByteArray root_str = root_Doc.toJson(QJsonDocument::Compact); //紧凑格式
  534. QByteArray root_str = root_Doc.toJson(QJsonDocument::Indented); //标准JSON格式 QString strJson(root_str);
  535. QString strJson(root_str);
  536. memset(m_szErrMsg, 0, MAX_DEV_ERROR_MSG_LEN);
  537. sprintf(m_szErrMsg, strJson.toUtf8().data());
  538. LogM(m_szErrMsg);
  539. */
  540. }
  541. ErrorCodeEnum RFICClassImpl::ErrorCodeToCMB(int nRes)
  542. {
  543. ErrorCodeEnum eRet = Error_NotImpl;
  544. switch(nRes)
  545. {
  546. case CRT_SUCCESS:
  547. eRet = Error_Succeed;
  548. m_shErrCode = DEP_SUCCESS;
  549. break;
  550. case CRT_ERR_TYPE_CONNECT:
  551. eRet = Error_DevNotAvailable;
  552. m_shErrCode = DEP_DEV_CONNECT_FAILED;
  553. break;
  554. case CRT_ERR_TYPE_HWERROR:
  555. eRet = Error_Hardware;
  556. m_shErrCode = DEP_HARDWARE;
  557. break;
  558. case CRT_ERR_TYPE_MEDIA:
  559. eRet = Error_NotImpl;
  560. m_shErrCode = DEP_EXCEPTION;
  561. break;
  562. case CRT_ERR_TYPE_MIFARE:
  563. eRet = Error_NotImpl;
  564. m_shErrCode = DEP_EXCEPTION;
  565. break;
  566. case CRT_ERR_TYPE_PARAM:
  567. eRet = Error_Param;
  568. m_shErrCode = DEP_INVALID_PARAMETER;
  569. break;
  570. default:
  571. break;
  572. }
  573. return eRet;
  574. }
  575. int RFICClassImpl::GetDllPathLocal(std::string &dllPath)
  576. {
  577. char szBuff[MAX_PATH];
  578. char * pathRtn = getcwd(szBuff,sizeof (szBuff));
  579. if(pathRtn == nullptr)
  580. {
  581. dllPath = "";
  582. return Error_Null;
  583. }
  584. dllPath = szBuff;
  585. dllPath+="/";
  586. return Error_Succeed;
  587. }