"use strict"; var iPackageLen, _kcUtils = require("./kcUtils.js"), _kcUtils2 = _interopRequireDefault(_kcUtils); function _interopRequireDefault(t) { return t && t.__esModule ? t : { default: t } } var bleCount, rxCount = 0, strTemData = "", strRxBuffer = "", isPagFinish = true; function decode_GB(t) { var e = 0 , a = {} , t = _kcUtils2.default.byteArray2hexStr(t) , r = (_kcUtils2.default.showLog("kc当前接受包的数据:", t), _kcUtils2.default.hexStr2byteArray(t)); if (1 < r.byteLength && 80 == r[0] && 1 == isPagFinish ? (isPagFinish = !1, iPackageLen = r[3], strTemData = t) : strTemData += t, strTemData.length / 2 >= iPackageLen + 5) { rxCount += 1, isPagFinish = !0; var s = _kcUtils2.default.hexStr2byteArray(strTemData); _kcUtils2.default.showLog("接受完第", rxCount, "包数据,内容 ", strTemData); for (var i = 0; i < iPackageLen + 4; i++) e ^= s[i]; if (s[strTemData.length / 2 - 1] != e) return _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!"), a.serviceCode = -1, a.serviceInfo = "校验错误。。。", a; 128 == (128 & s[1]) && (bleCount = ((127 & s[1]) << 8) + s[2], _kcUtils2.default.showLog("总共:", bleCount, "大包")), _kcUtils2.default.showLog("kc第", rxCount, " 包校验bcc:ok!"), strRxBuffer += strTemData.substring(8, strTemData.length - 2) } return bleCount <= rxCount ? (a.serviceCode = 0, a.serviceInfo = "数据接收完成!", a.serviceData = {}, a.serviceData.strData = strRxBuffer) : (a.serviceCode = 1, a.serviceInfo = "数据接收中。。。"), a } function decode_WX(t) { // 初始化变量 e 为 0,用于后续计算或状态跟踪 var e = 0; // 初始化一个空对象 a,用于存储后续处理的结果或状态 var a = {}; // 使用工具函数将字节数组 t 转换为十六进制字符串 var tHexStr = _kcUtils2.default.byteArray2hexStr(t); // 打印当前接收到的数据包的十六进制字符串 _kcUtils2.default.showLog("kc当前接受包的数据:", tHexStr); // 再将十六进制字符串转换回字节数组,并赋值给变量 r var r = _kcUtils2.default.hexStr2byteArray(tHexStr); // console.log(r); // 检查数据包的前两个字节是否符合特定格式,并处理数据包 if (r.byteLength > 1 && r[0] === 254 && r[1] === 1 && isPagFinish) { // 如果数据包是新的,重置 isPagFinish 和相关变量 isPagFinish = false; iPackageLen = (r[2] & 255) << 8; iPackageLen += r[3] & 255; strTemData = tHexStr; } else { // 如果数据包是分片的,追加到 strTemData strTemData += tHexStr; } // 如果已接收的数据长度大于或等于预期的数据包长度,开始解析 if (strTemData.length / 2 >= iPackageLen) { console.log("大包长度:", iPackageLen, strTemData.length); isPagFinish = true; rxCount += 1; var s = _kcUtils2.default.hexStr2byteArray(strTemData); var r = {}; var i = 0, o = 0; // 解析固定头部信息 r.FixHead = {}; r.FixHead.MagicNumber = strTemData.substr(2 * i, 2); r.FixHead.Ver = strTemData.substring(2 * ++i, 2); r.FixHead.Len = (s[++i] << 8) + s[i + 1]; r.FixHead.CmdId = (s[i += 2] << 8) + s[i + 1]; r.FixHead.Seq = (s[i += 2] << 8) + s[i + 1]; i += 2; // 解析 ProtoBuf 的 BaseRequest 部分 r.ProtoBuf = {}; r.ProtoBuf.BaseRequest = {}; r.ProtoBuf.BaseRequest.Mark = strTemData.substr(2 * i, 2); i++; o = 0; //解析 ProtoBuf 的 BaseRequest 部分长度 o += s[i]; r.ProtoBuf.BaseRequest.Data = strTemData.substr(2 * ++i, 2 * o); i += o; // 解析 ProtoBuf 的 Data 部分 r.ProtoBuf.Data = {}; r.ProtoBuf.Data.Mark = strTemData.substr(2 * i, 2); i++; o = 0; // 解析 ProtoBuf 的 Data 部分长度 o += s[i]; while (205 === s[i]) { if(1 === s[i + 1] && 51 === s[i + 2]){ i++; } } r.ProtoBuf.Data.Data = strTemData.substr(2 * ++i, 2 * o); i += o; // 解析 ProtoBuf 的 DataType 部分 r.ProtoBuf.DataType = {}; r.ProtoBuf.DataType.Mark = strTemData.substr(2 * i, 2); i++; o = 0; o += s[i]; i++; r.ProtoBuf.DataType.Varint = o; // 计算并校验数据包的校验和 var n = _kcUtils2.default.hexStr2byteArray(r.ProtoBuf.Data.Data); for (var f = 1; f < n.byteLength - 1; f++) { e ^= n[f]; } // 校验失败处理 if (n[n.byteLength - 1] != e) { _kcUtils2.default.showError("kc第", rxCount, " 包校验bcc:Error!"); a.serviceCode = -1; a.serviceInfo = "校验错误。。。"; return a; } // 检查并处理多包数据 if (128 === (128 & n[2])) { bleCount = 1 + (127 & n[2]); _kcUtils2.default.showLog("总共:", bleCount, "大包"); } strRxBuffer += r.ProtoBuf.Data.Data.substr(8, 2 * n[3]); // 打印调试信息 console.log("kc第", rxCount, " 包校验bcc:ok!"); _kcUtils2.default.showLog("接受完第", rxCount, "大包数据,内容 ", strTemData); } // 判断接收是否完成 if (bleCount <= rxCount) { a.serviceCode = 0; a.serviceInfo = "数据接收完成!"; a.serviceData = {}; a.serviceData.strData = strRxBuffer; } else { a.serviceCode = 1; a.serviceInfo = "数据接收中。。。"; } return a; } function init() { rxCount = iPackageLen = 0, isPagFinish = !(strRxBuffer = strTemData = "") } module.exports = { decode_GB: decode_GB, decode_WX: decode_WX, init: init };