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.

kcDataEncode.js 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  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 encode(content, dataType, cmdType, ST = "33", isPrivate = false) {
  10. // 1. 获取当前协议类型(0=国标GB协议,1=微信WX协议)
  11. var protocolType = _kcUtils2.default.getProtocolType();
  12. // 2. 构建ETC应用层数据帧
  13. var etcData = getETCData(content, dataType, cmdType, isPrivate);
  14. var encodedFrame;
  15. // 3. 根据协议类型选择编码方式
  16. if (protocolType === 0) {
  17. // 国标GB28181协议编码
  18. encodedFrame = encode_GB(etcData);
  19. } else if (protocolType === 1) {
  20. // 微信协议编码
  21. encodedFrame = encode_WX(etcData, ST);
  22. }
  23. console.log('Encoded Frame:', encodedFrame);
  24. return encodedFrame;
  25. }
  26. function getETCData(content, dataType, cmdType) {
  27. var r = ""
  28. , r = "A0" == cmdType || "A3" == cmdType || "A4" == cmdType || "82" == cmdType || "AC" == cmdType ? cmdType + dataType + (r = getCommand(content)) : cmdType + content;
  29. return _kcUtils2.default.showLog("组拼ETCData完毕:", r.length / 2, r),
  30. r
  31. }
  32. function getCommand(e) {
  33. var t, a = e, r = _kcUtils2.default.getDATA_TYPE(), e = e.length / 2, n = new ArrayBuffer(10), s = new DataView(n);
  34. return 0 == r ? (t = 256 < e ? (s.setInt8(0, 4 + e & 255),
  35. s.setInt8(1, 4 + e >> 8 & 255),
  36. s.setInt8(2, 128),
  37. s.setInt8(3, 130),
  38. s.setInt8(4, e >> 8 & 255),
  39. s.setInt8(5, 255 & e),
  40. n.slice(0, 6)) : 128 < e && e <= 256 ? (s.setInt8(0, 3 + e & 255),
  41. s.setInt8(1, 3 + e >> 8 & 255),
  42. s.setInt8(2, 128),
  43. s.setInt8(3, 129),
  44. s.setInt8(4, e),
  45. n.slice(0, 5)) : (s.setInt8(0, 2 + e & 255),
  46. s.setInt8(1, 2 + e >> 8 & 255),
  47. s.setInt8(2, 128),
  48. s.setInt8(3, e),
  49. n.slice(0, 4)),
  50. a = _kcUtils2.default.byteArray2hexStr(t) + a) : 1 == r && (s.setInt8(0, 255 & e),
  51. s.setInt8(1, e >> 8 & 255),
  52. t = n.slice(0, 2),
  53. a = _kcUtils2.default.byteArray2hexStr(t) + a),
  54. a
  55. }
  56. function encode_GB(e) {
  57. var t = {}
  58. , a = _kcUtils2.default.getPagLenMax()
  59. , r = parseInt(e.length / 2 / a)
  60. , n = (e.length / 2 % a != 0 && (r += 1),
  61. new ArrayBuffer(10));
  62. new DataView(n);
  63. t.serviceCode = 0,
  64. t.serviceInfo = "encode ok",
  65. t.serviceData = {},
  66. t.serviceData.dataEncode = new Array;
  67. for (var s = 0; s < r - 1; s++)
  68. t.serviceData.dataEncode[s] = e.substr(s * a * 2, 2 * a),
  69. t.serviceData.dataEncode[s] = getGBFrame(t.serviceData.dataEncode[s], s, r);
  70. return t.serviceData.dataEncode[r - 1] = e.substring((r - 1) * a * 2),
  71. t.serviceData.dataEncode[r - 1] = getGBFrame(t.serviceData.dataEncode[r - 1], r - 1, r),
  72. t
  73. }
  74. function encode_WX(e, ST = "33") {
  75. for (var t = {}, a = _kcUtils2.default.getPagLenMax(), r = parseInt(e.length / 2 / a), n = (e.length / 2 % a != 0 && (r += 1),
  76. t.serviceCode = 0,
  77. t.serviceInfo = "encode ok",
  78. t.serviceData = {},
  79. t.serviceData.dataEncode = new Array,
  80. 0), n = 0; n < r - 1; n++)
  81. t.serviceData.dataEncode[n] = e.substr(n * a * 2, 2 * a),
  82. t.serviceData.dataEncode[n] = getWXFrame(t.serviceData.dataEncode[n], n, r, ST);
  83. return t.serviceData.dataEncode[r - 1] = e.substring((r - 1) * a * 2),
  84. t.serviceData.dataEncode[r - 1] = getWXFrame(t.serviceData.dataEncode[r - 1], r - 1, r, ST),
  85. t
  86. }
  87. function getWXFrame(rawData, currentFrameIndex, totalFrames, ST = "33") {
  88. // 初始化字节缓冲区和数据视图
  89. var buffer = new ArrayBuffer(10);
  90. var dataView = new DataView(buffer);
  91. var headerHex = "";
  92. var xorChecksum = 0;
  93. var SN = "01";
  94. var dataByteLength = rawData.length / 2; // 原始数据字节长度(16进制字符串长度/2)
  95. // --- 步骤1: 构建帧头序号 ---
  96. if (currentFrameIndex === 0) {
  97. // 首帧:序号 = 128 + (总帧数-1)
  98. dataView.setUint8(0, 128 + (totalFrames - 1 - currentFrameIndex) & 0xFF);
  99. } else {
  100. // 后续帧:序号 = (总帧数-1-当前帧索引)
  101. dataView.setUint8(0, (totalFrames - 1 - currentFrameIndex) & 0xFF);
  102. }
  103. headerHex = _kcUtils2.default.byteArray2hexStr(buffer).substring(0, 2);
  104. // --- 步骤2: 拼接基础协议头 ---
  105. var frameContent = ST + SN + // 协议标识(固定值)
  106. headerHex + // 帧序号(1字节)
  107. _kcUtils2.default.byte2hexStr(dataByteLength & 0xFF) + // 数据长度(1字节)
  108. rawData; // 原始数据
  109. // --- 步骤3: 计算异或校验值(从第2字节开始)---
  110. var byteArray = _kcUtils2.default.hexStr2byteArray(frameContent);
  111. for (var i = 1; i < byteArray.length; i++) {
  112. xorChecksum ^= byteArray[i];
  113. }
  114. frameContent += _kcUtils2.default.byte2hexStr(xorChecksum); // 附加校验值
  115. var fullFrameLength = byteArray.length + 1; // 包含校验后的总长度
  116. // --- 步骤4: 动态构造完整帧结构 ---
  117. if (fullFrameLength > 127) {
  118. // 长帧格式:0x80 + 低7位长度,后跟高位长度
  119. dataView.setUint8(0, 0x80 | (fullFrameLength & 0x7F));
  120. dataView.setUint8(1, fullFrameLength >>> 7);
  121. headerHex = _kcUtils2.default.byteArray2hexStr(buffer).substring(0, 4);
  122. var totalFrameSize = fullFrameLength + 15; // 数据长 + 固定头尾(8+4+3)
  123. dataView.setUint8(0, (totalFrameSize >>> 8) & 0xFF);
  124. dataView.setUint8(1, totalFrameSize & 0xFF);
  125. } else {
  126. // 短帧格式:直接写入长度
  127. dataView.setUint8(0, fullFrameLength & 0xFF);
  128. headerHex = _kcUtils2.default.byteArray2hexStr(buffer).substring(0, 2);
  129. var totalFrameSize = fullFrameLength + 14; // 数据长 + 固定头尾(8+4+2)
  130. dataView.setUint8(0, (totalFrameSize >>> 8) & 0xFF);
  131. dataView.setUint8(1, totalFrameSize & 0xFF);
  132. }
  133. // --- 步骤5: 组装最终帧(微信协议固定结构)---
  134. return "FE01" + // 帧起始标识(2字节)
  135. _kcUtils2.default.byteArray2hexStr(buffer).substring(0, 4) + // 动态长度字段(2-4字节)
  136. "753100000A0012" + // 固定协议头(微信设备标识,8字节)
  137. headerHex + // 动态帧头(序号+长度)
  138. frameContent + // 数据+校验
  139. "1800"; // 帧结束标识(2字节)
  140. }
  141. function getWXFrame1(e, t, a) {
  142. for (var r = e, n = new ArrayBuffer(10), s = new DataView(n), i = "", l = 0, e = e.length / 2, d = (0 == t ? s.setInt8(0, 128 + (a - 1 - t & 255)) : s.setInt8(0, a - 1 - t & 255),
  143. r = "3301" + (i = _kcUtils2.default.byteArray2hexStr(n).substring(0, 2)) + _kcUtils2.default.byte2hexStr(255 & e) + r,
  144. _kcUtils2.default.hexStr2byteArray(r)), c = 1; c < d.length; c++)
  145. l ^= d[c];
  146. r += _kcUtils2.default.byte2hexStr(l);
  147. var o, a = _kcUtils2.default.hexStr2byteArray(r).length;
  148. return 127 < a ? (s.setInt8(0, 128 + (a % 128 & 255)),
  149. s.setInt8(1, a / 128 & 255),
  150. i = _kcUtils2.default.byteArray2hexStr(n).substring(0, 4),
  151. s.setInt8(0, (o = a + 8 + 4 + 3) >> 8 & 255)) : (s.setInt8(0, 255 & a),
  152. i = _kcUtils2.default.byteArray2hexStr(n).substring(0, 2),
  153. s.setInt8(0, (o = a + 8 + 4 + 2) >> 8 & 255)),
  154. s.setInt8(1, 255 & o),
  155. r = "FE01" + _kcUtils2.default.byteArray2hexStr(n).substring(0, 4) + "753100000A0012" + i + r + "1800"
  156. }
  157. function getGBFrame(e, t, a) {
  158. for (var r = e, n = new ArrayBuffer(10), s = new DataView(n), i = 0, e = e.length / 2, l = (0 == t ? (s.setInt8(0, 128 + (a >> 8 & 255)),
  159. s.setInt8(1, 255 & a)) : (s.setInt8(0, t + 1 >> 8 & 255),
  160. s.setInt8(1, t + 1 & 255)),
  161. s.setInt8(2, 255 & e),
  162. a = _kcUtils2.default.byteArray2hexStr(n).substring(0, 6),
  163. _kcUtils2.default.hexStr2byteArray(r = "50" + a + r)), d = 0; d < l.length; d++)
  164. i ^= l[d];
  165. return r += _kcUtils2.default.byte2hexStr(i)
  166. }
  167. module.exports = {
  168. encode: encode
  169. };