contactless.nantian.1.1.cpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. #include "contactless.nantian.1.1.h"
  2. #include <cstring>
  3. #include <cstdio>
  4. ErrCode_Msg m_ErrCode_Msg;
  5. ContactlessCardImpl::ContactlessCardImpl()
  6. : m_mode(0)
  7. {
  8. memset(m_ErrCode_Msg.szErrMsg, 0, sizeof(m_ErrCode_Msg.szErrMsg));
  9. memset(m_ErrCode_Msg.Function,0,sizeof(m_ErrCode_Msg.Function));
  10. m_ErrCode_Msg.ErrMsgLen = 0;
  11. m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
  12. m_pTrace = new CILIXTrace(NULL, "Contactless", "Contactless_DeCard_T10N");
  13. // m_pTrace = new CILIXTrace(NULL, "Contactless", "Contactless_CRT_603");
  14. char INIPath[100] = "";
  15. CILIX_AUX_X::CILIX_GetModuleCurPath(INIPath);
  16. strcat(INIPath, "log.nantian.ini");
  17. char log_dir[100] = "";
  18. CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_dir", log_dir, "/etc/nantian");
  19. char log_level[100] = "";
  20. CILIX_AUX_X::CILIX_X_INIKeyString(INIPath, "LOGConfig", "log_level", log_level, "3");
  21. cmb::log_init_config config;
  22. config.dev_name = "contactlessso";
  23. config.log_dir = log_dir;
  24. config.log_level = atoi(log_level);
  25. std::string str;
  26. cmb::log4vendor::init(config, str);
  27. LOG4VTM(WARN, "<Contactless::ContactlessCardImpl> - "
  28. << "libContactless.nantian.1.1.so v1.0.0.1");
  29. bCancelFlag = false;
  30. bDevOpen = false;
  31. pHandle = NULL;
  32. drv_CardReader = NULL;
  33. bDrvFlag = LoadDrvDll();
  34. // if (!LoadDrvDll())
  35. // return;
  36. }
  37. ContactlessCardImpl::~ContactlessCardImpl()
  38. {
  39. if (drv_CardReader)
  40. Destroy_DRV_XCardReader(drv_CardReader);
  41. if (pHandle)
  42. dlclose(pHandle);
  43. drv_CardReader = NULL;
  44. pHandle = NULL;
  45. }
  46. bool ContactlessCardImpl::LoadDrvDll()
  47. {
  48. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  49. << "Enter-");
  50. char szInIPath[1024], szNTDRVPath[1024];
  51. CILIX_AUX_X::CILIX_GetModuleCurPath(szInIPath);
  52. sprintf(szNTDRVPath, "%snantian/%s", szInIPath, "libDRV_DeCard_T10N.nantian.so");
  53. // sprintf(szNTDRVPath, "%snantian/%s", szInIPath, "libDRV_CRT_603.nantian.so");
  54. pHandle = NULL;
  55. void *pszErr = NULL;
  56. pHandle = dlopen(szNTDRVPath, RTLD_LAZY);
  57. if (!pHandle || pszErr)
  58. {
  59. m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "LoadNTDRVDLL", "加载底层库%s失败", szNTDRVPath);
  60. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  61. << "加载底层库" << szNTDRVPath << "失败");
  62. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  63. << "Exit-");
  64. return false;
  65. }
  66. Create_DRV_XCardReader = NULL;
  67. Create_DRV_XCardReader = (pCreate_DRV_XCardReader)dlsym(pHandle, "Create_DRV_XCardReader");
  68. if (Create_DRV_XCardReader == NULL)
  69. {
  70. m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "LoadNTDRVDLL", "加载底层库方法 Create_DRV_XCardReader 失败");
  71. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  72. << "加载底层库方法 Create_DRV_XCardReader 失败");
  73. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  74. << "Exit-");
  75. return false;
  76. }
  77. Destroy_DRV_XCardReader = NULL;
  78. Destroy_DRV_XCardReader = (pDestroy_DRV_XCardReader)dlsym(pHandle, "Destroy_DRV_XCardReader");
  79. if (Destroy_DRV_XCardReader == NULL)
  80. {
  81. m_pTrace->WriteTrace(CILIXTRACE_L_ERROR, "LoadNTDRVDLL", "加载底层库方法 Destroy_DRV_XCardReader 失败");
  82. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  83. << "加载底层库方法 Destroy_DRV_XCardReader 失败");
  84. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  85. << "Exit-");
  86. return false;
  87. }
  88. drv_CardReader = Create_DRV_XCardReader();
  89. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  90. << "加载底层库成功");
  91. LOG4VTM(WARN, "<Contactless::LoadDrvDll> - "
  92. << "Exit-");
  93. return true;
  94. }
  95. void m_ErrCode_Msg_Input_Struct(int ErrCode, char *Function, char *szErrMsg, int ErrLine)
  96. {
  97. memset(m_ErrCode_Msg.szErrMsg,0,sizeof(m_ErrCode_Msg.szErrMsg));
  98. memset(m_ErrCode_Msg.Function,0,sizeof(m_ErrCode_Msg.Function));
  99. strcpy(m_ErrCode_Msg.szErrMsg,szErrMsg);
  100. strcpy(m_ErrCode_Msg.Function,Function);
  101. m_ErrCode_Msg.ErrMsgLen=ErrLine;
  102. m_ErrCode_Msg.ErrCode=ErrCode;
  103. }
  104. //DeviceBaseClass
  105. ErrorCodeEnum ContactlessCardImpl::GetDevCategory(DevCategoryInfo &devCategory)
  106. {
  107. LOG4VTM(WARN, "<Contactless::GetDevCategory> - "
  108. << "Enter-");
  109. ErrorCodeEnum err = Error_Succeed;
  110. std::strcpy(devCategory.szModel, "FWID=1.0.2");
  111. std::strcpy(devCategory.szType, "PVER=DeCard#MID=DeCard_T10N");
  112. // std::strcpy(devCategory.szType, "PVER=CRT#MID=CRT_603");
  113. std::strcpy(devCategory.szVendor, "nantian");
  114. LOG4VTM(WARN, "<Contactless::GetDevCategory> - "
  115. << "Exit-");
  116. return err;
  117. }
  118. ErrorCodeEnum ContactlessCardImpl::Reset()
  119. {
  120. LOG4VTM(WARN, "<Contactless::Reset> - "
  121. << "Enter-");
  122. ErrorCodeEnum err = Error_Succeed;
  123. m_mode = 0;
  124. LOG4VTM(WARN, "<Contactless::Reset> - "
  125. << "Exit-");
  126. return err;
  127. }
  128. ErrorCodeEnum ContactlessCardImpl::DevClose()
  129. {
  130. LOG4VTM(WARN, "<Contactless::DevClose> - "
  131. << "Enter-");
  132. ErrorCodeEnum err = Error_Succeed;
  133. if (!bDrvFlag)
  134. {
  135. m_ErrCode_Msg_Input_Struct(Error_NotInit, "DevClose", "drv load error", __LINE__);
  136. LOG4VTM(WARN, "<Contactless::DevClose> - "
  137. << "依赖库加载失败");
  138. err = Error_NotInit;
  139. }
  140. else
  141. {
  142. int iRet = drv_CardReader->CloseDev();
  143. if (iRet != Error_Succeed)
  144. {
  145. bDevOpen = false;
  146. err = Error_DevConnFailed;
  147. LOG4VTM(WARN, "<Contactless::DevClose> - "
  148. << "执行CloseDev失败返回" << iRet);
  149. }
  150. }
  151. LOG4VTM(WARN, "<Contactless::DevClose> - "
  152. << "Exit-");
  153. return err;
  154. }
  155. ErrorCodeEnum ContactlessCardImpl::GetLastErr(DevErrorInfo &devErrInfo)
  156. {
  157. //memset(devErrInfo.szErrMsg, 0, sizeof(devErrInfo.szErrMsg));
  158. //devErrInfo.dwErrMsgLen = m_ErrInfo.dwErrMsgLen;
  159. //memcpy(devErrInfo.szErrMsg, m_ErrInfo.szErrMsg, m_ErrInfo.dwErrMsgLen);
  160. //return Error_Succeed;
  161. LOG4VTM(WARN, "GetLastErr "
  162. << "Enter");
  163. memset(devErrInfo.szErrMsg,0,MAX_DEV_ERROR_MSG_LEN);
  164. 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);
  165. devErrInfo.dwErrMsgLen = strlen(devErrInfo.szErrMsg);
  166. LOG4VTM(WARN, "GetLastErr "
  167. << "Exit");
  168. return Error_Succeed;
  169. }
  170. DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj)
  171. {
  172. baseObj = new ContactlessCardImpl();
  173. if (baseObj == NULL)
  174. {
  175. return Error_Resource;
  176. }
  177. else
  178. {
  179. return Error_Succeed;
  180. }
  181. }
  182. DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
  183. {
  184. if (pBaseObj == NULL)
  185. {
  186. return Error_Param;
  187. }
  188. // if (ContactlessCardImpl *pTmp = dynamic_cast<ContactlessCardImpl *>(pBaseObj))
  189. // {
  190. // delete pTmp;
  191. // pTmp = NULL;
  192. // return Error_Succeed;
  193. // }
  194. delete (ContactlessCardImpl *)pBaseObj;
  195. pBaseObj = NULL;
  196. return Error_Param;
  197. }
  198. //device initialization
  199. ErrorCodeEnum ContactlessCardImpl::DevOpen(DWORD dwPort, DWORD dwBaudRate)
  200. {
  201. LOG4VTM(WARN, "<Contactless::DevOpen> - "
  202. << "Enter-");
  203. int iRet = Error_Succeed;
  204. try
  205. {
  206. if (!bDrvFlag)
  207. {
  208. m_ErrCode_Msg_Input_Struct(Error_DevLoadFileFailed, "DevOpen", "drv load error", __LINE__);
  209. LOG4VTM(WARN, "<Contactless::DevOpen> - "
  210. << "依赖库加载失败");
  211. iRet = Error_DevLoadFileFailed;
  212. throw iRet;
  213. }
  214. // memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  215. m_ErrCode_Msg_Input_Struct(Error_Succeed,"DevOpen","",__LINE__);
  216. iRet = drv_CardReader->OpenDev(NULL, NULL);
  217. if (iRet != Error_Succeed)
  218. {
  219. //sprintf(m_ErrInfo.szErrMsg, "Connect Device Failed.");
  220. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  221. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"DevOpen","Connect Device Failed",__LINE__);
  222. LOG4VTM(WARN, "<Contactless::DevOpen> - "
  223. << "执行OpenDev失败返回" << iRet);
  224. bDevOpen = false;
  225. iRet = Error_DevConnFailed;
  226. throw iRet;
  227. }
  228. bDevOpen = true;
  229. }
  230. catch (int ierror)
  231. {
  232. iRet = ierror;
  233. }
  234. LOG4VTM(WARN, "<Contactless::DevOpen> - "
  235. << "Exit-");
  236. return (ErrorCodeEnum)iRet;
  237. }
  238. //
  239. // Get card reader status
  240. //
  241. ErrorCodeEnum ContactlessCardImpl::GetDevStatus(RFICReaderStatus &devStatus)
  242. {
  243. LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
  244. << "Enter-");
  245. int iRet = Error_Succeed;
  246. try
  247. {
  248. if (!bDrvFlag)
  249. {
  250. m_ErrCode_Msg_Input_Struct(Error_NotInit, "GetDevStatus", "drv load error", __LINE__);
  251. LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
  252. << "依赖库加载失败");
  253. iRet = Error_NotInit;
  254. throw iRet;
  255. }
  256. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  257. m_ErrCode_Msg_Input_Struct(Error_Succeed,"GetDevStatus","",__LINE__);
  258. if (!bDevOpen)
  259. {
  260. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  261. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  262. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"GetDevStatus","Device Not Connected",__LINE__);
  263. LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
  264. << "设备未连接");
  265. iRet = Error_DevConnFailed;
  266. throw iRet;
  267. }
  268. char drv_Device[100] = "\0";
  269. char drv_Media[100] = "\0";
  270. char drv_Chiper[100] = "\0";
  271. char *DevStatus[100] = {NULL};
  272. DevStatus[1] = drv_Device;
  273. DevStatus[2] = drv_Media;
  274. DevStatus[4] = drv_Chiper;
  275. iRet = drv_CardReader->GetDevStatus(0, DevStatus);
  276. if (iRet != Error_Succeed)
  277. {
  278. //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
  279. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  280. m_ErrCode_Msg_Input_Struct(Error_Hardware,"GetDevStatus","Hardware Error",__LINE__);
  281. LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
  282. << "执行GetDevStatus失败返回" << iRet);
  283. iRet = Error_Hardware;
  284. throw iRet;
  285. }
  286. switch ((int)(drv_Media[8] - 0x30))
  287. {
  288. case MOTORCARDREADER_MEDIAPRESENT:
  289. m_tempStatus.eMediaPos = CI_MEDIA_RF;
  290. break;
  291. case MOTORCARDREADER_MEDIANOTPRESENT:
  292. m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
  293. break;
  294. default:
  295. m_tempStatus.eMediaPos = CI_MEDIA_NOTPRESENT;
  296. break;
  297. }
  298. }
  299. catch (int ierror)
  300. {
  301. iRet = ierror;
  302. }
  303. devStatus = m_tempStatus;
  304. LOG4VTM(WARN, "<Contactless::GetDevStatus> - "
  305. << "Exit-");
  306. return (ErrorCodeEnum)iRet;
  307. }
  308. //
  309. // Abort current operation.
  310. //
  311. ErrorCodeEnum ContactlessCardImpl::AbortRead()
  312. {
  313. LOG4VTM(WARN, "<Contactless::AbortRead> - "
  314. << "Enter-");
  315. int iRet = Error_Succeed;
  316. try
  317. {
  318. if (!bDrvFlag)
  319. {
  320. m_ErrCode_Msg_Input_Struct(Error_NotInit, "AbortRead", "drv load error", __LINE__);
  321. LOG4VTM(WARN, "<Contactless::AbortRead> - "
  322. << "依赖库加载失败");
  323. iRet = Error_NotInit;
  324. throw iRet;
  325. }
  326. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  327. m_ErrCode_Msg_Input_Struct(Error_Succeed,"AbortRead","",__LINE__);
  328. if (!bDevOpen)
  329. {
  330. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  331. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  332. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"AbortRead","Device Not Connected",__LINE__);
  333. LOG4VTM(WARN, "<Contactless::AbortRead> - "
  334. << "设备未连接");
  335. iRet = Error_DevConnFailed;
  336. throw iRet;
  337. }
  338. bCancelFlag = true;
  339. }
  340. catch (int ierror)
  341. {
  342. iRet = ierror;
  343. }
  344. LOG4VTM(WARN, "<Contactless::AbortRead> - "
  345. << "Exit-");
  346. return (ErrorCodeEnum)iRet;
  347. }
  348. //
  349. // Active contactless card(Type A,B,Mifare)
  350. // The first,second,third activation order decided by fstType,scdType,thdType respectively
  351. // fstType,scdType,thdType can be one of 'A','B','M','0'(30H,no type)
  352. // outType indicates the type of activation result
  353. //
  354. ErrorCodeEnum ContactlessCardImpl::ActiveContactlessICCard(char fstType, char scdType, char thdType, char &outType)
  355. {
  356. LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
  357. << "Enter-");
  358. int iRet = Error_Succeed;
  359. try
  360. {
  361. if (!bDrvFlag)
  362. {
  363. m_ErrCode_Msg_Input_Struct(Error_NotInit, "ActiveContactlessICCard", "drv load error", __LINE__);
  364. LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
  365. << "依赖库加载失败");
  366. iRet = Error_NotInit;
  367. throw iRet;
  368. }
  369. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  370. m_ErrCode_Msg_Input_Struct(Error_Succeed,"ActiveContactlessICCard","",__LINE__);
  371. if (!bDevOpen)
  372. {
  373. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  374. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  375. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"ActiveContactlessICCard","Device Not Connected",__LINE__);
  376. LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
  377. << "设备未连接");
  378. iRet = Error_DevConnFailed;
  379. throw iRet;
  380. }
  381. if (fstType == 'A')
  382. {
  383. drv_CardReader->SetCardType(0x08);
  384. char sAtr[1024] = "\0";
  385. int iAtr = 0;
  386. iRet = drv_CardReader->ICCPower(3, sAtr, &iAtr);
  387. if (iRet != Error_Succeed)
  388. {
  389. if (iRet == -2)
  390. {
  391. //sprintf(m_ErrInfo.szErrMsg, "\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"");
  392. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  393. m_ErrCode_Msg_Input_Struct(Error_DevMedia,"ActiveContactlessICCard","\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"",__LINE__);
  394. LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
  395. << "执行ICCPower失败返回" << iRet);
  396. iRet = Error_DevMedia;
  397. throw iRet;
  398. }
  399. else
  400. {
  401. //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
  402. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  403. m_ErrCode_Msg_Input_Struct(Error_Hardware,"ActiveContactlessICCard","Hardware Error",__LINE__);
  404. LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
  405. << "执行ICCPower失败返回" << iRet);
  406. iRet = Error_Hardware;
  407. throw iRet;
  408. }
  409. }
  410. outType = 'A';
  411. }
  412. }
  413. catch (int ierror)
  414. {
  415. iRet = ierror;
  416. }
  417. LOG4VTM(WARN, "<Contactless::ActiveContactlessICCard> - "
  418. << "Exit-");
  419. return (ErrorCodeEnum)iRet;
  420. }
  421. //
  422. // Deactivate contactless IC card
  423. //
  424. ErrorCodeEnum ContactlessCardImpl::DeactContactlessICCard()
  425. {
  426. LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
  427. << "Enter-");
  428. int iRet = Error_Succeed;
  429. try
  430. {
  431. if (!bDrvFlag)
  432. {
  433. m_ErrCode_Msg_Input_Struct(Error_NotInit, "DeactContactlessICCard", "drv load error", __LINE__);
  434. LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
  435. << "依赖库加载失败");
  436. iRet = Error_NotInit;
  437. throw iRet;
  438. }
  439. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  440. m_ErrCode_Msg_Input_Struct(Error_Succeed,"DeactContactlessICCard","",__LINE__);
  441. if (!bDevOpen)
  442. {
  443. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  444. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  445. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"DeactContactlessICCard","Device Not Connected",__LINE__);
  446. LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
  447. << "设备未连接");
  448. iRet = Error_DevConnFailed;
  449. throw iRet;
  450. }
  451. drv_CardReader->SetCardType(0x08);
  452. iRet = drv_CardReader->ICCPower(0x0C, NULL, NULL);
  453. if (iRet != Error_Succeed)
  454. {
  455. //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
  456. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  457. m_ErrCode_Msg_Input_Struct(Error_Hardware,"DeactContactlessICCard","Hardware Error",__LINE__);
  458. LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
  459. << "执行ICCPower失败返回" << iRet);
  460. iRet = Error_Hardware;
  461. throw iRet;
  462. }
  463. }
  464. catch (int ierror)
  465. {
  466. iRet = ierror;
  467. }
  468. LOG4VTM(WARN, "<Contactless::DeactContactlessICCard> - "
  469. << "Exit-");
  470. return (ErrorCodeEnum)iRet;
  471. }
  472. //
  473. // Warm reset card(IC)
  474. //
  475. ErrorCodeEnum ContactlessCardImpl::WarmReset()
  476. {
  477. LOG4VTM(WARN, "<Contactless::WarmReset> - "
  478. << "Enter-");
  479. int iRet = Error_Succeed;
  480. try
  481. {
  482. if (!bDrvFlag)
  483. {
  484. m_ErrCode_Msg_Input_Struct(Error_NotInit, "WarmReset", "drv load error", __LINE__);
  485. LOG4VTM(WARN, "<Contactless::WarmReset> - "
  486. << "依赖库加载失败");
  487. iRet = Error_NotInit;
  488. throw iRet;
  489. }
  490. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  491. m_ErrCode_Msg_Input_Struct(Error_Succeed,"WarmReset","Error_Succeed",__LINE__);
  492. if (!bDevOpen)
  493. {
  494. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  495. // m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  496. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"WarmReset","Device Not Connected",__LINE__);
  497. LOG4VTM(WARN, "<Contactless::WarmReset> - "
  498. << "设备未连接");
  499. iRet = Error_DevConnFailed;
  500. throw iRet;
  501. }
  502. drv_CardReader->SetCardType(0x08);
  503. iRet = drv_CardReader->ICCPower(0x0C, NULL, NULL);
  504. char sAtr[1024] = "\0";
  505. int iAtr = 0;
  506. iRet = drv_CardReader->ICCPower(3, sAtr, &iAtr);
  507. if (iRet != Error_Succeed)
  508. {
  509. if (iRet == -2)
  510. {
  511. //sprintf(m_ErrInfo.szErrMsg, "\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"");
  512. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  513. m_ErrCode_Msg_Input_Struct(Error_DevMedia,"WarmReset","\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"",__LINE__);
  514. LOG4VTM(WARN, "<Contactless::WarmReset> - "
  515. << "执行ICCPower失败返回" << iRet);
  516. iRet = Error_DevMedia;
  517. throw iRet;
  518. }
  519. else
  520. {
  521. //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
  522. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  523. m_ErrCode_Msg_Input_Struct(Error_Hardware,"WarmReset","Hardware Error",__LINE__);
  524. LOG4VTM(WARN, "<Contactless::WarmReset> - "
  525. << "执行ICCPower失败返回" << iRet);
  526. iRet = Error_Hardware;
  527. throw iRet;
  528. }
  529. }
  530. }
  531. catch (int ierror)
  532. {
  533. iRet = ierror;
  534. }
  535. LOG4VTM(WARN, "<Contactless::WarmReset> - "
  536. << "Exit-");
  537. return (ErrorCodeEnum)iRet;
  538. }
  539. //
  540. // Mifare operation
  541. // Arguments:
  542. // - eFunType:function type as load key,authentication and so on
  543. // - 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
  544. // - sendBuf:[parameter(hex)][data(hex)]
  545. // - recvBuf:[status(1byte)][return data(hex)]
  546. // -- [eFunType],[parameter,data],[status(1byte),return data]
  547. // -- [CI_MIFARE_LOAD_KEY],[key select(1byte),sector num(1byte),uncoded keys(6bytes)],[status(1byte)]
  548. // -- [CI_MIFARE_AUTH],[key select(1byte),sector num(1byte)],[status(1byte)]
  549. // -- [CI_MIFARE_READ],[block num(1byte)],[status(1byte),data(16bytes)]
  550. // -- [CI_MIFARE_WRITE],[block num(1byte),data(16bytes)],[status(1byte)]
  551. // -- [CI_MIFARE_INC],[source block num(1byte),destination block num(1byte),inc value(4bytes)],[status(1byte)]
  552. // -- [CI_MIFARE_DEC],[source block num(1byte),destination block num(1byte),dec value(4bytes)],[status(1byte)]
  553. // -- key select(1byte):AKey(00h),BKey(01h)
  554. // -- status(1byte):OK(00h),other error code(!00h)
  555. ErrorCodeEnum ContactlessCardImpl::MifareCommand(MifareFuctionEnum eFunType, CmdInfo sendBuf, CmdInfo &recvBuf)
  556. {
  557. LOG4VTM(WARN, "<Contactless::MifareCommand> - "
  558. << "Enter-");
  559. int iRet = Error_Succeed;
  560. LOG4VTM(WARN, "<Contactless::MifareCommand> - "
  561. << "Exit-");
  562. return (ErrorCodeEnum)iRet;
  563. }
  564. //
  565. // RF Type A,B command.
  566. // APDU:Application Protocol Data Unit
  567. // Arguments:
  568. // - CmdSend.lpCmd:Command-APDU
  569. // - CmdRecv.lpData:Response-APDU
  570. //
  571. ErrorCodeEnum ContactlessCardImpl::RFTypeABCommand(CmdInfo sendBuf, CmdInfo &recvBuf)
  572. {
  573. LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
  574. << "Enter-");
  575. int iRet = Error_Succeed;
  576. try
  577. {
  578. if (!bDrvFlag)
  579. {
  580. m_ErrCode_Msg_Input_Struct(Error_NotInit, "RFTypeABCommand", "drv load error", __LINE__);
  581. LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
  582. << "依赖库加载失败");
  583. iRet = Error_NotInit;
  584. throw iRet;
  585. }
  586. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  587. m_ErrCode_Msg_Input_Struct(Error_Succeed,"RFTypeABCommand","",__LINE__);
  588. if (!bDevOpen)
  589. {
  590. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  591. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  592. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"RFTypeABCommand","Device Not Connected",__LINE__);
  593. LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
  594. << "设备未连接");
  595. iRet = Error_DevConnFailed;
  596. throw iRet;
  597. }
  598. drv_CardReader->SetCardType(0x08);
  599. unsigned char szSendData[1024] = "";
  600. memset(szSendData, 0, sizeof(szSendData));
  601. int iSendLength = 0;
  602. memcpy(szSendData, sendBuf.data, sendBuf.dwSize);
  603. iSendLength = sendBuf.dwSize;
  604. unsigned char szRecvData[1024] = "";
  605. int iRecvLength = 0;
  606. TRANSMIT:
  607. memset(szRecvData, 0, sizeof(szRecvData));
  608. iRet = drv_CardReader->ICCTransmit(0, (char *)szSendData, iSendLength, (char *)szRecvData, &iRecvLength);
  609. if (iRet != Error_Succeed)
  610. {
  611. if (iRet == -2)
  612. {
  613. //sprintf(m_ErrInfo.szErrMsg, "\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"");
  614. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  615. m_ErrCode_Msg_Input_Struct(Error_DevMedia,"RFTypeABCommand","\"No Card\" Or \"Card don't on IC position\" Or \"Card have be moved\"",__LINE__);
  616. LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
  617. << "执行ICCTransmit失败返回" << iRet);
  618. iRet = Error_DevMedia;
  619. throw iRet;
  620. }
  621. else
  622. {
  623. //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
  624. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  625. m_ErrCode_Msg_Input_Struct(Error_Hardware,"RFTypeABCommand","Hardware Error",__LINE__);
  626. LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
  627. << "执行ICCTransmit失败返回" << iRet);
  628. iRet = Error_Hardware;
  629. throw iRet;
  630. }
  631. }
  632. if (szRecvData[iRecvLength - 2] == 0x61)
  633. {
  634. memset(szSendData, 0, sizeof(szSendData));
  635. szSendData[0] = 0x00;
  636. szSendData[1] = 0xC0;
  637. szSendData[2] = 0x00;
  638. szSendData[3] = 0x00;
  639. szSendData[4] = szRecvData[iRecvLength - 1];
  640. iSendLength = 5;
  641. goto TRANSMIT;
  642. }
  643. else if (szRecvData[iRecvLength - 2] == 0x6C)
  644. {
  645. szSendData[iSendLength - 1] = szRecvData[iRecvLength - 1];
  646. goto TRANSMIT;
  647. }
  648. memcpy(recvBuf.data, szRecvData, iRecvLength);
  649. recvBuf.dwSize = iRecvLength;
  650. }
  651. catch (int ierror)
  652. {
  653. iRet = ierror;
  654. }
  655. LOG4VTM(WARN, "<Contactless::RFTypeABCommand> - "
  656. << "Exit-");
  657. return (ErrorCodeEnum)iRet;
  658. }
  659. //halt card
  660. //card have been halted must move from induction zone then can be found again
  661. ErrorCodeEnum ContactlessCardImpl::HaltCard()
  662. {
  663. LOG4VTM(WARN, "<Contactless::HaltCard> - "
  664. << "Enter-");
  665. int iRet = Error_Succeed;
  666. try
  667. {
  668. if (!bDrvFlag)
  669. {
  670. m_ErrCode_Msg_Input_Struct(Error_NotInit, "HaltCard", "drv load error", __LINE__);
  671. LOG4VTM(WARN, "<Contactless::HaltCard> - "
  672. << "依赖库加载失败");
  673. iRet = Error_NotInit;
  674. throw iRet;
  675. }
  676. //memset(m_ErrInfo.szErrMsg, 0, sizeof(m_ErrInfo.szErrMsg));
  677. m_ErrCode_Msg_Input_Struct(Error_Succeed,"HaltCard","",__LINE__);
  678. if (!bDevOpen)
  679. {
  680. //sprintf(m_ErrInfo.szErrMsg, "Device Not Connected.");
  681. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  682. m_ErrCode_Msg_Input_Struct(Error_DevConnFailed,"HaltCard","Device Not Connected",__LINE__);
  683. LOG4VTM(WARN, "<Contactless::HaltCard> - "
  684. << "设备未连接");
  685. iRet = Error_DevConnFailed;
  686. throw iRet;
  687. }
  688. drv_CardReader->SetCardType(0x08);
  689. iRet = drv_CardReader->ICCPower(0x0C, NULL, NULL);
  690. if (iRet != Error_Succeed)
  691. {
  692. //sprintf(m_ErrInfo.szErrMsg, "Hardware Error.");
  693. //m_ErrInfo.dwErrMsgLen = strlen(m_ErrInfo.szErrMsg);
  694. m_ErrCode_Msg_Input_Struct(Error_Hardware,"HaltCard","Hardware Error",__LINE__);
  695. LOG4VTM(WARN, "<Contactless::HaltCard> - "
  696. << "执行ICCPower失败返回" << iRet);
  697. iRet = Error_Hardware;
  698. throw iRet;
  699. }
  700. }
  701. catch (int ierror)
  702. {
  703. iRet = ierror;
  704. }
  705. LOG4VTM(WARN, "<Contactless::HaltCard> - "
  706. << "Exit-");
  707. return (ErrorCodeEnum)iRet;
  708. }