index.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. process.on('message', async (message, setHandle) => {
  2. let program
  3. let timer
  4. let st
  5. let icdev
  6. try {
  7. const ffi = require('ffi')
  8. const ref = require('ref')
  9. let dllPath = require('path').join(message)
  10. program = ffi.Library(dllPath, {
  11. 'hex_a': ['int', ['int', 'char*', 'int']],
  12. 'rf_usbopen': ['int', []],
  13. 'rf_usbclose': ['int', ['int']],
  14. 'rf_beep': ['int', ['int', 'int']],
  15. 'rf_halt': ['int', ['int']],
  16. 'rf_load_key': ['int', ['int', 'int', 'int', 'char*']],
  17. 'rf_load_key_hex': ['int', ['int', 'int', 'int', 'char*']],
  18. 'rf_request': ['int', ['int', 'int', 'char*']],
  19. 'rf_anticoll': ['int', ['int', 'int', ref.refType('long')]],
  20. 'rf_select': ['int', ['int', ref.refType('long'), 'char*']],
  21. 'rf_card': ['int', ['int', 'int', 'char*']],
  22. 'rf_authentication': ['int', ['int', 'int', 'int']],
  23. 'rf_authentication_key': ['int', ['int', 'int', 'int', 'char*']],
  24. 'rf_read': ['int', ['int', 'int', 'char*']]
  25. })
  26. icdev = program.rf_usbopen()
  27. if (icdev < 0) {
  28. exit(0) // 连接错误
  29. }
  30. readCard()
  31. } catch (e) {
  32. exit(e)
  33. }
  34. function exit (val) {
  35. if (icdev > 0) {
  36. program.rf_usbclose(icdev)
  37. }
  38. process.send(val)
  39. process.kill(process.pid)
  40. process.exit(0)
  41. }
  42. function readCard () {
  43. timer && clearTimeout(timer)
  44. // 装载密码
  45. loadKey()
  46. const snr = Buffer.alloc(4)
  47. st = program.rf_card(icdev, 0, snr)
  48. // 验证1扇区密码
  49. st = program.rf_authentication(icdev, 0, 1)
  50. const card = Buffer.alloc(16)
  51. // 1扇区0块,从4开始计算(每个扇区4个数据块[[0,1,2,3][4,5,6,7],....])
  52. st = program.rf_read(icdev, 4, card)
  53. timer = setTimeout(() => {
  54. readCard()
  55. }, 500)
  56. const result = snr.readUIntLE(0, 4)
  57. if (st !== 18 && result) {
  58. // 读卡器鸣叫
  59. program.rf_beep(icdev, 30)
  60. // 发送iccard号
  61. exit(result + '')
  62. }
  63. }
  64. function loadKey () {
  65. const key = Buffer.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
  66. const mode = 0
  67. let sector = 0
  68. for (let i = 0; i < 16; i++) {
  69. // console.log(icdev, mode, sector, key)
  70. const st = program.rf_load_key(icdev, mode, sector, key)
  71. if (st < 0) {
  72. console.log(st + '_' + sector + ' sector rf_load_key error!')
  73. }
  74. sector++
  75. }
  76. }
  77. // program.rf_usbclose(icdev)
  78. })