You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

kcDataAnalysis.js 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517
  1. "use strict";
  2. var _kcUtils = require("./kcUtils.js")
  3. , _kcUtils2 = _interopRequireDefault(_kcUtils);
  4. function _interopRequireDefault(e) {
  5. return e && e.__esModule ? e : {
  6. default: e
  7. }
  8. }
  9. function analysisinitIC(e) {
  10. var a = _kcUtils2.default.hexStr2byteArray(e)
  11. , r = {};
  12. return 73 == a.byteLength ? (0 == (128 & a[1]) ? (r.serviceCode = 0,
  13. r.serviceInfo = "初始化成功") : 128 == (128 & a[1]) ? (r.serviceCode = 1,
  14. r.serviceInfo = "初始化失败") : (r.serviceCode = -3,
  15. r.serviceInfo = "初始化异常"),
  16. r.serviceData = {},
  17. r.serviceData.dataBuff = e) : (r.serviceCode = -2,
  18. r.serviceInfo = "获取卡片初始化失败,信息长度有误"),
  19. r
  20. }
  21. function analysisCardbalance(e) {
  22. if (0 != _analysisIs9000(e).serviceCode)
  23. return e = _kcUtils2.default.byteArray2hexStr(e),
  24. console.log(e),
  25. e
  26. }
  27. function analysisCardInfo(e) {
  28. var a = _kcUtils2.default.hexStr2byteArray(e)
  29. , r = {}
  30. , t = a.byteLength
  31. , e = _analysisIs9000(e);
  32. if (0 != e.serviceCode)
  33. return r = e;
  34. if (55 == t) {
  35. a.slice(2, 10);
  36. var e = a.slice(10, 11)
  37. , t = a.slice(11, 12)
  38. , s = a.slice(12, 14)
  39. , i = a.slice(14, 22)
  40. , l = a.slice(22, 26)
  41. , c = a.slice(26, 30)
  42. , n = a.slice(30, 42)
  43. , o = a.slice(42, 43)
  44. , y = a.slice(43, 44)
  45. , d = a.slice(44, 45)
  46. , a = a.slice(49, 53)
  47. , f = (r.serviceCode = 0,
  48. r.serviceInfo = "获取卡片信息成功",
  49. r.serviceData = {},
  50. r.serviceData.cardId = _kcUtils2.default.byteArray2hexStr(s) + _kcUtils2.default.byteArray2hexStr(i),
  51. Number(e.toString()));
  52. switch (f) {
  53. case 0:
  54. f = "正常通行卡";
  55. break;
  56. case 1:
  57. f = "测试通行卡";
  58. break;
  59. case 2:
  60. f = "预编码通行卡";
  61. break;
  62. case 3:
  63. f = "公务卡";
  64. break;
  65. case 4:
  66. f = "预付卡";
  67. break;
  68. case 5:
  69. f = "电子标签";
  70. break;
  71. case 21:
  72. f = "年/月票卡";
  73. break;
  74. case 22:
  75. f = "储值卡";
  76. break;
  77. case 23:
  78. f = "记账卡";
  79. break;
  80. case 24:
  81. f = "PSAM卡";
  82. break;
  83. case 25:
  84. f = "ISAM卡";
  85. break;
  86. case 51:
  87. f = "收费员工作卡";
  88. break;
  89. case 52:
  90. f = "值班员工作卡";
  91. break;
  92. case 53:
  93. f = "维修员工作卡";
  94. break;
  95. case 54:
  96. f = "维护员工作卡";
  97. break;
  98. case 55:
  99. f = "高级维护员卡"
  100. }
  101. 6 <= f && f <= 20 ? f = "自定义" : 26 <= f && f <= 50 && (f = "保留"),
  102. r.serviceData.cardType = f,
  103. r.serviceData.cardVersion = _kcUtils2.default.byteArray2hexStr(t),
  104. r.serviceData.expiredDate = _kcUtils2.default.byteArray2hexStr(c);
  105. var v = _kcUtils2.default.byteArray2hexStr(y);
  106. switch (v) {
  107. case "00":
  108. v = "蓝色";
  109. break;
  110. case "01":
  111. v = "黄色";
  112. break;
  113. case "02":
  114. v = "黑色";
  115. break;
  116. case "03":
  117. v = "白色";
  118. break;
  119. case "04":
  120. case "05":
  121. v = "渐变绿";
  122. break;
  123. case "ff":
  124. v = "未知";
  125. break;
  126. default:
  127. v = "保留"
  128. }
  129. switch (r.serviceData.plateColor = v,
  130. r.serviceData.provider = "山东",
  131. r.serviceData.SignedDate = _kcUtils2.default.byteArray2hexStr(l),
  132. o = Number(o.toString())) {
  133. case 0:
  134. o = "普通车";
  135. break;
  136. case 6:
  137. o = "公务车";
  138. break;
  139. case 8:
  140. o = "军警车";
  141. break;
  142. case 10:
  143. o = "紧急车";
  144. break;
  145. case 12:
  146. o = "免费";
  147. break;
  148. case 14:
  149. o = "车队";
  150. break;
  151. default:
  152. o = 0 < o && o <= 20 ? "自定义" : "保留"
  153. }
  154. switch (r.serviceData.userType = o,
  155. d = Number(d.toString())) {
  156. case 1:
  157. case 11:
  158. d = "一型车";
  159. break;
  160. case 2:
  161. case 12:
  162. d = "二型车";
  163. break;
  164. case 3:
  165. case 13:
  166. d = "三型车";
  167. break;
  168. case 4:
  169. case 14:
  170. d = "四型车";
  171. break;
  172. case 5:
  173. case 15:
  174. d = "五型车";
  175. break;
  176. case 6:
  177. case 16:
  178. d = "六型车";
  179. break;
  180. default:
  181. d = "自定义"
  182. }
  183. r.serviceData.balance = _kcUtils2.default.byteArray2hexStr(a),
  184. r.serviceData.vehicleMode = d,
  185. r.serviceData.vehicleNumber = _kcUtils2.default.byteArray2hexStr(n)
  186. } else
  187. r.serviceCode = -3,
  188. r.serviceInfo = "获取卡片信息失败,信息长度有误";
  189. return r
  190. }
  191. function analysisCardOwnerRecord(e) {
  192. var a, r, t = _kcUtils2.default.hexStr2byteArray(e), s = {}, i = t.byteLength, e = _analysisIs9000(e);
  193. return 0 != e.serviceCode ? e : (59 == i ? (e = t.slice(2, 3),
  194. i = t.slice(3, 4),
  195. a = t.slice(4, 24),
  196. r = t.slice(24, 56),
  197. t = t.slice(56, 57),
  198. s.serviceCode = 0,
  199. s.serviceInfo = "获取持卡人信息成功",
  200. s.serviceData = {},
  201. s.serviceData.ownerId = _kcUtils2.default.byteArray2hexStr(e),
  202. s.serviceData.staffId = _kcUtils2.default.byteArray2hexStr(i),
  203. s.serviceData.ownerLicenseNumber = _kcUtils2.default.hexCharCodeToStr(_kcUtils2.default.byteArray2hexStr(r)),
  204. s.serviceData.ownerLicenseType = _kcUtils2.default.byteArray2hexStr(t),
  205. s.serviceData.ownerName = _kcUtils2.default.byteArray2hexStr(a)) : (s.serviceCode = -3,
  206. s.serviceInfo = "获取持卡人信息失败,信息长度有误"),
  207. s)
  208. }
  209. function analysisCardTransactionRecord(e) {
  210. var a = 0
  211. , r = _kcUtils2.default.hexStr2byteArray(e)
  212. , t = r.byteLength
  213. , s = {};
  214. if (4 <= t) {
  215. for (s.serviceCode = 0,
  216. s.serviceInfo = "获取交易记录信息成功",
  217. s.serviceData = {},
  218. s.serviceData.CardTransactionRecordData = []; a < t;) {
  219. var i = r[a++]
  220. , l = r[a] - 1;
  221. if (console.log("kc9000校验第" + i + "条:", r[a + l], r[a + l + 1]),
  222. 144 != r[a + l] || 0 != r[a + l + 1])
  223. return console.log("交易记录:", s),
  224. s;
  225. i = {};
  226. if (a++,
  227. i.onlineSn = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 2)),
  228. a += 2,
  229. i.overdrawLimit = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 3)),
  230. a += 3,
  231. i.transAmount = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 4)),
  232. a += 4,
  233. i.transType = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 1)),
  234. a += 1,
  235. i.terminalNo = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 6)),
  236. a += 6,
  237. i.transDate = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 4)),
  238. a += 4,
  239. i.transTime = _kcUtils2.default.byteArray2hexStr(r.slice(a, a + 3)),
  240. a = a + 3 + 2,
  241. s.serviceData.CardTransactionRecordData.push(i),
  242. "ffff" == _kcUtils2.default.byteArray2hexStr(i.onlineSn) || "0000" == _kcUtils2.default.byteArray2hexStr(i.onlineSn))
  243. return console.log("交易记录:", s),
  244. s
  245. }
  246. console.log("交易记录:", s)
  247. } else
  248. s.serviceCode = -3,
  249. s.serviceInfo = "获取交易记录失败,信息长度有误";
  250. return s
  251. }
  252. function analysisgetCardConsumeRecord(e) {
  253. var a = _kcUtils2.default.hexStr2byteArray(e)
  254. , r = {}
  255. , t = a.byteLength
  256. , s = 0;
  257. if (4 <= t) {
  258. for (r.serviceCode = 0,
  259. r.serviceInfo = "获取过站信息成功",
  260. r.serviceData = {},
  261. r.serviceData.CardConsumeRecordData = []; s < t;) {
  262. var i = a[s++]
  263. , l = a[s] - 1;
  264. if (_kcUtils2.default.showLog("kc9000校验第" + i + "条:", a[s + l], a[s + l + 1]),
  265. 144 != a[s + l] || 0 != a[s + l + 1])
  266. break;
  267. i = {};
  268. s++,
  269. i.tollRoadNetworkId = a.slice(2, 4),
  270. s += 2,
  271. i.tollStationId = a.slice(4, 6),
  272. s += 2,
  273. i.tollLaneId = a.slice(6, 7),
  274. s += 1,
  275. i.timeUnix = a.slice(7, 11),
  276. s += 4,
  277. i.vehicleModel = a.slice(11, 12),
  278. s += 1,
  279. i.passStatus = a.slice(12, 13),
  280. s += 1,
  281. i.reserve1 = a.slice(13, 22),
  282. s += 9,
  283. i.staffNo = a.slice(22, 25),
  284. s += 3,
  285. i.mtcSequenceNo = a.slice(25, 26),
  286. s += 1,
  287. i.staffNo = a.slice(26, 38),
  288. s += 12,
  289. i.mtcSequenceNo = a.slice(38, 42),
  290. s = s + 4 + 2,
  291. r.serviceData.CardConsumeRecordData.push(i),
  292. console.log("cardConsumeRecordBean", i, s)
  293. }
  294. console.log("过站信息:", r)
  295. } else
  296. r.serviceCode = -3,
  297. r.serviceInfo = "获取过站信息失败,信息长度有误";
  298. return r
  299. }
  300. function analysisInitInfo(e) {
  301. var a, r, t, s = _kcUtils2.default.hexStr2byteArray(e), i = {}, l = s.byteLength, e = _analysisIs9000(e);
  302. return 0 != e.serviceCode ? e : (20 == l ? (e = s.slice(2, 6),
  303. l = s.slice(6, 8),
  304. a = s.slice(8, 9),
  305. r = s.slice(9, 10),
  306. t = s.slice(10, 14),
  307. s = s.slice(14, 18),
  308. _kcUtils2.default.showLog("balance:", _kcUtils2.default.byteArray2hexStr(e), "pseudoRand:", _kcUtils2.default.byteArray2hexStr(t), "Mac1:", _kcUtils2.default.byteArray2hexStr(s), "CardSeq:", _kcUtils2.default.byteArray2hexStr(l)),
  309. i.serviceCode = 0,
  310. i.serviceInfo = "解析圈存初始化成功",
  311. i.serviceData = {},
  312. i.serviceData.balance = _kcUtils2.default.byteArray2hexStr(e),
  313. i.serviceData.serial = _kcUtils2.default.byteArray2hexStr(l),
  314. i.serviceData.keyVersion = _kcUtils2.default.byteArray2hexStr(a),
  315. i.serviceData.algTag = _kcUtils2.default.byteArray2hexStr(r),
  316. i.serviceData.icRandom = _kcUtils2.default.byteArray2hexStr(t),
  317. i.serviceData.mac1 = _kcUtils2.default.byteArray2hexStr(s)) : (i.serviceCode = -3,
  318. i.serviceInfo = "解析圈存初始化失败,信息长度有误"),
  319. i)
  320. }
  321. function analysisLoadCreadit(e) {
  322. var a = _kcUtils2.default.hexStr2byteArray(e)
  323. , r = {}
  324. , t = a.byteLength
  325. , e = _analysisIs9000(e);
  326. return 0 != e.serviceCode ? e : (8 == t ? (e = a.slice(2, 6),
  327. _kcUtils2.default.showLog("TAG", _kcUtils2.default.byteArray2hexStr(e)),
  328. r.serviceCode = 0,
  329. r.serviceInfo = "圈存成功",
  330. r.serviceData = {},
  331. r.serviceData.TAG = _kcUtils2.default.byteArray2hexStr(e)) : (r.serviceCode = -3,
  332. r.serviceInfo = "圈存解析失败,长度有误"),
  333. r)
  334. }
  335. function analysisgetObuSysInfo(e) {
  336. var a, r, t, s, i = _kcUtils2.default.hexStr2byteArray(e), l = {}, c = i.byteLength, e = _analysisIs9000(e);
  337. return 0 != e.serviceCode ? e : (31 == c ? (e = i.slice(2, 10),
  338. c = i.slice(10, 11),
  339. a = i.slice(11, 12),
  340. r = i.slice(12, 20),
  341. t = i.slice(20, 24),
  342. s = i.slice(24, 28),
  343. i = i.slice(28, 29),
  344. _kcUtils2.default.showLog("contractProvider", _kcUtils2.default.byteArray2hexStr(e), "contractSerialNumber", _kcUtils2.default.byteArray2hexStr(r), "issueFlag", _kcUtils2.default.byteArray2hexStr(i)),
  345. l.serviceCode = 0,
  346. l.serviceInfo = "获取OBU系统成功",
  347. l.serviceData = {},
  348. l.serviceData.contractProvider = _kcUtils2.default.byteArray2hexStr(e),
  349. l.serviceData.contractType = _kcUtils2.default.byteArray2hexStr(c),
  350. l.serviceData.contractVersion = _kcUtils2.default.byteArray2hexStr(a),
  351. l.serviceData.contractSerialNumber = _kcUtils2.default.byteArray2hexStr(r),
  352. l.serviceData.contractSignedDate = _kcUtils2.default.byteArray2hexStr(t),
  353. l.serviceData.contractExpiredDate = _kcUtils2.default.byteArray2hexStr(s),
  354. l.serviceData.issueFlag = _kcUtils2.default.byteArray2hexStr(i)) : (l.serviceCode = -1,
  355. l.serviceInfo = "OBU系统信息解析失败,长度有误"),
  356. l)
  357. }
  358. function analysisGetRand(e) {
  359. var a = _kcUtils2.default.hexStr2byteArray(e)
  360. , r = {}
  361. , t = a.byteLength
  362. , e = _analysisIs9000(e);
  363. return 0 != e.serviceCode ? e : (8 == t ? (e = a.slice(2, 6),
  364. _kcUtils2.default.showLog("rand", _kcUtils2.default.byteArray2hexStr(e)),
  365. r.serviceCode = 0,
  366. r.serviceInfo = "获取随机数成功",
  367. r.serviceData = {},
  368. r.serviceData.rand = _kcUtils2.default.byteArray2hexStr(e)) : (r.serviceCode = -1,
  369. r.serviceInfo = "获取随机数失败,长度有误"),
  370. r)
  371. }
  372. function analysisVehCipherInfo(e) {
  373. var a = _kcUtils2.default.hexStr2byteArray(e)
  374. , r = {}
  375. , t = a.byteLength
  376. , e = _analysisIs9000(e);
  377. return 0 != e.serviceCode ? e : (3 <= t ? (e = a.slice(2, t - 2),
  378. _kcUtils2.default.showLog("cipherVehInfo", _kcUtils2.default.byteArray2hexStr(e)),
  379. r.serviceCode = 0,
  380. r.serviceInfo = "获取密文车辆信息成功",
  381. r.serviceData = {},
  382. r.serviceData.cipherVehInfo = _kcUtils2.default.byteArray2hexStr(e)) : (r.serviceCode = -1,
  383. r.serviceInfo = "获取密文车辆信息失败,长度有误"),
  384. r)
  385. }
  386. function _analyzeUnpacksIntoArrays(e) {
  387. var byteArray = _kcUtils2.default.hexStr2byteArray(e),
  388. result = {},
  389. index = 0,
  390. length = byteArray.byteLength, packets = [];
  391. var parsedTLVs;
  392. if (length >= 4) {
  393. // 解析 TLV 报文
  394. parsedTLVs = parseTLV(byteArray);
  395. for (let tlv of parsedTLVs) {
  396. console.log("Unpacks " + tlv.ordinal + " 条:", tlv.len);
  397. packets.push(_kcUtils2.default.byteArray2hexStr(tlv.value));
  398. }
  399. result.serviceCode = 0;
  400. result.serviceInfo = "拆包为数组成功";
  401. } else {
  402. result.serviceCode = -2;
  403. result.serviceInfo = "拆包为数组失败,长度有误";
  404. }
  405. result.unpacksData = packets;
  406. return result;
  407. }
  408. // 获取报文的TAG、LEN和VALUE
  409. function parseTLV(data) {
  410. var results = [];
  411. var index = 0;
  412. while (index < data.length) {
  413. var result = {};
  414. // 读取 ordinal
  415. result.ordinal = data[index++];
  416. // 读取 LEN
  417. if (data[index] <= 0x80) {
  418. result.len = data[index];
  419. index += 1;
  420. } else if (data[index] === 0x81) {
  421. result.len = data[index + 1];
  422. index += 2;
  423. } else if (data[index] === 0x82) {
  424. result.len = (data[index + 1] << 8) + data[index + 2];
  425. index += 3;
  426. }
  427. // 读取 VALUE
  428. result.value = data.slice(index, index + result.len);
  429. index += result.len;
  430. results.push(result);
  431. }
  432. return results;
  433. }
  434. function _analysisIs9000(e) {
  435. var byteArray = _kcUtils2.default.hexStr2byteArray(e),
  436. result = {}, packets = [],
  437. length = byteArray.byteLength;
  438. var parsedTLVs;
  439. if (length >= 4) {
  440. // 解析 TLV 报文
  441. parsedTLVs = parseTLV(byteArray);
  442. // console.log("parsedTLVs:",parsedTLVs);
  443. for (let tlv of parsedTLVs) {
  444. let sw1 = 0, sw2 = 0;
  445. sw1 = tlv.value[tlv.len - 2];
  446. sw2 = tlv.value[tlv.len - 1];
  447. console.log("kc9000校验第" + tlv.ordinal + "条:", sw1, sw2);
  448. packets.push(_kcUtils2.default.byteArray2hexStr(tlv.value));
  449. if (sw1 != 144 || sw2 != 0) {
  450. result.serviceCode = -1;
  451. result.serviceInfo = `kc第${tlv.ordinal}包APDU非9000`;
  452. break;
  453. } else {
  454. result.serviceCode = 0;
  455. result.serviceInfo = "9000认证成功";
  456. }
  457. }
  458. } else {
  459. result.serviceCode = -2;
  460. result.serviceInfo = "9000认证失败,长度有误";
  461. }
  462. result.unpacksData = packets;
  463. return result;
  464. }
  465. function analysisDeviceInfo(e) {
  466. var a, r, t, s, i, l = _kcUtils2.default.hexStr2byteArray(e), c = {}, n = l.byteLength;
  467. switch (l[0]) {
  468. case 192:
  469. return 17 == n ? (t = l.slice(1),
  470. _kcUtils2.default.showLog("deviceSN:", _kcUtils2.default.byteArray2hexStr(t)),
  471. c.serviceCode = 0,
  472. c.serviceInfo = "获取设备信息成功",
  473. c.serviceData = {},
  474. c.serviceData.deviceSN = _kcUtils2.default.hexCharCodeToStr(_kcUtils2.default.byteArray2hexStr(t)),
  475. console.log(c.serviceData.deviceSN)) : (c.serviceCode = -1,
  476. c.serviceInfo = "获取设备信息失败,信息长度有误"),
  477. c;
  478. case 204:
  479. return 17 == n ? (a = l.slice(1, 3),
  480. r = l.slice(3, 4),
  481. t = l.slice(4, 12),
  482. s = l.slice(12, 16),
  483. i = l.slice(16),
  484. _kcUtils2.default.showLog("deviceSN:", _kcUtils2.default.byteArray2hexStr(t), "bleMac:", _kcUtils2.default.byteArray2hexStr(s), "flag:", _kcUtils2.default.byteArray2hexStr(i)),
  485. c.serviceCode = 0,
  486. c.serviceInfo = "获取设备信息成功",
  487. c.serviceData = {},
  488. c.serviceData.verId = _kcUtils2.default.byteArray2hexStr(a),
  489. c.serviceData.battery = _kcUtils2.default.byteArray2hexStr(r),
  490. c.serviceData.deviceSN = _kcUtils2.default.byteArray2hexStr(t),
  491. c.serviceData.bleMac = _kcUtils2.default.byteArray2hexStr(s),
  492. c.serviceData.flag = i) : (c.serviceCode = -1,
  493. c.serviceInfo = "获取设备信息失败,信息长度有误"),
  494. c;
  495. default:
  496. return c.serviceCode = -2,
  497. c.serviceInfo = "获取设备信息失败,指令类型有误",
  498. _kcUtils2.default.showError("kc获取设备信息失败:", "指令类型有误"),
  499. c
  500. }
  501. }
  502. module.exports = {
  503. analysisCardInfo: analysisCardInfo,
  504. analysisDeviceInfo: analysisDeviceInfo,
  505. analysisInitInfo: analysisInitInfo,
  506. analysisLoadCreadit: analysisLoadCreadit,
  507. analysisgetObuSysInfo: analysisgetObuSysInfo,
  508. analysisGetRand: analysisGetRand,
  509. _analysisIs9000: _analysisIs9000,
  510. _analyzeUnpacksIntoArrays: _analyzeUnpacksIntoArrays,
  511. analysisVehCipherInfo: analysisVehCipherInfo,
  512. analysisCardOwnerRecord: analysisCardOwnerRecord,
  513. analysisCardTransactionRecord: analysisCardTransactionRecord,
  514. analysisgetCardConsumeRecord: analysisgetCardConsumeRecord,
  515. analysisinitIC: analysisinitIC,
  516. analysisCardbalance: analysisCardbalance
  517. };