|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- "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
- };
|