Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

kcDataDecode.js 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. "use strict";
  2. var iPackageLen, _kcUtils = require("./kcUtils.js"), _kcUtils2 = _interopRequireDefault(_kcUtils);
  3. function _interopRequireDefault(t) {
  4. return t && t.__esModule ? t : {
  5. default: t
  6. }
  7. }
  8. var bleCount, rxCount = 0, strTemData = "", strRxBuffer = "", isPagFinish = true;
  9. function decode_GB(t) {
  10. var e = 0
  11. , a = {}
  12. , t = _kcUtils2.default.byteArray2hexStr(t)
  13. , r = (_kcUtils2.default.showLog("kc当前接受包的数据:", t),
  14. _kcUtils2.default.hexStr2byteArray(t));
  15. if (1 < r.byteLength && 80 == r[0] && 1 == isPagFinish ? (isPagFinish = !1,
  16. iPackageLen = r[3],
  17. strTemData = t) : strTemData += t,
  18. strTemData.length / 2 >= iPackageLen + 5) {
  19. rxCount += 1,
  20. isPagFinish = !0;
  21. var s = _kcUtils2.default.hexStr2byteArray(strTemData);
  22. _kcUtils2.default.showLog("接受完第", rxCount, "包数据,内容 ", strTemData);
  23. for (var i = 0; i < iPackageLen + 4; i++)
  24. e ^= s[i];
  25. if (s[strTemData.length / 2 - 1] != e)
  26. return _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!"),
  27. a.serviceCode = -1,
  28. a.serviceInfo = "校验错误。。。",
  29. a;
  30. 128 == (128 & s[1]) && (bleCount = ((127 & s[1]) << 8) + s[2],
  31. _kcUtils2.default.showLog("总共:", bleCount, "大包")),
  32. _kcUtils2.default.showLog("kc第", rxCount, " 包校验bcc:ok!"),
  33. strRxBuffer += strTemData.substring(8, strTemData.length - 2)
  34. }
  35. return bleCount <= rxCount ? (a.serviceCode = 0,
  36. a.serviceInfo = "数据接收完成!",
  37. a.serviceData = {},
  38. a.serviceData.strData = strRxBuffer) : (a.serviceCode = 1,
  39. a.serviceInfo = "数据接收中。。。"),
  40. a
  41. }
  42. function decode_WX(t) {
  43. // 初始化变量 e 为 0,用于后续计算或状态跟踪
  44. var e = 0;
  45. // 初始化一个空对象 a,用于存储后续处理的结果或状态
  46. var a = {};
  47. // 使用工具函数将字节数组 t 转换为十六进制字符串
  48. var tHexStr = _kcUtils2.default.byteArray2hexStr(t);
  49. // 打印当前接收到的数据包的十六进制字符串
  50. _kcUtils2.default.showLog("kc当前接受包的数据:", tHexStr);
  51. // 再将十六进制字符串转换回字节数组,并赋值给变量 r
  52. var r = _kcUtils2.default.hexStr2byteArray(tHexStr);
  53. // console.log(r);
  54. // 检查数据包的前两个字节是否符合特定格式,并处理数据包
  55. if (r.byteLength > 1 && r[0] === 254 && r[1] === 1 && isPagFinish) {
  56. // 如果数据包是新的,重置 isPagFinish 和相关变量
  57. isPagFinish = false;
  58. iPackageLen = (r[2] & 255) << 8;
  59. iPackageLen += r[3] & 255;
  60. strTemData = tHexStr;
  61. } else {
  62. // 如果数据包是分片的,追加到 strTemData
  63. strTemData += tHexStr;
  64. }
  65. // 如果已接收的数据长度大于或等于预期的数据包长度,开始解析
  66. if (strTemData.length / 2 >= iPackageLen) {
  67. console.log("大包长度:", iPackageLen, strTemData.length);
  68. isPagFinish = true;
  69. rxCount += 1;
  70. var s = _kcUtils2.default.hexStr2byteArray(strTemData);
  71. var r = {};
  72. var i = 0, o = 0;
  73. // 解析固定头部信息
  74. r.FixHead = {};
  75. r.FixHead.MagicNumber = strTemData.substr(2 * i, 2);
  76. r.FixHead.Ver = strTemData.substring(2 * ++i, 2);
  77. r.FixHead.Len = (s[++i] << 8) + s[i + 1];
  78. r.FixHead.CmdId = (s[i += 2] << 8) + s[i + 1];
  79. r.FixHead.Seq = (s[i += 2] << 8) + s[i + 1];
  80. i += 2;
  81. // 解析 ProtoBuf 的 BaseRequest 部分
  82. r.ProtoBuf = {};
  83. r.ProtoBuf.BaseRequest = {};
  84. r.ProtoBuf.BaseRequest.Mark = strTemData.substr(2 * i, 2);
  85. i++;
  86. o = 0;
  87. //解析 ProtoBuf 的 BaseRequest 部分长度
  88. o += s[i];
  89. r.ProtoBuf.BaseRequest.Data = strTemData.substr(2 * ++i, 2 * o);
  90. i += o;
  91. // 解析 ProtoBuf 的 Data 部分
  92. r.ProtoBuf.Data = {};
  93. r.ProtoBuf.Data.Mark = strTemData.substr(2 * i, 2);
  94. i++;
  95. o = 0;
  96. // 解析 ProtoBuf 的 Data 部分长度
  97. o += s[i];
  98. while (205 === s[i]) {
  99. if(1 === s[i + 1] && 51 === s[i + 2]){
  100. i++;
  101. }
  102. }
  103. r.ProtoBuf.Data.Data = strTemData.substr(2 * ++i, 2 * o);
  104. i += o;
  105. // 解析 ProtoBuf 的 DataType 部分
  106. r.ProtoBuf.DataType = {};
  107. r.ProtoBuf.DataType.Mark = strTemData.substr(2 * i, 2);
  108. i++;
  109. o = 0;
  110. o += s[i];
  111. i++;
  112. r.ProtoBuf.DataType.Varint = o;
  113. // 计算并校验数据包的校验和
  114. var n = _kcUtils2.default.hexStr2byteArray(r.ProtoBuf.Data.Data);
  115. for (var f = 1; f < n.byteLength - 1; f++) {
  116. e ^= n[f];
  117. }
  118. // 校验失败处理
  119. if (n[n.byteLength - 1] != e) {
  120. _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!");
  121. a.serviceCode = -1;
  122. a.serviceInfo = "校验错误。。。";
  123. return a;
  124. }
  125. // 检查并处理多包数据
  126. if (128 === (128 & n[2])) {
  127. bleCount = 1 + (127 & n[2]);
  128. _kcUtils2.default.showLog("总共:", bleCount, "大包");
  129. }
  130. strRxBuffer += r.ProtoBuf.Data.Data.substr(8, 2 * n[3]);
  131. // 打印调试信息
  132. console.log("kc第", rxCount, " 包校验bcc:ok!");
  133. _kcUtils2.default.showLog("接受完第", rxCount, "大包数据,内容 ", strTemData);
  134. }
  135. // 判断接收是否完成
  136. if (bleCount <= rxCount) {
  137. a.serviceCode = 0;
  138. a.serviceInfo = "数据接收完成!";
  139. a.serviceData = {};
  140. a.serviceData.strData = strRxBuffer;
  141. } else {
  142. a.serviceCode = 1;
  143. a.serviceInfo = "数据接收中。。。";
  144. }
  145. return a;
  146. }
  147. function init() {
  148. rxCount = iPackageLen = 0,
  149. isPagFinish = !(strRxBuffer = strTemData = "")
  150. }
  151. module.exports = {
  152. decode_GB: decode_GB,
  153. decode_WX: decode_WX,
  154. init: init
  155. };