idcer_impl.cpp 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. #include <memory.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdio.h>
  5. #include <dlfcn.h>
  6. #include <iconv.h>
  7. #include "idcer_impl.h"
  8. #include "GRGIDRCHKDev.h"
  9. #include "log4vendor.h"
  10. DEVICEBASE_API ErrorCodeEnum CreateDevComponent(DeviceBaseClass *&baseObj) {
  11. baseObj = new IDCerClassImpl();
  12. if (baseObj == NULL)
  13. {
  14. return Error_Resource;
  15. }
  16. cmb::log_init_config config;
  17. config.dev_name = "IDCer";
  18. config.log_level = CMB_LOG_LEVEL_TRACE;
  19. #if defined(_MSC_VER)
  20. config.log_dir = ("C:\\rvc\\dbg\\");
  21. #else
  22. config.log_dir = ("/opt/rvc/dbg/");
  23. #endif //_MSC_VER
  24. std::string str;
  25. cmb::log4vendor::init(config, str);
  26. printf("init after: %s\n", str.c_str());
  27. return Error_Succeed;
  28. }
  29. DEVICEBASE_API ErrorCodeEnum ReleaseDevComponent(DeviceBaseClass *&pBaseObj)
  30. {
  31. if(pBaseObj == NULL)
  32. {
  33. return Error_Param;
  34. }
  35. if(IDCerClassImpl* pTmp = dynamic_cast<IDCerClassImpl*>(pBaseObj))
  36. {
  37. delete pTmp;
  38. pTmp = NULL;
  39. return Error_Succeed;
  40. }
  41. return Error_Param;
  42. }
  43. IDCerClassImpl::IDCerClassImpl()
  44. {
  45. m_DeviceID = -1;
  46. ZeroDevErrorInfo();
  47. //m_sSoPath = GeSoFilePath((void*)&EnumScannerDevice);
  48. m_sSoPath = GeSoFilePath((void*)&CreateDevComponent);
  49. m_sHeadImageName = "./zp.bmp";
  50. m_sFrontPath = "./idfront.bmp";
  51. m_sBackPath = "./idback.bmp";
  52. if(m_sSoPath != ""){
  53. m_sFrontPath = m_sSoPath + "/idfront.bmp";
  54. m_sBackPath = m_sSoPath + "/idback.bmp";
  55. m_sHeadImageName = m_sSoPath + "/zp.bmp";
  56. }
  57. }
  58. IDCerClassImpl::~IDCerClassImpl()
  59. {
  60. remove(const_cast<char*>(m_sHeadImageName.c_str()));
  61. remove(const_cast<char*>(m_sFrontPath.c_str()));
  62. remove(const_cast<char*>(m_sBackPath.c_str()));
  63. DevClose();
  64. }
  65. void IDCerClassImpl::ZeroDevErrorInfo()
  66. {
  67. memset(&m_DevErrorInfo, 0, sizeof(m_DevErrorInfo));
  68. }
  69. void IDCerClassImpl::FormatDevErrorInfo(const char* funcname, int line)
  70. {
  71. ZeroDevErrorInfo();
  72. int errCode = GetLastErrorCode();
  73. if (errCode != IDDIGITALCOPIER_NO_ERROR)
  74. {
  75. char errStr[1024]={ 0 };
  76. GetLastErrorStr(errStr);
  77. snprintf(m_DevErrorInfo.szErrMsg, sizeof(m_DevErrorInfo.szErrMsg), "ErrCode:0x%x,Description:Func:%s,Line:%d,Msg:%s", errCode, funcname, line, errStr);
  78. m_DevErrorInfo.dwErrMsgLen = strlen(m_DevErrorInfo.szErrMsg);
  79. LOG4VTM(ERROR,m_DevErrorInfo.szErrMsg);
  80. }
  81. }
  82. ErrorCodeEnum IDCerClassImpl::GetDevCategory(DevCategoryInfo &devCategory)
  83. {
  84. LOG4VTM_FUNCTION();
  85. LOG4VTM(INFO,__FUNCTION__);
  86. char* szType = "PVER=GRG#MID=IDR-001";
  87. char* szVendor = "grg";
  88. char* szModel = "STYLE=IG#FUNCTON=ITF";
  89. memset(&devCategory,0,sizeof(devCategory));
  90. strcpy(devCategory.szType, szType);
  91. strcpy(devCategory.szVendor, szVendor);
  92. strcpy(devCategory.szModel, szModel);
  93. /*
  94. char versionInfo[128] = { 0 };
  95. if (IDDIGITALCOPIER_NO_ERROR != GetSWVersion(versionInfo)) {
  96. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  97. return Error_Unexpect;
  98. }
  99. //V1.1.5.1去掉V
  100. char *tokenPtr=strtok(versionInfo+1,".");
  101. int ver[4] = {0};
  102. int index = 0;
  103. while(tokenPtr!=NULL){
  104. ver[index++] = atoi(tokenPtr);
  105. tokenPtr=strtok(NULL,".");
  106. }
  107. devCategory.version.wMajor = ver[0];
  108. devCategory.version.wMinor = ver[1];
  109. devCategory.version.wRevision = ver[2];
  110. devCategory.version.wBuild = ver[3];
  111. */
  112. devCategory.version.wMajor = 1;
  113. devCategory.version.wMinor = 1;
  114. devCategory.version.wRevision = 65535;
  115. devCategory.version.wBuild = 1;
  116. DEVSTATUSEx dev;
  117. int ret = GetDevStatusEx(m_DeviceID,&dev);
  118. if (ret == IDDIGITALCOPIER_NO_ERROR)
  119. {
  120. devCategory.eState = DEVICE_STATUS_CONNECTING;
  121. }
  122. else if (ret == IDDIGITALCOPIER_HAVE_NOT_INIT
  123. || ret == IDDIGITALCOPIER_PORT_ERROR)
  124. {
  125. devCategory.eState = DEVICE_STATUS_NOT_READY;
  126. }
  127. else if (ret == IDDIGITALCOPIER_FIRMWARE_ERROR
  128. || ret == IDDIGITALCOPIER_VOLTAGE_LOW
  129. || ret == IDDIGITALCOPIER_POWER_OFF
  130. || dev.iStatusLowVoltage == 1
  131. || dev.iStatusPowerOff == 1)
  132. {
  133. devCategory.eState = DEVICE_STATUS_FAULT;
  134. }
  135. /*
  136. DEVSTATUSEx devStatus;
  137. if (IDDIGITALCOPIER_NO_ERROR != GetDevStatusEx(m_DeviceID, &devStatus)) {
  138. //FormatDevErrorInfo(__FUNCTION__, __LINE__);
  139. devCategory.eState = DEVICE_STATUS_NOT_READY;
  140. }else{
  141. devCategory.eState = DEVICE_STATUS_NORMAL;
  142. }
  143. */
  144. LOG4VTM(INFO,__FUNCTION__<<" OK");
  145. return Error_Succeed;
  146. }
  147. // Reset device.
  148. // Do the cleaning work and initialize device again in order to return to
  149. // the normal condition.
  150. ErrorCodeEnum IDCerClassImpl::Reset()
  151. {
  152. LOG4VTM_FUNCTION();
  153. LOG4VTM(INFO,__FUNCTION__);
  154. if (IDDIGITALCOPIER_NO_ERROR != ResetDevice(m_DeviceID)) {
  155. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  156. return Error_Unexpect;
  157. }
  158. LOG4VTM(INFO,__FUNCTION__<<" OK");
  159. return Error_Succeed;
  160. }
  161. //
  162. // Close device and do the cleaning work.
  163. // ex. close connection,close port,release memery and so on
  164. ErrorCodeEnum IDCerClassImpl::DevClose()
  165. {
  166. LOG4VTM_FUNCTION();
  167. LOG4VTM(INFO,__FUNCTION__);
  168. DEVSTATUSEx dev;
  169. if (IDDIGITALCOPIER_NO_ERROR == GetDevStatusEx(m_DeviceID, &dev))
  170. {
  171. if (dev.iStatusCardJam == 1
  172. || dev.iStatusMiddleSensorHaveCard == 1
  173. || dev.iStatusScanSensorHaveCard == 1)
  174. {
  175. BackIdCard(m_DeviceID);
  176. }
  177. }
  178. if (IDDIGITALCOPIER_NO_ERROR != CloseConnection(m_DeviceID)) {
  179. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  180. return Error_Unexpect;
  181. }
  182. LOG4VTM(INFO,__FUNCTION__<<" OK");
  183. return Error_Succeed;
  184. }
  185. // Get last error the device issued.
  186. // Error message must include explanatory memorandum ,the original error
  187. // code and anything in favour of location problem.
  188. ErrorCodeEnum IDCerClassImpl::GetLastErr(DevErrorInfo &devErrInfo)
  189. {
  190. memset(&devErrInfo,0,sizeof(devErrInfo));
  191. memcpy(&devErrInfo, &m_DevErrorInfo, sizeof(devErrInfo));
  192. return Error_Succeed;
  193. }
  194. //IDCerClass
  195. //
  196. // Open device.
  197. // if usb device,set dwPort=0
  198. //
  199. ErrorCodeEnum IDCerClassImpl::DevOpen(DWORD dwPort)
  200. {
  201. LOG4VTM_FUNCTION();
  202. LOG4VTM(INFO,__FUNCTION__);
  203. unsigned DeviceCount = 8;
  204. ScannerInfoRec ScannerInfo[8]={0};
  205. int retv = EnumScannerDevice(ScannerInfo,&DeviceCount);
  206. m_DeviceID = ScannerInfo[0].DeviceID;
  207. //printf("EnumScannerDevice :retv=%d,count=%d,DeviceID=%d\n",retv,DeviceCount,m_DeviceID);
  208. //default image format is bmp
  209. if (IDDIGITALCOPIER_NO_ERROR != OpenConnection(m_DeviceID)) {
  210. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  211. return Error_DevConnFailed;
  212. }
  213. if (IDDIGITALCOPIER_NO_ERROR != SetInitFeedMode(m_DeviceID,0)) {
  214. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  215. return Error_Unexpect;
  216. }
  217. if (IDDIGITALCOPIER_NO_ERROR != SetButtonEnable(m_DeviceID,1)) {
  218. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  219. return Error_Unexpect;
  220. }
  221. if (IDDIGITALCOPIER_NO_ERROR != SetAutoFeedEnable(m_DeviceID,0)) {
  222. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  223. return Error_Unexpect;
  224. }
  225. LOG4VTM(INFO,__FUNCTION__<<" OK");
  226. return Error_Succeed;
  227. }
  228. //
  229. // Optional.
  230. // Open or close RF.
  231. // Arguments:
  232. // - bControl:true:open RF,false close RF
  233. // - 对于吸入式,为true接收身份证插入,为false时弹出身份证并关闭接收身份证插入
  234. //
  235. ErrorCodeEnum IDCerClassImpl::IDCerRFControl(bool bControl)
  236. {
  237. LOG4VTM_FUNCTION();
  238. LOG4VTM(INFO,__FUNCTION__);
  239. DEVSTATUSEx dev;
  240. if (IDDIGITALCOPIER_NO_ERROR != GetDevStatusEx(m_DeviceID, &dev))
  241. {
  242. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  243. return Error_Hardware;
  244. }
  245. if (bControl)
  246. {
  247. if (dev.iStatusMiddleSensorHaveCard == 1
  248. || dev.iStatusScanSensorHaveCard == 1)
  249. {
  250. if (IDDIGITALCOPIER_NO_ERROR != BackIdCardToRerec(m_DeviceID))
  251. {
  252. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  253. }
  254. }
  255. if (IDDIGITALCOPIER_NO_ERROR != SetAutoFeedEnable(m_DeviceID,1))
  256. {
  257. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  258. return Error_Unexpect;
  259. }
  260. }
  261. else
  262. {
  263. if (dev.iStatusMiddleSensorHaveCard == 1
  264. || dev.iStatusScanSensorHaveCard == 1)
  265. {
  266. if (IDDIGITALCOPIER_NO_ERROR != BackAndHoldIdCard(m_DeviceID))
  267. {
  268. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  269. return Error_DevMedia;
  270. }
  271. }
  272. int ret = SetAutoFeedEnable(m_DeviceID,0);
  273. }
  274. LOG4VTM(INFO,__FUNCTION__<<" OK");
  275. return Error_Succeed;
  276. /*
  277. int ret = 0;
  278. int checktime = 30 * 1000;//先设定30秒
  279. if (bControl) {
  280. ret = CheckHaveIdCard(m_DeviceID, checktime);
  281. }
  282. else {
  283. ret = BackAndHoldIdCard(m_DeviceID);
  284. }
  285. if (IDDIGITALCOPIER_NO_ERROR != ret) {
  286. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  287. return Error_Unexpect;
  288. }
  289. return Error_Succeed;
  290. */
  291. }
  292. //
  293. // Optional.
  294. // Certificate authentication.
  295. //
  296. ErrorCodeEnum IDCerClassImpl::IDCerAuthenticate()
  297. {
  298. LOG4VTM_FUNCTION();
  299. LOG4VTM(INFO,__FUNCTION__);
  300. DEVSTATUS dev;
  301. if (IDDIGITALCOPIER_NO_ERROR != GetDevStatus(m_DeviceID, &dev))
  302. {
  303. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  304. return Error_DevCommFailed;
  305. }
  306. // 先判断在内部
  307. if (dev.iStatusCardJam == 1
  308. || dev.iStatusMiddleSensorHaveCard == 1
  309. || dev.iStatusScanSensorHaveCard == 1
  310. )
  311. {
  312. //in
  313. LOG4VTM(INFO,__FUNCTION__<<" in");
  314. }
  315. else if (dev.iStatusInputSensorHaveCard == 1)
  316. {
  317. //out
  318. LOG4VTM(INFO,__FUNCTION__<<" out");
  319. }
  320. else
  321. {
  322. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  323. return Error_Unexpect;
  324. }
  325. /*
  326. int checktime = 30 * 1000;
  327. if (IDDIGITALCOPIER_NO_CARD == CheckHaveIdCard(m_DeviceID, checktime)) {
  328. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  329. return Error_Unexpect;
  330. }
  331. */
  332. //如果没有识别到卡类型则表示无效卡
  333. int iCardType;
  334. if (IDDIGITALCOPIER_NO_ERROR != GetIDCardType(m_DeviceID, &iCardType)) {
  335. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  336. return Error_DevMedia;
  337. }
  338. LOG4VTM(INFO,__FUNCTION__<<" OK");
  339. return Error_Succeed;
  340. }
  341. // 即将废弃,请使用IDCerGetDataEx
  342. // Get Identity Card info.
  343. //
  344. //是否包含字符串\0结束符
  345. #define EOF_LEN 1
  346. #define UTF8_BUFF_SIZE 1024
  347. ErrorCodeEnum IDCerClassImpl::IDCerGetData(IDCerInfo &idCerInfo)
  348. {
  349. LOG4VTM_FUNCTION();
  350. LOG4VTM(INFO,__FUNCTION__);
  351. IDInfo idInfo = {0};
  352. memset(&idCerInfo, 0, sizeof(idCerInfo));
  353. if (IDDIGITALCOPIER_NO_ERROR != GetID2Info(m_DeviceID, &idInfo, const_cast<char*>(m_sHeadImageName.c_str()))) {
  354. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  355. return Error_Unexpect;
  356. }
  357. //姓名
  358. char utf8buf[UTF8_BUFF_SIZE] = {0};
  359. GbkToUtf8(idInfo.name,strlen(idInfo.name),utf8buf,UTF8_BUFF_SIZE);
  360. strcpy(idCerInfo.name.data, utf8buf);
  361. idCerInfo.name.dwSize = strlen(utf8buf);
  362. //性别
  363. memset(utf8buf,0,UTF8_BUFF_SIZE);
  364. GbkToUtf8(idInfo.sex,strlen(idInfo.sex),utf8buf,UTF8_BUFF_SIZE);
  365. strcpy(idCerInfo.sex.data, utf8buf);
  366. idCerInfo.sex.dwSize = strlen(utf8buf);
  367. //民族
  368. memset(utf8buf,0,UTF8_BUFF_SIZE);
  369. GbkToUtf8(idInfo.nation,strlen(idInfo.nation),utf8buf,UTF8_BUFF_SIZE);
  370. strcpy(idCerInfo.nation.data, utf8buf);
  371. idCerInfo.nation.dwSize = strlen(utf8buf);
  372. //生日
  373. std::string Newbirthday = ForDataFormat(std::string(idInfo.birthday), "for");
  374. memset(utf8buf,0,UTF8_BUFF_SIZE);
  375. GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
  376. strcpy(idCerInfo.birthday.data, utf8buf);
  377. idCerInfo.birthday.dwSize = strlen(utf8buf);
  378. //住址
  379. memset(utf8buf,0,UTF8_BUFF_SIZE);
  380. GbkToUtf8(idInfo.address,strlen(idInfo.address),utf8buf,UTF8_BUFF_SIZE);
  381. strcpy(idCerInfo.address.data, utf8buf);
  382. idCerInfo.address.dwSize = strlen(utf8buf);
  383. //证件号
  384. int len = sizeof(idCerInfo.idno.data) > strlen(idInfo.number) ? strlen(idInfo.number) : sizeof(idCerInfo.idno.data);
  385. strncpy(idCerInfo.idno.data, idInfo.number, len);
  386. idCerInfo.idno.dwSize = len;
  387. //签发机关
  388. memset(utf8buf,0,UTF8_BUFF_SIZE);
  389. GbkToUtf8(idInfo.department,strlen(idInfo.department),utf8buf,UTF8_BUFF_SIZE);
  390. strcpy(idCerInfo.department.data, utf8buf);
  391. idCerInfo.department.dwSize = strlen(utf8buf);
  392. //处理有效期
  393. std::string beginTime = "", endTime = "";
  394. std::string data = std::string(idInfo.timeLimit);
  395. if (data.length() > 0)
  396. {
  397. int location = data.find_first_of("-");
  398. if (location > 0)
  399. {
  400. beginTime = data.substr(0, location);
  401. beginTime = ForDataFormat(beginTime, ".");
  402. endTime = data.substr(location + 1, data.length());
  403. endTime = ForDataFormat(endTime, ".");
  404. }
  405. }
  406. //有效日期签发日
  407. memset(utf8buf,0,UTF8_BUFF_SIZE);
  408. GbkToUtf8(const_cast<char*>(beginTime.c_str()),strlen(beginTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
  409. strcpy(idCerInfo.startDate.data, utf8buf);
  410. idCerInfo.startDate.dwSize = strlen(utf8buf);
  411. //有效日期终止日
  412. memset(utf8buf,0,UTF8_BUFF_SIZE);
  413. GbkToUtf8(const_cast<char*>(endTime.c_str()),strlen(endTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
  414. strcpy(idCerInfo.endDate.data, utf8buf);
  415. idCerInfo.endDate.dwSize = strlen(utf8buf);
  416. //头像信息
  417. strcpy(idCerInfo.photoPath.data, idInfo.Image);
  418. idCerInfo.photoPath.dwSize = strlen(idInfo.Image);
  419. LOG4VTM(INFO,__FUNCTION__<<" OK");
  420. return Error_Succeed;
  421. }
  422. // 获取证件信息,包括二代身份证、外国人永久居留证
  423. // Get Identity Card info.
  424. //
  425. ErrorCodeEnum IDCerClassImpl::IDCerGetDataEx(IDCerInfoEx &idCerInfoEx)
  426. {
  427. LOG4VTM_FUNCTION();
  428. LOG4VTM(INFO,__FUNCTION__);
  429. int iCardType;
  430. memset(&idCerInfoEx, 0, sizeof(idCerInfoEx));
  431. if (IDDIGITALCOPIER_NO_ERROR != GetIDCardType(m_DeviceID, &iCardType)) {
  432. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  433. return Error_Unexpect;
  434. }
  435. switch (iCardType)
  436. {
  437. case 0://普通身份证
  438. {
  439. IDInfo idInfo = {0};
  440. if (IDDIGITALCOPIER_NO_ERROR != GetID2Info(m_DeviceID, &idInfo, const_cast<char*>(m_sHeadImageName.c_str()))) {
  441. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  442. return Error_Unexpect;
  443. }
  444. //姓名
  445. char utf8buf[UTF8_BUFF_SIZE] = {0};
  446. GbkToUtf8(idInfo.name,strlen(idInfo.name),utf8buf,UTF8_BUFF_SIZE);
  447. strcpy(idCerInfoEx.name.data, utf8buf);
  448. idCerInfoEx.name.dwSize = strlen(utf8buf);
  449. //性别
  450. memset(utf8buf,0,UTF8_BUFF_SIZE);
  451. GbkToUtf8(idInfo.sex,strlen(idInfo.sex),utf8buf,UTF8_BUFF_SIZE);
  452. strcpy(idCerInfoEx.sex.data, utf8buf);
  453. idCerInfoEx.sex.dwSize = strlen(utf8buf);
  454. //民族
  455. memset(utf8buf,0,UTF8_BUFF_SIZE);
  456. GbkToUtf8(idInfo.nation,strlen(idInfo.nation),utf8buf,UTF8_BUFF_SIZE);
  457. strcpy(idCerInfoEx.nation.data, utf8buf);
  458. idCerInfoEx.nation.dwSize = strlen(utf8buf);
  459. //生日
  460. std::string Newbirthday = ForDataFormat(std::string(idInfo.birthday), "for");
  461. memset(utf8buf,0,UTF8_BUFF_SIZE);
  462. GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
  463. strcpy(idCerInfoEx.birthday.data, utf8buf);
  464. idCerInfoEx.birthday.dwSize = strlen(utf8buf);
  465. //住址
  466. memset(utf8buf,0,UTF8_BUFF_SIZE);
  467. GbkToUtf8(idInfo.address,strlen(idInfo.address),utf8buf,UTF8_BUFF_SIZE);
  468. strcpy(idCerInfoEx.address.data, utf8buf);
  469. idCerInfoEx.address.dwSize = strlen(utf8buf);
  470. //证件号
  471. int len = sizeof(idCerInfoEx.idno.data) > strlen(idInfo.number) ? strlen(idInfo.number) : sizeof(idCerInfoEx.idno.data);
  472. strncpy(idCerInfoEx.idno.data, idInfo.number, len);
  473. idCerInfoEx.idno.dwSize = len;
  474. //签发机关
  475. memset(utf8buf,0,UTF8_BUFF_SIZE);
  476. GbkToUtf8(idInfo.department,strlen(idInfo.department),utf8buf,UTF8_BUFF_SIZE);
  477. strcpy(idCerInfoEx.department.data, utf8buf);
  478. idCerInfoEx.department.dwSize = strlen(utf8buf);
  479. //处理有效期
  480. std::string beginTime = "", endTime = "";
  481. std::string data = std::string(idInfo.timeLimit);
  482. if (data.length() > 0)
  483. {
  484. int location = data.find_first_of("-");
  485. if (location > 0)
  486. {
  487. beginTime = data.substr(0, location);
  488. beginTime = ForDataFormat(beginTime, ".");
  489. endTime = data.substr(location + 1, data.length());
  490. endTime = ForDataFormat(endTime, ".");
  491. }
  492. }
  493. //有效日期签发日
  494. memset(utf8buf,0,UTF8_BUFF_SIZE);
  495. GbkToUtf8(const_cast<char*>(beginTime.c_str()),strlen(beginTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
  496. strcpy(idCerInfoEx.startDate.data, utf8buf);
  497. idCerInfoEx.startDate.dwSize = strlen(utf8buf);
  498. //有效日期终止日
  499. memset(utf8buf,0,UTF8_BUFF_SIZE);
  500. GbkToUtf8(const_cast<char*>(endTime.c_str()),strlen(endTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
  501. strcpy(idCerInfoEx.endDate.data, utf8buf);
  502. idCerInfoEx.endDate.dwSize = strlen(utf8buf);
  503. //头像信息
  504. strcpy(idCerInfoEx.photoPath.data, idInfo.Image);
  505. idCerInfoEx.photoPath.dwSize = strlen(idInfo.Image);
  506. break;
  507. }
  508. case 1://外国人居住证
  509. {
  510. IDInfoForeign idInfoFore;
  511. if (IDDIGITALCOPIER_NO_ERROR != GetIDInfoForeign(m_DeviceID, &idInfoFore, const_cast<char*>(m_sHeadImageName.c_str()))) {
  512. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  513. return Error_Unexpect;
  514. }
  515. char utf8buf[UTF8_BUFF_SIZE] = {0};
  516. //英文姓名
  517. strcpy(idCerInfoEx.englishName.data, idInfoFore.NameENG);
  518. idCerInfoEx.englishName.dwSize = strlen(idInfoFore.NameENG);
  519. //国籍
  520. GbkToUtf8(idInfoFore.Nation,strlen(idInfoFore.Nation),utf8buf,UTF8_BUFF_SIZE);
  521. strcpy(idCerInfoEx.nationality.data, utf8buf);
  522. idCerInfoEx.nationality.dwSize = strlen(utf8buf);
  523. //证件类型
  524. strcpy(idCerInfoEx.idType.data, "I");
  525. idCerInfoEx.idType.dwSize = strlen("I");
  526. //证件版本
  527. strcpy(idCerInfoEx.idVersion.data, idInfoFore.IDVersion);
  528. idCerInfoEx.idVersion.dwSize = strlen(idInfoFore.IDVersion);
  529. //保留字段
  530. memset(utf8buf,0,UTF8_BUFF_SIZE);
  531. GbkToUtf8(idInfoFore.Reserve,strlen(idInfoFore.Reserve),utf8buf,UTF8_BUFF_SIZE);
  532. strcpy(idCerInfoEx.reserved.data, utf8buf);
  533. idCerInfoEx.reserved.dwSize = strlen(utf8buf);
  534. //中文姓名
  535. memset(utf8buf,0,UTF8_BUFF_SIZE);
  536. GbkToUtf8(idInfoFore.NameCHN,strlen(idInfoFore.NameCHN),utf8buf,UTF8_BUFF_SIZE);
  537. strcpy(idCerInfoEx.name.data, utf8buf);
  538. idCerInfoEx.name.dwSize = strlen(utf8buf);
  539. //性别
  540. memset(utf8buf,0,UTF8_BUFF_SIZE);
  541. GbkToUtf8(idInfoFore.Sex,strlen(idInfoFore.Sex),utf8buf,UTF8_BUFF_SIZE);
  542. strcpy(idCerInfoEx.sex.data, utf8buf);
  543. idCerInfoEx.sex.dwSize = strlen(utf8buf);
  544. //生日
  545. std::string Newbirthday = ForDataFormat(std::string(idInfoFore.Born), "for");
  546. memset(utf8buf,0,UTF8_BUFF_SIZE);
  547. GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
  548. strcpy(idCerInfoEx.birthday.data, utf8buf);
  549. idCerInfoEx.birthday.dwSize = strlen(utf8buf);
  550. //证件号
  551. strcpy(idCerInfoEx.idno.data, idInfoFore.IDCardNO);
  552. idCerInfoEx.idno.dwSize = strlen(idInfoFore.IDCardNO);
  553. //签发机关
  554. memset(utf8buf,0,UTF8_BUFF_SIZE);
  555. GbkToUtf8(idInfoFore.Department,strlen(idInfoFore.Department),utf8buf,UTF8_BUFF_SIZE);
  556. strcpy(idCerInfoEx.department.data, utf8buf);
  557. idCerInfoEx.department.dwSize = strlen(utf8buf);
  558. //有效日期签发日
  559. std::string NewTimeLimitBegin = GetForeignTimeLimit(std::string(idInfoFore.TimeLimitBegin), ".");
  560. memset(utf8buf,0,UTF8_BUFF_SIZE);
  561. GbkToUtf8(const_cast<char*>(NewTimeLimitBegin.c_str()),strlen(NewTimeLimitBegin.c_str()),utf8buf,UTF8_BUFF_SIZE);
  562. strcpy(idCerInfoEx.startDate.data, utf8buf);
  563. idCerInfoEx.startDate.dwSize = strlen(utf8buf);
  564. //有效日期终止日
  565. std::string NewTimeLimitEnd = GetForeignTimeLimit(std::string(idInfoFore.TimeLimitEnd), ".");
  566. memset(utf8buf,0,UTF8_BUFF_SIZE);
  567. GbkToUtf8(const_cast<char*>(NewTimeLimitEnd.c_str()),strlen(NewTimeLimitEnd.c_str()),utf8buf,UTF8_BUFF_SIZE);
  568. strcpy(idCerInfoEx.endDate.data, utf8buf);
  569. idCerInfoEx.endDate.dwSize = strlen(utf8buf);
  570. //头像信息
  571. int len = sizeof(idCerInfoEx.photoPath.data) > strlen(idInfoFore.Image) ? strlen(idInfoFore.Image) : sizeof(idCerInfoEx.photoPath.data);
  572. strncpy(idCerInfoEx.photoPath.data, idInfoFore.Image, len);
  573. idCerInfoEx.photoPath.dwSize = len;
  574. break;
  575. }
  576. case 2://港澳台居住证
  577. {
  578. IDInfoGAT idInfoGAT;
  579. if (IDDIGITALCOPIER_NO_ERROR != GetIDInfoGAT(m_DeviceID, &idInfoGAT, const_cast<char*>(m_sHeadImageName.c_str()))) {
  580. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  581. return Error_Unexpect;
  582. }
  583. //姓名
  584. char utf8buf[UTF8_BUFF_SIZE] = {0};
  585. GbkToUtf8(idInfoGAT.name,strlen(idInfoGAT.name),utf8buf,UTF8_BUFF_SIZE);
  586. strcpy(idCerInfoEx.name.data, utf8buf);
  587. idCerInfoEx.name.dwSize = strlen(utf8buf);
  588. //性别
  589. memset(utf8buf,0,UTF8_BUFF_SIZE);
  590. GbkToUtf8(idInfoGAT.sex,strlen(idInfoGAT.sex),utf8buf,UTF8_BUFF_SIZE);
  591. strcpy(idCerInfoEx.sex.data, utf8buf);
  592. idCerInfoEx.sex.dwSize = strlen(utf8buf);
  593. //民族
  594. memset(utf8buf,0,UTF8_BUFF_SIZE);
  595. GbkToUtf8(idInfoGAT.nation,strlen(idInfoGAT.nation),utf8buf,UTF8_BUFF_SIZE);
  596. strcpy(idCerInfoEx.nation.data, utf8buf);
  597. idCerInfoEx.nation.dwSize = strlen(utf8buf);
  598. //生日
  599. std::string Newbirthday = ForDataFormat(std::string(idInfoGAT.birthday), "for");
  600. memset(utf8buf,0,UTF8_BUFF_SIZE);
  601. GbkToUtf8(const_cast<char*>(Newbirthday.c_str()),strlen(Newbirthday.c_str()),utf8buf,UTF8_BUFF_SIZE);
  602. strcpy(idCerInfoEx.birthday.data, utf8buf);
  603. idCerInfoEx.birthday.dwSize = strlen(utf8buf);
  604. //住址
  605. memset(utf8buf,0,UTF8_BUFF_SIZE);
  606. GbkToUtf8(idInfoGAT.address,strlen(idInfoGAT.address),utf8buf,UTF8_BUFF_SIZE);
  607. strcpy(idCerInfoEx.address.data, utf8buf);
  608. idCerInfoEx.address.dwSize = strlen(utf8buf);
  609. //证件号
  610. int len = sizeof(idCerInfoEx.idno.data) > strlen(idInfoGAT.number) ? strlen(idInfoGAT.number) : sizeof(idCerInfoEx.idno.data);
  611. strncpy(idCerInfoEx.idno.data, idInfoGAT.number, len);
  612. idCerInfoEx.idno.dwSize = len;
  613. //签发机关
  614. memset(utf8buf,0,UTF8_BUFF_SIZE);
  615. GbkToUtf8(idInfoGAT.department,strlen(idInfoGAT.department),utf8buf,UTF8_BUFF_SIZE);
  616. strcpy(idCerInfoEx.department.data, utf8buf);
  617. idCerInfoEx.department.dwSize = strlen(utf8buf);
  618. //有效日期签发日
  619. std::string beginTime = "", endTime = "";
  620. std::string data = std::string(idInfoGAT.timeLimit);
  621. if (data.length() > 0)
  622. {
  623. int location = data.find_first_of("-");
  624. if (location > 0)
  625. {
  626. beginTime = data.substr(0, location);
  627. beginTime = ForDataFormat(beginTime, ".");
  628. endTime = data.substr(location + 1, data.length());
  629. endTime = ForDataFormat(endTime, ".");
  630. }
  631. }
  632. memset(utf8buf,0,UTF8_BUFF_SIZE);
  633. GbkToUtf8(const_cast<char*>(beginTime.c_str()),strlen(beginTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
  634. strcpy(idCerInfoEx.startDate.data, utf8buf);
  635. idCerInfoEx.startDate.dwSize = strlen(utf8buf);
  636. //有效日期终止日
  637. memset(utf8buf,0,UTF8_BUFF_SIZE);
  638. GbkToUtf8(const_cast<char*>(endTime.c_str()),strlen(endTime.c_str()),utf8buf,UTF8_BUFF_SIZE);
  639. strcpy(idCerInfoEx.endDate.data, utf8buf);
  640. idCerInfoEx.endDate.dwSize = strlen(utf8buf);
  641. //头像信息
  642. strcpy(idCerInfoEx.photoPath.data, idInfoGAT.Image);
  643. idCerInfoEx.photoPath.dwSize = strlen(idInfoGAT.Image);
  644. //通行证号码
  645. strcpy(idCerInfoEx.txzCode.data, idInfoGAT.passport);
  646. idCerInfoEx.txzCode.dwSize = strlen(idInfoGAT.passport);
  647. //签发次数
  648. strcpy(idCerInfoEx.issuedSN.data, idInfoGAT.issue);
  649. idCerInfoEx.issuedSN.dwSize = strlen(idInfoGAT.issue);
  650. //证件类型
  651. strcpy(idCerInfoEx.idType.data, "J");
  652. idCerInfoEx.idType.dwSize = strlen("J");
  653. break;
  654. }
  655. default:
  656. break;
  657. }
  658. LOG4VTM(INFO,__FUNCTION__<<" OK");
  659. return Error_Succeed;
  660. }
  661. // 强制弹出身份证等证件
  662. // Force ID Card to eject。
  663. //
  664. ErrorCodeEnum IDCerClassImpl::ForceIDEject()
  665. {
  666. LOG4VTM_FUNCTION();
  667. LOG4VTM(INFO,__FUNCTION__);
  668. if (IDDIGITALCOPIER_NO_ERROR != BackIdCard(m_DeviceID)) {
  669. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  670. return Error_Unexpect;
  671. }
  672. SetAutoFeedEnable(m_DeviceID,0);
  673. LOG4VTM(INFO,__FUNCTION__<<" OK");
  674. return Error_Succeed;
  675. }
  676. // 扫描证件并保留扫描文件到默认路径(dep目录下),证件正面使用“idfront.bmp”,证件反面使用“idback.bmp”
  677. // Scan ID Card and save the image to the position(dep/),using default name "idfront.bmp" and "idback.bmp"。
  678. //
  679. ErrorCodeEnum IDCerClassImpl::ScanIDAndSaveImage()
  680. {
  681. LOG4VTM_FUNCTION();
  682. LOG4VTM(INFO,__FUNCTION__);
  683. const int max_len = 16 * 1024 * 1024;//驱动接口最大支持16M
  684. char* cFrontImgBuf = (char*)malloc(max_len);
  685. char* cRearImgBuf = (char*)malloc(max_len);
  686. int iFrontLen = max_len;
  687. int iRearLen = max_len;
  688. memset(cFrontImgBuf,0x0,max_len);
  689. memset(cRearImgBuf,0x0,max_len);
  690. //remove bmp
  691. //remove(const_cast<char*>(m_sFrontPath.c_str()));
  692. //remove(const_cast<char*>(m_sBackPath.c_str()));
  693. ErrorCodeEnum errCode = Error_Succeed;
  694. int ret = StartScanIdCard(m_DeviceID);
  695. if (ret != IDDIGITALCOPIER_NO_ERROR) {
  696. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  697. errCode = Error_Unexpect;
  698. goto End;
  699. }
  700. ret = SavePicToMemory(m_DeviceID, cFrontImgBuf, cRearImgBuf, &iFrontLen, &iRearLen);
  701. if (ret != IDDIGITALCOPIER_NO_ERROR) {
  702. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  703. errCode = Error_Unexpect;
  704. goto End;
  705. }
  706. ret = SavePicToFile(m_DeviceID, cFrontImgBuf, iFrontLen, const_cast<char*>(m_sFrontPath.c_str()), 0);
  707. if (ret != IDDIGITALCOPIER_NO_ERROR) {
  708. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  709. errCode = Error_Unexpect;
  710. goto End;
  711. }
  712. ret = SavePicToFile(m_DeviceID, cRearImgBuf, iRearLen, const_cast<char*>(m_sBackPath.c_str()), 0);
  713. if (ret != IDDIGITALCOPIER_NO_ERROR) {
  714. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  715. errCode = Error_Unexpect;
  716. goto End;
  717. }
  718. End:
  719. if(cFrontImgBuf){
  720. free(cFrontImgBuf);
  721. }
  722. if(cRearImgBuf){
  723. free(cRearImgBuf);
  724. }
  725. LOG4VTM(INFO,__FUNCTION__<<" OK");
  726. return errCode;
  727. }
  728. // 获取卡片是否插入或者取走
  729. // Query if ID Card have been inserted or fetched。
  730. // pos:
  731. // -- 0,未检测到任何证件;1,证件在读卡器内部;2,证件在进卡口
  732. //
  733. ErrorCodeEnum IDCerClassImpl::QueryCardPos(int &pos)
  734. {
  735. LOG4VTM_FUNCTION();
  736. LOG4VTM(INFO,__FUNCTION__);
  737. DEVSTATUSEx DevStatusEx;
  738. if (IDDIGITALCOPIER_NO_ERROR != GetDevStatusEx(m_DeviceID, &DevStatusEx)) {
  739. FormatDevErrorInfo(__FUNCTION__, __LINE__);
  740. return Error_Unexpect;
  741. }
  742. pos = 0;
  743. if (DevStatusEx.iStatusMiddleSensorHaveCard > 0 ||
  744. DevStatusEx.iStatusScanSensorHaveCard > 0 ||
  745. DevStatusEx.iStatusCardJam > 0)
  746. {
  747. pos = 1;
  748. }else if (DevStatusEx.iStatusInputSensorHaveCard > 0)
  749. {
  750. pos = 2;
  751. }
  752. LOG4VTM(INFO,__FUNCTION__<<" pos = "<<pos);
  753. LOG4VTM(INFO,__FUNCTION__<<" OK");
  754. return Error_Succeed;
  755. }
  756. std::string IDCerClassImpl::ForDataFormat(std::string str, std::string frm)
  757. {
  758. if (str.empty())
  759. {
  760. return"";
  761. }
  762. str.erase(0, str.find_first_not_of(" "));
  763. str.erase(str.find_last_not_of(" ") + 1);
  764. const char *pData = str.c_str();
  765. if (pData == NULL)return"";
  766. std::string newStr = "";
  767. if (str.length() > 7)
  768. {
  769. std::string year(pData, 4);
  770. pData += 4;
  771. std::string mon(pData, 2);
  772. pData += 2;
  773. std::string data(pData, 2);
  774. if (frm == ".")
  775. {
  776. newStr = year + "." + mon + "." + data;
  777. }
  778. else
  779. {
  780. newStr = year + "年" + mon + "月" + data + "日";
  781. }
  782. }
  783. else
  784. {
  785. newStr = str;
  786. }
  787. return newStr;
  788. }
  789. std::string IDCerClassImpl::GetForeignTimeLimit(std::string time_, std::string format_)
  790. {
  791. if (time_.length() < 8)return "";
  792. std::string year = time_.substr(0, 4);
  793. std::string yue = time_.substr(4, 2);
  794. std::string day = time_.substr(6, 2);
  795. std::string newData = year + format_ + yue + format_ + day;
  796. return newData;
  797. }
  798. std::string IDCerClassImpl::GeSoFilePath(void* Fun)
  799. {
  800. Dl_info dl_info;
  801. if(dladdr(Fun, &dl_info))
  802. {
  803. char *sFilePath = strdup(dl_info.dli_fname);
  804. char *pName = strrchr(sFilePath, '/');
  805. *pName = '\0';
  806. std::string sPath(sFilePath);
  807. return sPath;
  808. }
  809. return "";
  810. }
  811. int IDCerClassImpl::GbkToUtf8(char *str_str, size_t src_len, char *dst_str, size_t dst_len)
  812. {
  813. iconv_t cd;
  814. char **pin = &str_str;
  815. char **pout = &dst_str;
  816. cd = iconv_open("utf8", "gbk");
  817. if (cd == 0)
  818. return -1;
  819. memset(dst_str, 0, dst_len);
  820. if (iconv(cd, pin, &src_len, pout, &dst_len) == -1)
  821. return -1;
  822. iconv_close(cd);
  823. **pout = '\0';
  824. return 0;
  825. }