Ejemplo n.º 1
0
        /// <summary>
        /// 时间内完成调用
        /// </summary>
        /// <returns>true--结束本次传输</returns>
        private bool AckOnTime()
        {
            switch (stage)
            {
            case TransmitStage.Activity:
            {
                if (WriteFileActivityAckEvent != null)
                {
                    var e = new FileServerEventArgs <FileNr.FileWriteActivityAckPacket>("从机应答", FileNr.OperatSign.WriteFileActivityAck,
                                                                                        writeFileActivityAckPacket, ackPacket);
                    WriteFileActivityAckEvent(Thread.CurrentThread, e);
                }
                mRepeatCount = 0;
                stage        = TransmitStage.Transmission;

                transmitPacket          = packetManager.PacketCollect[ackCount];
                writeFileTransmitPacket = new FileWritePacket(0, 0, CauseOfTransmissionList.ActivationACK,
                                                              0, transmitPacket);



                return(false);
            }

            case TransmitStage.Transmission:
            {
                bool state = false;
                FileNr.FileTransmitDescription result = FileNr.FileTransmitDescription.UnknowError;
                //先检测确认包
                if ((transmitAckPacket.FragmentNum == packetManager.PacketCollect[ackCount].FragmentNum) &&
                    (transmitAckPacket.Result == FileNr.FileTransmitDescription.Success))
                {
                    result = FileNr.FileTransmitDescription.Success;
                    if (++ackCount < packetManager.PacketCollect.Count)
                    {
                        transmitPacket          = packetManager.PacketCollect[ackCount];
                        writeFileTransmitPacket = new FileWritePacket(0, 0, CauseOfTransmissionList.ActivationACK,
                                                                      0, transmitPacket);
                    }
                    else
                    {
                        state = true;
                    }
                    mRepeatCount = 0;
                }
                if (WriteFileTransmitAckEvent != null)
                {
                    var e = new FileServerEventArgs <FileNr.FileWriteThransmitAckPacket>("从机应答:" + result.ToString(), FileNr.OperatSign.WriteFileThransmitAck
                                                                                         , writeFileActivityAckPacket, null);
                    WriteFileTransmitAckEvent(Thread.CurrentThread, e);
                }
                return(state);
            }
            }



            return(true);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 时间内完成调用
        /// </summary>
        /// <returns>true--结束本次传输</returns>
        private bool AckOnTime()
        {
            switch (stage)
            {
            case TransmitStage.Activity:
            {
                if (ReadFileActivityAckEvent != null)
                {
                    var e = new FileServerEventArgs <FileNr.FileReadActivityAckPacket>("从机应答", FileNr.OperatSign.ReadFileActivityACK,
                                                                                       readFileActivityAckPacket, ackPacket);
                    ReadFileActivityAckEvent(Thread.CurrentThread, e);
                }
                mRepeatCount = 0;
                stage        = TransmitStage.Transmission;
                return(false);
            }

            case TransmitStage.Transmission:
            {
                var result = packetManager.AddPacketData(transmitPacket);
                if (result == FileNr.FileTransmitDescription.Success)
                {
                    var addPacket = new FileNr.FileReadThransmitAckPacket(packetManager.Attribute.ID,
                                                                          packetManager.CurrentPacket.FragmentNum, packetManager.CurrentPacket.Fllow);
                    readFileTransmitAckPacket = new FilePacket(0, 0, CauseOfTransmissionList.ActivationACK,
                                                               0, addPacket.GetPacketData());
                }
                else
                {
                    if (ReadFileTransmitAckEvent != null)
                    {
                        var e = new FileServerEventArgs <FileNr.FileReadThransmitAckPacket>("从机应答:" + result.ToString(), FileNr.OperatSign.ReadFileDataResponseACK,
                                                                                            readFileActivityAckPacket, null);
                        ReadFileTransmitAckEvent(Thread.CurrentThread, e);
                    }
                }
                mRepeatCount = 0;
                return(false);
            }
            }



            return(true);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 超时调用
        /// </summary>
        /// <returns>true-- 结束本次传输</returns>
        private bool AckOverTime()
        {
            string str   = "";
            bool   state = true;

            if (++mRepeatCount > mRepeatMaxCount)
            {
                str   = string.Format("从机应答超时,准备第{0}次重试.", mRepeatCount);
                state = true;
            }
            else
            {
                str   = string.Format("从机应答超时,重试{0}次,达到最大重试次数.", mRepeatCount);
                state = false;
            }
            switch (stage)
            {
            case TransmitStage.Activity:
            {
                if (ReadFileActivityAckEvent != null)
                {
                    var e = new FileServerEventArgs <FileNr.FileReadActivityAckPacket>(str, FileNr.OperatSign.ReadFileActivityACK,
                                                                                       readFileActivityAckPacket, ackPacket);
                    ReadFileActivityAckEvent(Thread.CurrentThread, e);
                }
                break;
            }

            case TransmitStage.Transmission:
            {
                if (ReadFileTransmitAckEvent != null)
                {
                    var e = new FileServerEventArgs <FileNr.FileReadThransmitAckPacket>(str, FileNr.OperatSign.ReadFileDataResponseACK,
                                                                                        readFileActivityAckPacket, null);
                    ReadFileTransmitAckEvent(Thread.CurrentThread, e);
                }
                break;
            }
            }

            return(state);
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 时间内完成调用
        /// </summary>
        /// <returns>true--结束本次传输</returns>
        private bool AckOnTime()
        {
            bool state = true;

            if (ackPacket.ResultSign == FileNr.FileResultSign.Success)
            {
                fileAttributeList.AddRange(ackPacket.FileAttributeList);
                if (ackPacket.Fllow == FileNr.FllowingFlag.Nothing)
                {
                    if (CallFileEndEvent != null)
                    {
                        CallFileEndEvent(this, new CallFileEndEventArgs("召唤目录传输完成", fileAttributeList));
                    }
                    state = false;
                }
                else
                {
                    //readFileDicrectoryPacket = new FileReadPacket(0,0, BasicElement.CauseOfTransmissionList.ActivationACK,)
                    readFileDicrectoryPacket = null;
                    state = true;
                }
            }
            else
            {
                state = true;
            }


            if (CallFileDirectoryEvent != null)
            {
                var e = new FileServerEventArgs <FileNr.FileDirectoryCalledAckPacket>("从机应答:" + ackPacket.ResultSign.ToString(), FileNr.OperatSign.ReadDirectoryACK,
                                                                                      readFileDicrectoryAckPacket, ackPacket);
                CallFileDirectoryEvent(Thread.CurrentThread, e);
            }


            return(state);
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 超时调用
        /// </summary>
        /// <returns>true-- 结束本次传输</returns>
        private bool AckOverTime()
        {
            string str   = "";
            bool   state = true;

            if (++mRepeatCount > mRepeatMaxCount)
            {
                str   = string.Format("从机应答超时,准备第{0}次重试.", mRepeatCount);
                state = true;
            }
            else
            {
                str   = string.Format("从机应答超时,重试{0}次,达到最大重试次数.", mRepeatCount);
                state = false;
            }
            if (CallFileDirectoryEvent != null)
            {
                var e = new FileServerEventArgs <FileNr.FileDirectoryCalledAckPacket>(str, FileNr.OperatSign.ReadDirectoryACK,
                                                                                      null, null);
                CallFileDirectoryEvent(Thread.CurrentThread, e);
            }
            return(state);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 检测数据
        /// </summary>
        /// <returns></returns>
        private bool CheckData()
        {
            try
            {
                var item = mReciveQuene.Dequeue();
                if (item.ASDU.InformationObject[2] != 2)//是否为文件传输包
                {
                    Console.WriteLine("不是文件传输包");
                    return(false);
                }

                switch (stage)
                {
                case TransmitStage.Activity:
                {
                    if (item.ASDU.InformationObject[3] != 8)        //是否为读文件激活确认
                    {
                        Console.WriteLine("不是写文件激活确认");
                        return(false);
                    }
                    var packet = new FileNr.FileWriteActivityAckPacket(item.PacketData, 0, (byte)item.PacketData.Length);
                    if (packet.Name != packetManager.Attribute.Name)
                    {
                        Console.WriteLine("名称不一致");
                        return(false);
                    }
                    if (packet.FileID != packetManager.Attribute.ID)
                    {
                        Console.WriteLine("ID不一致");
                        return(false);
                    }
                    writeFileActivityAckPacket = item;
                    ackPacket = packet;
                    return(true);
                }

                case TransmitStage.Transmission:
                {
                    if (item.ASDU.InformationObject[3] != 10)        //是否写文件传输确认
                    {
                        Console.WriteLine("不是写文件传输确认");
                        return(false);
                    }
                    var packet = new FileNr.FileWriteThransmitAckPacket(item.PacketData, 0);
                    if (packet.Result == FileNr.FileTransmitDescription.Success)
                    {
                        writeFileTransmitAckPacket = item;
                        transmitAckPacket          = packet;
                        return(true);
                    }
                    else
                    {
                        Console.WriteLine("ID不一致");
                        if (WriteFileTransmitAckEvent != null)
                        {
                            var e = new FileServerEventArgs <FileNr.FileWriteThransmitAckPacket>("从机应答:" + packet.Result.ToString(), FileNr.OperatSign.WriteFileThransmitAck
                                                                                                 , writeFileActivityAckPacket, null);
                            WriteFileTransmitAckEvent(Thread.CurrentThread, e);
                        }
                        return(false);
                    }
                }
                }

                return(false);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }