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); }
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); }
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())); }