/// <summary> /// 所有包都能提取的信息 /// </summary> /// <param name="buffer"></param> /// <param name="offset"></param> /// <param name="type"></param> /// <returns></returns> private SmModel processPackage(byte[] buffer, int offset, SmPackageType type) { List <byte> byList = buffer.ToList(); byList = byList.GetRange(offset, byList.Count); var emSocket = new SmModel(type); //解码 emSocket.ModuleAddr = byList.GetRange(SmTool.GetSocketIndex(SmIndex.MachineAddrStart), (int)SmIndex.MacineAddrCount); emSocket.Cmd = byList[SmTool.GetSocketIndex(SmIndex.Cmd)]; emSocket.AimType = byList[SmTool.GetSocketIndex(SmIndex.AimType)]; emSocket.Buffer = buffer; return(emSocket); }
/// <summary> /// 将buffer里面的数据流入解码栈进行解码操作, /// 这是对外的接口 /// </summary> /// <param name="buffer"></param> /// <param name="offset"></param> /// <param name="count"></param> /// <returns></returns> public List <SmModel> ThroughAnalysisStack(byte[] buffer, int offset, int count) { List <SmModel> dataList = new List <SmModel>(); //从流中提取完整的包 var packageDictionary = processBuffer2(buffer, offset, count); List <byte[]> paramPackages = packageDictionary[SmPackageType.ParamPackage]; List <byte[]> heartbeatPackages = packageDictionary[SmPackageType.HeartbeatPackage]; List <byte[]> replayCmdPackages = packageDictionary[SmPackageType.ClientReplyCmd]; //采集参数包解码 paramPackages.ForEach(p => { try { SmModel data = processParamPackage(p, 0); dataList.Add(data); //打印错误包数据 } catch (Exception e) { var gap = 3600 * 24; StringBuilder strB = new StringBuilder(); for (int i = 0; i < buffer.Length; i++) { strB.Append("" + buffer[i].ToString("X2")); } Logger.Error("参数解码错误: bffer \r\n " + strB.ToString(), e, gap); } }); //心跳包解码 heartbeatPackages.ForEach(p => { SmModel data = processDecodeHeartbeatPackage(p, 0); dataList.Add(data); }); //命令回复包 replayCmdPackages.ForEach(p => { SmModel data = processDecodeClientReplyCmdPackage(p, 0); dataList.Add(data); }); //删除起始帧之前的帧 //减小内存开销 socketBuffer.ClearUntilByte(0, (byte)SmFrame.Start); return(dataList); }
/// <summary> /// 包解码 /// </summary> /// <param name="buffer"></param> /// <param name="offset"></param> /// <returns></returns> private SmModel processParamPackage(byte[] buffer, int offset) { List <byte> byList = buffer.ToList(); byList = byList.GetRange(offset, byList.Count); SmModel emSocket = processPackage(buffer, offset, SmPackageType.ParamPackage); //第一个数据长度起始位置 //为传感器地址 int cursor = (int)SmIndex.PropLength + offset; emSocket.SmParams = new List <SmParam>(); while (cursor < (byList.Count - 3)) { SmParam emSocketNormal = new SmParam(); //属性域长度 var propLen = byList[cursor]; //数据域长度 var dataLen = propLen - 4; //传感器地址 var sensorAddrBytes = byList.GetRange(cursor + 1, 2).ToArray().Reverse().ToArray(); var sensorAddr = BitConverter.ToInt16(sensorAddrBytes, 0); emSocketNormal.ParamCode = sensorAddr; //类型 var type = byList[cursor + 3]; emSocketNormal.DataType = type; //小数位 var floatPlace = byList[cursor + 4]; emSocketNormal.FloatPlace = floatPlace; //数据 emSocketNormal.Data = byList.GetRange(cursor + 5, dataLen).ToArray(); //指向下一个属性长度位置 emSocket.SmParams.Add(emSocketNormal); cursor += propLen + 1; } return(emSocket); }