示例#1
0
        /// <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);
        }
示例#2
0
        /// <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);
        }
示例#3
0
        /// <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);
        }