Module_RFID.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. /*
  2. * Module_RFID.c
  3. *
  4. * Created on: 2019¦~10¤ë28¤é
  5. * Author: Eason Yang
  6. * Version: D0.01
  7. */
  8. #include "Module_RFID.h"
  9. //==================================
  10. // PRINT OUT LOG FORMAT
  11. //==================================
  12. #define SystemLogMessage
  13. #define DEBUG_INFO_1(format, args...) StoreLogMessage("[%s:%d][%s][Info] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  14. #define DEBUG_WARN_1(format, args...) StoreLogMessage("[%s:%d][%s][Warn] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  15. #define DEBUG_ERROR_1(format, args...) StoreLogMessage("[%s:%d][%s][Error] "format, __FILE__, __LINE__, __FUNCTION__, ##args)
  16. //==================================
  17. // SYSTEM CONSTANT
  18. //==================================
  19. #define Debug
  20. #define ARRAY_SIZE(A) (sizeof(A) / sizeof(A[0]))
  21. #define PASS 1
  22. #define FAIL -1
  23. //==================================
  24. // MODULE CONSTANT
  25. //==================================
  26. #define NO_MODULE -1
  27. #define MODULE_EWT 0
  28. //==================================
  29. // RFID CMD CONSTANT
  30. //==================================
  31. unsigned int RFID_CMD_ISO1443A_REQUEST = 0x20;
  32. unsigned int RFID_CMD_ISO1443B_REQUEST = 0x60;
  33. unsigned int RFID_CMD_FELICA_POLLING_REQUEST = 0x2F;
  34. unsigned int RFID_CMD_HALT_14443A = 0x28;
  35. unsigned int RFID_CMD_BLOCK_READ = 0x21;
  36. unsigned int RFID_CMD_BLOCK_WRITE = 0X22;
  37. unsigned int RFID_CMD_BUZZER_SET = 0X14;
  38. //==================================
  39. // RFID MODE CONSTANT
  40. //==================================
  41. unsigned char WUPA = 0;
  42. unsigned char REQA = 1;
  43. unsigned char AFI = 0;
  44. //==================================
  45. // MIFARE CARD LENGTH
  46. //==================================
  47. unsigned int LENGTH_0 = 0;
  48. unsigned int LENGTH_4 = 4;
  49. unsigned int LENGTH_6 = 6;
  50. unsigned int LENGTH_7 = 7;
  51. unsigned int LENGTH_10 = 10;
  52. //==================================
  53. // MIFARE SECTOR SPACE
  54. //==================================
  55. #define ROW 6
  56. #define COLUMN 16
  57. unsigned char sectorKeyA[COLUMN][ROW] = { {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  58. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  59. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  60. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  61. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  62. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  63. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  64. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  65. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  66. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  67. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  68. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  69. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  70. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  71. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF},
  72. {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}
  73. };
  74. unsigned char serialNumber[32];
  75. unsigned int cardLength;
  76. //==================================
  77. // SystemLog message
  78. //==================================
  79. #ifdef SystemLogMessage
  80. int StoreLogMessage(const char *fmt, ...)
  81. {
  82. char Buf[4096 + 256];
  83. char buffer[4096];
  84. time_t CurrentTime;
  85. struct tm *tm;
  86. va_list args;
  87. va_start(args, fmt);
  88. int rc = vsnprintf(buffer, sizeof(buffer), fmt, args);
  89. va_end(args);
  90. memset(Buf, 0, sizeof(Buf));
  91. CurrentTime = time(NULL);
  92. tm = localtime(&CurrentTime);
  93. sprintf(Buf,
  94. "echo \"[%04d.%02d.%02d %02d:%02d:%02d] - %s\" >> /Storage/SystemLog/[%04d.%02d]SystemLog",
  95. tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour,
  96. tm->tm_min, tm->tm_sec, buffer, tm->tm_year + 1900, tm->tm_mon + 1);
  97. system(Buf);
  98. #ifdef Debug
  99. printf("[%04d.%02d.%02d %02d:%02d:%02d] - %s", tm->tm_year + 1900,
  100. tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec,
  101. buffer);
  102. #endif
  103. return rc;
  104. }
  105. #endif
  106. //==========================================
  107. // Module's command send/receive
  108. //==========================================
  109. int system_command(int uart, unsigned char* cmd,int length, unsigned char* rx)
  110. {
  111. int len;
  112. //sleep(2); //required to make flush work, for some reason
  113. tcflush(uart,TCIOFLUSH);
  114. if(write(uart, cmd, length) >= 0)
  115. {
  116. usleep(100000);
  117. len = read(uart, rx, 256);
  118. }
  119. else
  120. {
  121. #ifdef SystemLogMessage
  122. DEBUG_ERROR_1("system command %s response fail.\n", cmd);
  123. #endif
  124. }
  125. return len;
  126. }
  127. //==========================================
  128. // Calculation checksum function
  129. //==========================================
  130. char ClaCheckSum(unsigned char *buffer, int len)
  131. {
  132. int idx;
  133. char chksum = 0;
  134. for(idx = 0 ; idx < len-1 ; idx++)
  135. {
  136. chksum ^= *(buffer+idx);
  137. }
  138. return chksum;
  139. }
  140. bool getRequestCardSN(int Fd, int moduleType, RFID* rfid)
  141. {
  142. bool isSuccess = false;
  143. if(ISO14443A_REQUEST_SN(Fd,moduleType,serialNumber) == true)
  144. {
  145. rfid->cardType = ISO14443A;
  146. if(cardLength == LENGTH_4)
  147. {
  148. rfid->snType = RFID_SN_TYPE_4BYTE;
  149. memcpy(rfid->currentCard, &serialNumber, 32);
  150. }
  151. else if(cardLength == LENGTH_7)
  152. {
  153. rfid->snType = RFID_SN_TYPE_7BYTE;
  154. memcpy(rfid->currentCard, &serialNumber, 32);
  155. }
  156. sethaltCard(Fd,moduleType);
  157. isSuccess = true;
  158. }
  159. else if(ISO14443B_REQUEST_SN(Fd,moduleType,serialNumber) == true)
  160. {
  161. rfid->cardType = IS014443B;
  162. rfid->snType = RFID_SN_TYPE_4BYTE;
  163. memcpy(rfid->currentCard, &serialNumber, 32);
  164. sleep(2);
  165. isSuccess = true;
  166. }
  167. else if(FELICA_REQUEST_SN(Fd,moduleType,serialNumber) == true)
  168. {
  169. rfid->cardType = FELICA;
  170. rfid->snType = RFID_SN_TYPE_6BYTE;
  171. memcpy(rfid->currentCard, &serialNumber, 32);
  172. sleep(2);
  173. isSuccess = true;
  174. }
  175. else
  176. {}
  177. return isSuccess;
  178. }
  179. //==========================================
  180. // ISO14443A Request SN function
  181. //==========================================
  182. bool ISO14443A_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
  183. {
  184. bool isSuccess = false;
  185. int tx_len = 4;
  186. unsigned char txByte[tx_len];
  187. unsigned char rxByte[254];
  188. unsigned char tmp[254];
  189. switch(moduleType)
  190. {
  191. case MODULE_EWT:
  192. default:
  193. //===============================
  194. // Command
  195. //===============================
  196. txByte[0] = tx_len-1;
  197. txByte[1] = RFID_CMD_ISO1443A_REQUEST;
  198. txByte[2] = REQA;
  199. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  200. if(Fd > 0)
  201. {
  202. memset(rxByte, 0, sizeof (rxByte));
  203. if(system_command(Fd, txByte, tx_len, rxByte) > 0)
  204. {
  205. memset(tmp, 0, sizeof tmp);
  206. memcpy(tmp, rxByte, sizeof(rxByte));
  207. if(tmp[1] == RFID_CMD_ISO1443A_REQUEST)
  208. {
  209. if(tmp[0] == 0x09)
  210. {
  211. #ifdef SystemLogMessage
  212. DEBUG_INFO_1("MIFARE CLASSIC.\n");
  213. #endif
  214. cardLength = LENGTH_4;
  215. memcpy(data, rxByte+2, cardLength);
  216. isSuccess = true;
  217. }
  218. else if(tmp[0] == 0x0C)
  219. {
  220. #ifdef SystemLogMessage
  221. DEBUG_INFO_1("MIFARE PLUS.\n");
  222. #endif
  223. cardLength = LENGTH_7;
  224. memcpy(data, rxByte+2, cardLength);
  225. isSuccess = true;
  226. }
  227. else
  228. {}
  229. }
  230. else if (tmp[1] == 0xDF)
  231. {
  232. cardLength = LENGTH_0;
  233. isSuccess = false;
  234. }
  235. }
  236. else
  237. {}
  238. }
  239. else
  240. {}
  241. break;
  242. }
  243. return isSuccess;
  244. }
  245. //==========================================
  246. // ISO14443B Request SN function
  247. //==========================================
  248. bool ISO14443B_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
  249. {
  250. bool isSuccess = false;
  251. int cardLength;
  252. int tx_len = 5;
  253. unsigned char txByte[tx_len];
  254. unsigned char rxByte[254];
  255. unsigned char tmp[254];
  256. switch(moduleType)
  257. {
  258. case MODULE_EWT:
  259. default:
  260. //===============================
  261. // Command
  262. //===============================
  263. txByte[0] = tx_len-1;
  264. txByte[1] = RFID_CMD_ISO1443B_REQUEST;
  265. txByte[2] = WUPA;
  266. txByte[3] = AFI;
  267. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  268. if(Fd > 0)
  269. {
  270. memset(rxByte, 0, sizeof (rxByte));
  271. if(system_command(Fd, txByte, tx_len, rxByte) > 0)
  272. {
  273. memset(tmp, 0, sizeof tmp);
  274. memcpy(tmp, rxByte, sizeof(rxByte));
  275. if(tmp[1] == RFID_CMD_ISO1443B_REQUEST)
  276. {
  277. #ifdef SystemLogMessage
  278. DEBUG_INFO_1("ISO14443 TYPE B.\n");
  279. #endif
  280. cardLength = LENGTH_4;
  281. memcpy(data, rxByte+3, cardLength);
  282. isSuccess = true;
  283. }
  284. else if(tmp[1] == 0x9F)
  285. {
  286. cardLength = LENGTH_0;
  287. isSuccess = false;
  288. }
  289. }
  290. else
  291. {}
  292. }
  293. else
  294. {}
  295. break;
  296. }
  297. return isSuccess;
  298. }
  299. //==========================================
  300. // FELICA Request SN function
  301. //==========================================
  302. bool FELICA_REQUEST_SN(int Fd, int moduleType, unsigned char *data)
  303. {
  304. bool isSuccess = false;
  305. int cardLength;
  306. int tx_len = 9;
  307. unsigned char txByte[tx_len];
  308. unsigned char rxByte[254];
  309. unsigned char tmp[254];
  310. switch(moduleType)
  311. {
  312. case MODULE_EWT:
  313. default:
  314. //===============================
  315. // Command
  316. //===============================
  317. txByte[0] = tx_len-1;
  318. txByte[1] = RFID_CMD_FELICA_POLLING_REQUEST;
  319. txByte[2] = 0x06;
  320. txByte[3] = 0x00;
  321. txByte[4] = 0xFF;
  322. txByte[5] = 0xFF;
  323. txByte[6] = 0x01;
  324. txByte[7] = 0x00;
  325. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  326. if(Fd > 0)
  327. {
  328. memset(rxByte, 0, sizeof (rxByte));
  329. if(system_command(Fd, txByte, tx_len, rxByte) > 0)
  330. {
  331. memset(tmp, 0, sizeof tmp);
  332. memcpy(tmp, rxByte, sizeof(rxByte));
  333. if(tmp[1] == RFID_CMD_FELICA_POLLING_REQUEST)
  334. {
  335. #ifdef SystemLogMessage
  336. DEBUG_INFO_1("FELICA.\n");
  337. #endif
  338. cardLength = LENGTH_6;
  339. memcpy(data, rxByte+6, cardLength);
  340. isSuccess = true;
  341. }
  342. else if(tmp[1] == 0xD0)
  343. {
  344. cardLength = LENGTH_0;
  345. isSuccess = false;
  346. }
  347. }
  348. else
  349. {}
  350. }
  351. else
  352. {}
  353. break;
  354. }
  355. return isSuccess;
  356. }
  357. //==========================================
  358. // Read block data from RFID card
  359. //==========================================
  360. bool getBlockRead(int Fd, int moduleType, int block, unsigned char keyId, unsigned char *data)
  361. {
  362. bool isSuccess = false;
  363. int i;
  364. int j = 0;
  365. int len = 11;
  366. unsigned char txByte[len];
  367. unsigned char rxByte[254];
  368. unsigned char tmp[254];
  369. switch(moduleType)
  370. {
  371. case MODULE_EWT:
  372. default:
  373. //===============================
  374. // Command
  375. //===============================
  376. txByte[0] = 0x0A;
  377. txByte[1] = RFID_CMD_BLOCK_READ;
  378. txByte[2] = keyId;
  379. txByte[3] = block;
  380. for(i = 4; i < 10; i++)
  381. {
  382. if( j < sizeof (sectorKeyA[0]))
  383. {
  384. txByte[i] = sectorKeyA[(int)(block/4)][j];
  385. j++;
  386. }
  387. }
  388. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  389. if(Fd > 0)
  390. {
  391. memset(rxByte, 0, sizeof(rxByte));
  392. if(system_command(Fd, txByte, len, rxByte) > 0)
  393. {
  394. memset(tmp, 0, sizeof tmp);
  395. memcpy(tmp, rxByte, sizeof (rxByte));
  396. if((tmp[1] == RFID_CMD_BLOCK_READ))
  397. {
  398. #ifdef SystemLogMessage
  399. DEBUG_INFO_1("Read block ok.\n");
  400. #endif
  401. memcpy(data, rxByte+2, 16);
  402. isSuccess = true;
  403. }
  404. else if (tmp[1] == 0xDE)
  405. {
  406. #ifdef SystemLogMessage
  407. DEBUG_INFO_1("Read block failed.\n");
  408. #endif
  409. }
  410. else
  411. {}
  412. }
  413. else
  414. {}
  415. }
  416. else
  417. {}
  418. break;
  419. }
  420. return isSuccess;
  421. }
  422. //==========================================
  423. // Write data into RFID card block
  424. //==========================================
  425. bool setBlockWrite(int Fd, int moduleType, int block, unsigned char keyid, unsigned char *data)
  426. {
  427. bool isSuccess = false;
  428. int i;
  429. int j = 0;
  430. int len = 27;
  431. unsigned char txByte[len];
  432. unsigned char rxByte[254];
  433. unsigned char tmp[254];
  434. switch(moduleType)
  435. {
  436. case MODULE_EWT:
  437. default:
  438. //===============================
  439. // Command
  440. //===============================
  441. txByte[0] = 0x1A;
  442. txByte[1] = RFID_CMD_BLOCK_WRITE;
  443. txByte[2] = keyid;
  444. txByte[3] = block;
  445. for(i = 4; i < 10; i++)
  446. {
  447. if( j < sizeof (sectorKeyA[0]))
  448. {
  449. txByte[i] = sectorKeyA[(int)(block/4)][j];
  450. j++;
  451. }
  452. }
  453. memcpy(txByte+10, data, 16);
  454. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,(ARRAY_SIZE(txByte)));
  455. if(Fd > 0)
  456. {
  457. memset(rxByte, 0, sizeof(rxByte));
  458. if(system_command(Fd, txByte, len, rxByte) > 0)
  459. {
  460. memset(tmp, 0, sizeof tmp);
  461. memcpy(tmp, rxByte, sizeof (rxByte));
  462. if(tmp[1] == RFID_CMD_BLOCK_WRITE)
  463. {
  464. #ifdef SystemLogMessage
  465. DEBUG_INFO_1("Write block ok.\n");
  466. #endif
  467. isSuccess = true;
  468. }
  469. else if(tmp[1] == 0xDD)
  470. {
  471. #ifdef SystemLogMessage
  472. DEBUG_INFO_1("Write block failed.\n");
  473. #endif
  474. isSuccess = false;
  475. }
  476. }
  477. else
  478. {}
  479. }
  480. else
  481. {}
  482. break;
  483. }
  484. return isSuccess;
  485. }
  486. //==========================================
  487. // Buzzer set (EWT Module)
  488. //==========================================
  489. void setBuzzer(int Fd, int moduleType, unsigned char time)
  490. {
  491. int len = 4;
  492. unsigned char txByte[len];
  493. unsigned char rxByte[254];
  494. unsigned char tmp[254];
  495. switch(moduleType)
  496. {
  497. case MODULE_EWT:
  498. default:
  499. //===============================
  500. // Command
  501. //===============================
  502. txByte[0] = 0x03;
  503. txByte[1] = RFID_CMD_BUZZER_SET;
  504. if(time > 0x0A)
  505. {
  506. time = 0x05;
  507. txByte[2] = time;
  508. #ifdef SystemLogMessage
  509. DEBUG_WARN_1("Value is out of range.\n");
  510. #endif
  511. }
  512. else
  513. {
  514. txByte[2] = time;
  515. }
  516. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  517. if(Fd > 0)
  518. {
  519. memset(rxByte, 0, sizeof(rxByte));
  520. if(system_command(Fd, txByte, len, rxByte) > 0)
  521. {
  522. memset(tmp, 0, sizeof tmp);
  523. memcpy(tmp, rxByte, sizeof (rxByte));
  524. if(tmp[1] == 0x14)
  525. {
  526. #ifdef SystemLogMessage
  527. DEBUG_INFO_1("Set Buzzer ok.\n");
  528. DEBUG_INFO_1("Set Buzzer %d ms.\n",time);
  529. #endif
  530. }
  531. else if(tmp[1] == 0xEC)
  532. {
  533. #ifdef SystemLogMessage
  534. DEBUG_INFO_1("Set Buzzer fail.\n");
  535. #endif
  536. }
  537. }
  538. else
  539. {}
  540. }
  541. else
  542. {}
  543. break;
  544. }
  545. }
  546. //==========================================
  547. // Halt RFID card (EWT)
  548. //==========================================
  549. void sethaltCard(int Fd, int moduleType)
  550. {
  551. int len = 3;
  552. unsigned char txByte[len];
  553. unsigned char rxByte[254];
  554. unsigned char tmp[254];
  555. switch(moduleType)
  556. {
  557. case MODULE_EWT:
  558. default:
  559. //===============================
  560. // Command
  561. //===============================
  562. txByte[0] = 0x02;
  563. txByte[1] = RFID_CMD_HALT_14443A;
  564. txByte[ARRAY_SIZE(txByte)-1] = ClaCheckSum(txByte,ARRAY_SIZE(txByte));
  565. if(Fd > 0)
  566. {
  567. memset(rxByte, 0, sizeof(rxByte));
  568. if(system_command(Fd, txByte, len, rxByte) > 0)
  569. {
  570. memset(tmp, 0, sizeof tmp);
  571. memcpy(tmp, rxByte, sizeof (rxByte));
  572. if(tmp[1] == 0x28)
  573. {
  574. #ifdef SystemLogMessage
  575. DEBUG_INFO_1("Halt card pass.\n");
  576. #endif
  577. }
  578. else if(tmp[1] == 0xD7)
  579. {
  580. #ifdef SystemLogMessage
  581. DEBUG_INFO_1("Halt card fail.\n");
  582. #endif
  583. }
  584. else
  585. {}
  586. }
  587. else
  588. {}
  589. }
  590. else
  591. {}
  592. break;
  593. }
  594. }