Beispiel #1
0
        public static SaiFrame Parse(byte[] bytes)
        {
            SaiFrame theFrame = null;

            var theFrameType = (SaiFrameType)bytes[0];

            if (theFrameType == SaiFrameType.TTS_OffsetStart)
            {
                theFrame = new SaiTtsFrameOffsetStart();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetAnswer1)
            {
                theFrame = new SaiTtsFrameOffsetAnswer1();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetAnswer2)
            {
                theFrame = new SaiTtsFrameOffsetAnswer2();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetEstimate)
            {
                theFrame = new SaiTtsFrameEstimate();
            }
            else if (theFrameType == SaiFrameType.TTS_OffsetEnd)
            {
                theFrame = new SaiTtsFrameOffsetEnd();
            }
            else if (theFrameType == SaiFrameType.TTS_AppData)
            {
                theFrame = new SaiTtsFrameAppData();
            }
            else if (theFrameType == SaiFrameType.EC_Start)
            {
                theFrame = new SaiEcFrameStart();
            }
            else if (theFrameType == SaiFrameType.EC_AppData)
            {
                theFrame = new SaiEcFrameApplication();
            }
            else if (theFrameType == SaiFrameType.EC_AppDataAskForAck)
            {
                theFrame = new SaiEcFrameAskForAck();
            }
            else if (theFrameType == SaiFrameType.EC_AppDataAcknowlegment)
            {
                theFrame = new SaiEcFrameAcknowlegment();
            }
            else
            {
                throw new InvalidOperationException(string.Format("无法解析指定的Sai帧,不可识别的类型{0}。", theFrameType));
            }

            theFrame.ParseBytes(bytes);

            return(theFrame);
        }
Beispiel #2
0
        protected void SendEcStartFrame()
        {
            // 发送EC Start Frame.
            var initValue  = this.DefenseStrategy.GetLocalEcValue();
            var ecInterval = this.Context.RsspEP.EcInterval;
            var seqNo      = (ushort)this.Context.SeqNoManager.GetAndUpdateSendSeq();
            var frame      = new SaiEcFrameStart(seqNo, initValue, 1, ecInterval);

            var bytes = frame.GetBytes();

            this.Context.NextLayer.SendUserData(bytes);
        }
        protected override void HandleEcStartFrame(SaiEcFrameStart frame)
        {
            // 主动方关闭EC Tsync.
            this.Context.StopHandshakeTimer();
            LogUtility.Info(string.Format("{0}: 主动方收到EcStart2,关闭Tsync。新状态:EcConnectedState",
                                          this.Context.RsspEP.ID));

            // 启动Remote EcCounter。
            this.DefenseStrategy.StartRemoteCounter(this.Context.RsspEP.RemoteID, frame.Interval, frame.InitialValue);

            // 设置下一状态为EcConnectedState
            this.Context.CurrentState = new EcConnectedState(this);

            //
            this.Context.Connected = true;
        }
        public void Test1()
        {
            var frame1 = new SaiEcFrameStart();

            frame1.SequenceNo   = 200;
            frame1.Version      = 1;
            frame1.InitialValue = 100;
            frame1.Interval     = 1000;

            var bytes = frame1.GetBytes();

            var frame2 = SaiFrame.Parse(bytes) as SaiEcFrameStart;

            Assert.AreEqual(SaiFrameType.EC_Start, frame2.FrameType);
            Assert.AreEqual(frame2.Version, frame1.Version);
            Assert.AreEqual(frame2.SequenceNo, frame1.SequenceNo);
            Assert.AreEqual(frame2.InitialValue, frame1.InitialValue);
            Assert.AreEqual(frame2.Interval, frame1.Interval);
        }
Beispiel #5
0
 protected virtual void HandleEcStartFrame(SaiEcFrameStart ecStartFrame)
 {
     LogUtility.Error(string.Format("{0}: {1}.{2} not implement!",
                                    this.Context.RsspEP.ID, this.GetType().Name,
                                    new StackFrame(0).GetMethod().Name.Split('.').Last()));
 }