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.

JLObuWechat33Pack.js 5.9KB

1 年之前
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. var dataTool = require("./dataTool");
  2. var cmdKey = require("./JLZJConfig.js");
  3. var wxSeq = 0;
  4. var frame = 0;
  5. var MAX_PACK_LEN = 95;
  6. var ST = "33";
  7. export function wechatInit1(mac) {
  8. var cmd_arr = packWechatInit1(mac);
  9. return cmd_arr
  10. };
  11. export function wechatInit2() {
  12. var cmd_arr = packWechatInit2();
  13. return cmd_arr
  14. };
  15. export function ICCResetReq() {
  16. var cmd = cmdKey.ICCResetCmd();
  17. var cmd_arr = packData(cmd);
  18. return cmd_arr
  19. };
  20. export function ESAMResetReq() {
  21. var cmd = cmdKey.ESAMResetCmd();
  22. var cmd_arr = packData(cmd);
  23. return cmd_arr
  24. };
  25. export function ICCChannelTransmission(type, dataArr) {
  26. var cmdApdu = cread_apdu(dataArr);
  27. var cmdApduLen = cmdApdu.length / 2;
  28. var cmd = cmdKey.ICCChannelCmd() + type + dataTool.tenToHex(cmdApduLen, 4, true) + cmdApdu;
  29. var cmd_arr = packData(cmd);
  30. return cmd_arr
  31. };
  32. export function ESAMChannelTransmission(type, dataArr) {
  33. var cmdApdu = cread_apdu(dataArr);
  34. var cmdApduLen = cmdApdu.length / 2;
  35. var cmd = cmdKey.ESAMChannelCmd() + type + dataTool.tenToHex(cmdApduLen, 4, true) + cmdApdu;
  36. var cmd_arr = packData(cmd);
  37. return cmd_arr
  38. };
  39. function packData(cmd) {
  40. var cmd_arr = pack33Protocol(cmd);
  41. var wechat_arr = packWechatCmd(cmd_arr);
  42. var cmdArray = [];
  43. for (var i = 0; i < wechat_arr.length; i++) {
  44. var wechat_cmd = wechat_arr[i].wxTotalData;
  45. if (wechat_cmd.length < 40) {
  46. cmdArray.push(wechat_cmd)
  47. } else {
  48. for (var j = 0; j < wechat_cmd.length; j += 40) {
  49. var wechat_sub_cmd = wechat_cmd.substr(j, 40);
  50. cmdArray.push(wechat_sub_cmd)
  51. }
  52. }
  53. }
  54. return cmdArray
  55. }
  56. function pack33Protocol(cmd) {
  57. add_Frame();
  58. var cmdlen = cmd.length / 2;
  59. var cmd33conten = [];
  60. if (cmdlen > MAX_PACK_LEN) {
  61. var packages = Math.round(cmdlen / MAX_PACK_LEN);
  62. for (var i = 0; i < packages; i++) {
  63. var tempBean = {
  64. ST: "",
  65. SN: "",
  66. CTL: "",
  67. LEN: "",
  68. DATA: "",
  69. BCC: "",
  70. TOTALDATA: ""
  71. };
  72. tempBean.ST = ST;
  73. tempBean.SN = dataTool.tenToHex(frame, 2);
  74. if (i == 0) {
  75. tempBean.CTL = get_ctl(1, packages - (i + 1))
  76. } else {
  77. tempBean.CTL = get_ctl(0, packages - (i + 1))
  78. }
  79. if (i + 1 == packages) {
  80. tempBean.DATA = cmd.substring(i * MAX_PACK_LEN * 2)
  81. } else {
  82. tempBean.DATA = cmd.substring(i * MAX_PACK_LEN * 2, i * MAX_PACK_LEN * 2 + MAX_PACK_LEN * 2)
  83. }
  84. tempBean.LEN = dataTool.tenToHex(tempBean.DATA.length / 2, 2);
  85. tempBean.BCC = dataTool.bccCheck(tempBean.SN + tempBean.CTL + tempBean.LEN + tempBean.DATA);
  86. console.log("tempBean.BCC====================:" + tempBean.BCC);
  87. tempBean.TOTALDATA = tempBean.ST + tempBean.SN + tempBean.CTL + tempBean.LEN + tempBean.DATA + tempBean.BCC;
  88. cmd33conten.push(tempBean)
  89. }
  90. } else {
  91. var tempBean = {
  92. ST: "",
  93. SN: "",
  94. CTL: "",
  95. LEN: "",
  96. DATA: "",
  97. BCC: "",
  98. TOTALDATA: ""
  99. };
  100. tempBean.ST = ST;
  101. tempBean.SN = dataTool.tenToHex(frame, 2);
  102. tempBean.CTL = get_ctl(1, 0);
  103. tempBean.LEN = dataTool.tenToHex(cmdlen, 2);
  104. tempBean.DATA = cmd;
  105. tempBean.BCC = dataTool.bccCheck(tempBean.SN + tempBean.CTL + tempBean.LEN + tempBean.DATA);
  106. tempBean.TOTALDATA = tempBean.ST + tempBean.SN + tempBean.CTL + tempBean.LEN + tempBean.DATA + tempBean.BCC;
  107. cmd33conten.push(tempBean)
  108. }
  109. return cmd33conten
  110. }
  111. export function cread_apdu(cmdArr) {
  112. var content = cread_TLV(cmdArr);
  113. var contentuLen = content.length / 2;
  114. var contentApdu = "";
  115. var contentApduLen = "";
  116. if (contentuLen <= 80) {
  117. contentApduLen = dataTool.tenToHex(contentuLen, 2)
  118. } else {
  119. if (contentuLen <= 255) {
  120. contentApduLen = "81" + dataTool.tenToHex(contentuLen, 2)
  121. } else {
  122. contentApduLen = "82" + dataTool.tenToHex(contentuLen, 4)
  123. }
  124. }
  125. contentApdu = "80" + contentApduLen + content;
  126. return contentApdu
  127. };
  128. function cread_TLV(cmdArr) {
  129. var strTLV = "";
  130. for (var i = 1; i <= cmdArr.length; i++) {
  131. var cmd = cmdArr[i - 1];
  132. var len = cmd.length / 2;
  133. strTLV = strTLV + dataTool.tenToHex(i, 2) + dataTool.tenToHex(len, 2) + cmd
  134. }
  135. return strTLV
  136. }
  137. function add_Frame() {
  138. frame++;
  139. if (frame > 15) {
  140. frame = 0
  141. }
  142. }
  143. function get_ctl(bit7, serial) {
  144. var ctl = "";
  145. if (bit7 == 0) {
  146. ctl = dataTool.tenToHex(serial, 2)
  147. } else {
  148. var n = (2 << 6) + serial;
  149. ctl = dataTool.tenToHex(n, 2)
  150. }
  151. return ctl
  152. }
  153. export function packWechatInit1(mac) {
  154. var cmd = "fe01000e4e21" + mac + "0a0208001200";
  155. var cmd_arr = [];
  156. for (var i = 0; i < cmd.length; i += 40) {
  157. var cmd_sub = cmd.substr(i, 40);
  158. cmd_arr.push(cmd_sub)
  159. }
  160. return cmd_arr
  161. };
  162. export function packWechatInit2() {
  163. var cmd = "fe0100134e23" + "0002" + "0a02080010b42418f8ac01";
  164. var cmd_arr = [];
  165. for (var i = 0; i < cmd.length; i += 40) {
  166. var cmd_sub = cmd.substr(i, 40);
  167. cmd_arr.push(cmd_sub)
  168. }
  169. return cmd_arr
  170. };
  171. function packWechatCmd(cmdArray) {
  172. var cmdwxconten = [];
  173. var temp33conten = cmdArray;
  174. if (temp33conten.length > 0) {
  175. for (var i = 0; i < temp33conten.length; i++) {
  176. var tempBean_33 = temp33conten[i].TOTALDATA;
  177. var tempBean_wx = {
  178. wxMagicNumber: "",
  179. wxVer: "",
  180. wxLen: "",
  181. wxCMD: "",
  182. wxSeq: "",
  183. wxData: "",
  184. wxExtra: "",
  185. wxTail: "",
  186. wxTotalData: ""
  187. };
  188. tempBean_uni.wxMagicNumber = "FE";
  189. tempBean_uni.wxVer = "01";
  190. tempBean_uni.wxLen = dataTool.tenToHex(tempBean_33.length / 2 + 14, 4);
  191. tempBean_uni.wxCMD = "7531";
  192. tempBean_uni.wxSeq = "0000";
  193. tempBean_uni.wxExtra = "0A0012" + getwcDATAlen(tempBean_33.length / 2);
  194. tempBean_uni.wxData = tempBean_33;
  195. tempBean_uni.wxTail = "1800";
  196. tempBean_uni.wxTotalData = tempBean_uni.wxMagicNumber + tempBean_uni.wxVer + tempBean_uni.wxLen +
  197. tempBean_uni.wxCMD + tempBean_uni.wxSeq + tempBean_uni.wxExtra + tempBean_uni.wxData + tempBean_uni
  198. .wxTail;
  199. cmdwxconten.push(tempBean_wx)
  200. }
  201. }
  202. return cmdwxconten
  203. }
  204. function getwcDATAlen(dataLen) {
  205. var len = "";
  206. var lens1 = 0;
  207. var lens2 = 0;
  208. if (dataLen > 127) {
  209. lens1 = dataLen & 127 | 128;
  210. lens2 = dataLen >> 7 & 127;
  211. len = dataTool.tenToHex(lens1, 2) + dataTool.tenToHex(lens2, 2)
  212. } else {
  213. len = dataTool.tenToHex(dataLen, 2)
  214. }
  215. return len
  216. }