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.

kcDataDecode.js 9.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. "use strict";
  2. import { findVarint } from './protoBuffer.js';
  3. var iPackageLen, _kcUtils = require("./kcUtils.js"), _kcUtils2 = _interopRequireDefault(_kcUtils);
  4. function _interopRequireDefault(t) {
  5. return t && t.__esModule ? t : {
  6. default: t
  7. }
  8. }
  9. var bleCount, rxCount = 0, strTemData = "", strRxBuffer = "", isPagFinish = true;
  10. function decode_GB(t) {
  11. var e = 0
  12. , a = {}
  13. , t = _kcUtils2.default.byteArray2hexStr(t)
  14. , r = (_kcUtils2.default.showLog("kc当前接受包的数据:", t),
  15. _kcUtils2.default.hexStr2byteArray(t));
  16. if (1 < r.byteLength && 80 == r[0] && 1 == isPagFinish ? (isPagFinish = !1,
  17. iPackageLen = r[3],
  18. strTemData = t) : strTemData += t,
  19. strTemData.length / 2 >= iPackageLen + 5) {
  20. rxCount += 1,
  21. isPagFinish = !0;
  22. var s = _kcUtils2.default.hexStr2byteArray(strTemData);
  23. _kcUtils2.default.showLog("接受完第", rxCount, "包数据,内容 ", strTemData);
  24. for (var i = 0; i < iPackageLen + 4; i++)
  25. e ^= s[i];
  26. if (s[strTemData.length / 2 - 1] != e)
  27. return _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!"),
  28. a.serviceCode = -1,
  29. a.serviceInfo = "校验错误。。。",
  30. a;
  31. 128 == (128 & s[1]) && (bleCount = ((127 & s[1]) << 8) + s[2],
  32. _kcUtils2.default.showLog("总共:", bleCount, "大包")),
  33. _kcUtils2.default.showLog("kc第", rxCount, " 包校验bcc:ok!"),
  34. strRxBuffer += strTemData.substring(8, strTemData.length - 2)
  35. }
  36. return bleCount <= rxCount ? (a.serviceCode = 0,
  37. a.serviceInfo = "数据接收完成!",
  38. a.serviceData = {},
  39. a.serviceData.strData = strRxBuffer) : (a.serviceCode = 1,
  40. a.serviceInfo = "数据接收中。。。"),
  41. a
  42. }
  43. function decode_WX(inputData) {
  44. // 初始化变量
  45. var checksum = 0; // 校验变量
  46. var result = {}; // 返回的结果对象
  47. var hexString = _kcUtils2.default.byteArray2hexStr(inputData); // 将输入数据转换为16进制字符串
  48. var byteArray = _kcUtils2.default.hexStr2byteArray(hexString); // 转换为字节数组
  49. // 打印接收到的数据
  50. console.log("kc当前接受包的数据:", hexString);
  51. // 判断是否是大包开始
  52. if (
  53. byteArray.byteLength > 1 &&
  54. byteArray[0] === 254 && // 包头标识
  55. byteArray[1] === 1 && // 版本号
  56. isPagFinish === true // 是否为分页结束
  57. ) {
  58. isPagFinish = false; // 标记分页未完成
  59. iPackageLen = ((255 & byteArray[2]) << 8) + (255 & byteArray[3]); // 计算大包总长度
  60. strTemData = hexString; // 保存当前数据
  61. } else {
  62. // 如果是数据的续传部分
  63. strTemData += hexString; // 累加数据
  64. }
  65. // 如果接收的数据长度已达到或超过大包长度
  66. if (strTemData.length / 2 >= iPackageLen) {
  67. console.log("大包长度:", iPackageLen, strTemData.length);
  68. isPagFinish = true; // 标记分页完成
  69. rxCount += 1; // 接收到的包计数+1
  70. // 解析接收到的完整数据
  71. const completeData = _kcUtils2.default.hexStr2byteArray(strTemData);
  72. // 初始化解析对象
  73. let parsedData = {};
  74. let index = 0;
  75. // 解析固定头部
  76. const headFields = [
  77. // 魔数
  78. { key: "MagicNumber", size: 1 },
  79. // 版本号
  80. { key: "Ver", size: 1 },
  81. // 长度
  82. { key: "Len", size: 2 },
  83. // 命令ID
  84. { key: "CmdId", size: 2 },
  85. // 序列号
  86. { key: "Seq", size: 2 }
  87. ];
  88. // 解析固定头部
  89. parsedData.FixHead = {};
  90. headFields.forEach(field => {
  91. if (field.size === 1) {
  92. parsedData.FixHead[field.key] = completeData[index];
  93. index += 1;
  94. } else {
  95. parsedData.FixHead[field.key] = (completeData[index] << 8) + completeData[index + 1];
  96. index += 2;
  97. }
  98. });
  99. if(10001 == parsedData.FixHead["CmdId"] || 10003 == parsedData.FixHead["CmdId"]){
  100. console.log("FixHead[CmdId] ", parsedData.FixHead["CmdId"]);
  101. result.serviceCode = -2;
  102. result.serviceInfo = "忽略数据";
  103. return result;
  104. }
  105. // 解析 ProtoBuf 数据
  106. parsedData.ProtoBuf = {};
  107. parsedData.ProtoBuf.BaseRequest = {};
  108. parsedData.ProtoBuf.BaseRequest.Mark = strTemData.substr(2 * index, 2); // BaseRequest标记
  109. index++;
  110. // 解码 BaseRequest 数据长度
  111. var length = 0, shift = 0;
  112. while ((128 & completeData[index]) === 128) {
  113. length += (127 & completeData[index]) << (7 * shift);
  114. index++;
  115. shift++;
  116. }
  117. length += (127 & completeData[index]) << (7 * shift);
  118. index++;
  119. // 提取 BaseRequest 数据
  120. parsedData.ProtoBuf.BaseRequest.Data = strTemData.substr(2 * index, 2 * length);
  121. index += length;
  122. // 解析 Data 部分
  123. parsedData.ProtoBuf.Data = {};
  124. parsedData.ProtoBuf.Data.Mark = strTemData.substr(2 * index, 2); // Data标记
  125. index++;
  126. // 解码 Data 数据长度
  127. length = 0;
  128. shift = 0;
  129. const veLength = findVarint(completeData.slice(index, completeData.length));
  130. let tempLength = decodeVarint(veLength.varint);
  131. console.log("解码 Data 前:", completeData[index]);
  132. console.log("解码 Data index 前:", index);
  133. // 检查 length 是否超出范围
  134. if (index + tempLength > completeData.length) {
  135. veLength.endPos -= 1;
  136. veLength.varint = veLength.varint.slice(0, veLength.endPos);
  137. let tempVarint = encodeVarint(veLength.varint);
  138. length = decodeVarint(tempVarint);
  139. index += veLength.endPos;
  140. } else {
  141. while ((128 & completeData[index]) === 128) {
  142. length += (127 & completeData[index]) << (7 * shift);
  143. index++;
  144. shift++;
  145. }
  146. length += (127 & completeData[index]) << (7 * shift);
  147. index++;
  148. }
  149. console.log("解码 Data 后:", completeData[index]);
  150. console.log("解码 Data index 后:", index);
  151. // 提取 Data 数据
  152. parsedData.ProtoBuf.Data.Data = strTemData.substr(2 * index, 2 * length);
  153. index += length;
  154. // 解析 DataType 部分
  155. parsedData.ProtoBuf.DataType = {};
  156. parsedData.ProtoBuf.DataType.Mark = strTemData.substr(2 * index, 2); // DataType标记
  157. index++;
  158. // 解码 DataType 数据长度
  159. length = 0;
  160. shift = 0;
  161. while ((128 & completeData[index]) === 128) {
  162. length += (127 & completeData[index]) << (7 * shift);
  163. index++;
  164. shift++;
  165. }
  166. length += (127 & completeData[index]) << (7 * shift);
  167. index++;
  168. // 提取 Varint 数据
  169. parsedData.ProtoBuf.DataType.Varint = length;
  170. // 校验数据完整性
  171. var dataContent = _kcUtils2.default.hexStr2byteArray(parsedData.ProtoBuf.Data.Data);
  172. for (var i = 1; i < dataContent.byteLength - 1; i++) {
  173. checksum ^= dataContent[i]; // 计算校验和
  174. }
  175. if (dataContent[dataContent.byteLength - 1] !== checksum) {
  176. // 如果校验失败
  177. _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!");
  178. result.serviceCode = -1;
  179. result.serviceInfo = "bcc 校验错误。。。";
  180. return result;
  181. }
  182. // 如果校验成功,解析大包信息
  183. if ((128 & dataContent[2]) === 128) {
  184. bleCount = 1 + (127 & dataContent[2]); // 总包数
  185. _kcUtils2.default.showLog("总共:", bleCount, "大包");
  186. }
  187. // 累加接收到的有效数据
  188. strRxBuffer += parsedData.ProtoBuf.Data.Data.substr(8, 2 * dataContent[3]);
  189. console.log("kc第", rxCount, " 包校验bcc:ok!");
  190. _kcUtils2.default.showLog("接受完第", rxCount, "大包数据,内容 ", strTemData);
  191. }
  192. // 判断是否所有包接收完成
  193. if (bleCount <= rxCount) {
  194. result.serviceCode = 0; // 数据接收完成
  195. result.serviceInfo = "数据接收完成!";
  196. result.serviceData = { strData: strRxBuffer }; // 返回接收的数据
  197. } else {
  198. result.serviceCode = 1; // 数据接收中
  199. result.serviceInfo = "数据接收中。。。";
  200. }
  201. return result;
  202. }
  203. function init() {
  204. rxCount = iPackageLen = 0,
  205. isPagFinish = !(strRxBuffer = strTemData = "")
  206. }
  207. /**
  208. * 对单个数值进行 Varint 编码
  209. * @param {number} val - 要编码的值
  210. * @returns {number[]} - 编码后的字节数组
  211. */
  212. function encodeSingleValue(val) {
  213. const bytes = [];
  214. while (val >= 0x80) {
  215. // 提取低 7 位,加上最高位 1
  216. bytes.push((val & 0x7F) | 0x80);
  217. val >>= 7; // 右移 7 位
  218. }
  219. // 添加最后一个字节,最高位为 0
  220. bytes.push(val & 0x7F);
  221. return bytes;
  222. }
  223. /**
  224. * 对单个值或 Uint8Array 进行 Varint 编码
  225. * @param {number|Uint8Array} value - 要编码的值,可以是单个数值或 Uint8Array
  226. * @returns {Uint8Array} - 编码后的字节流
  227. */
  228. function encodeVarint(value) {
  229. // 如果是 Uint8Array 类型
  230. if (value instanceof Uint8Array) {
  231. const result = [];
  232. for (const v of value) {
  233. result.push(...encodeSingleValue(v)); // 对每个字节进行编码
  234. }
  235. return new Uint8Array(result); // 返回 Uint8Array 类型的结果
  236. }
  237. // 如果是单个值,直接编码
  238. if (typeof value === 'number') {
  239. return new Uint8Array(encodeSingleValue(value));
  240. }
  241. // 其他类型不支持,抛出错误
  242. throw new TypeError("Input must be a number or a Uint8Array.");
  243. }
  244. function encodeVarint1(value) {
  245. const bytes = [];
  246. while (value >= 0x80) {
  247. // 提取低 7 位,加上最高位 1
  248. bytes.push((value & 0x7F) | 0x80);
  249. value >>= 7; // 右移 7 位
  250. }
  251. // 添加最后一个字节,最高位为 0
  252. bytes.push(value & 0x7F);
  253. return bytes;
  254. }
  255. function decodeVarint(bytes) {
  256. let result = 0;
  257. let shift = 0;
  258. for (let i = 0; i < bytes.length; i++) {
  259. const byte = bytes[i];
  260. // 提取低 7 位并合成结果
  261. result |= (byte & 0x7F) << shift;
  262. // 如果最高位是 0,结束解码
  263. if ((byte & 0x80) === 0) {
  264. break;
  265. }
  266. shift += 7;
  267. }
  268. return result;
  269. }
  270. module.exports = {
  271. decode_GB: decode_GB,
  272. decode_WX: decode_WX,
  273. init: init
  274. };