コード例 #1
0
        private void Receive(IAsyncResult ar)
        {
            if (_udpClient == null)
            {
                return;
            }

            IPEndPoint ip    = new IPEndPoint(IPAddress.Any, 0);
            var        bytes = _udpClient.EndReceive(ar, ref ip);

            using (var reader = new BinaryReader(new MemoryStream(bytes)))
            {
                PDUHeader pdu = new PDUHeader();
                PDUEncoder.Decode(pdu, reader);

                if (pdu.ExerciseId == ExerciseID)
                {
                    var pduType = pdu.PDUType;
                    PDUTypeContainer pduContainer;
                    if (_pdusContainers.TryGetValue(pduType, out pduContainer))
                    {
                        pduContainer.EnqueueIncomingPDU(reader);
                    }
                }
            }

            _udpClient.BeginReceive(Receive, null);
        }
コード例 #2
0
        public void SendPDU(PDU pdu)
        {
            using (var stream = new MemoryStream())
            {
                using (var writer = new BinaryWriter(stream))
                {
                    var header = new PDUHeader()
                    {
                        ProtocolVersion    = 7,
                        ExerciseId         = ExerciseID,
                        PDUType            = pdu.PDUType,
                        ProtocolFamilyType = 1,
                        TimeStamp          = _currentTimeStamp
                    };

                    header.PDULength = (ushort)(PDUEncoder.Size(header) + PDUEncoder.Size(pdu));

                    PDUEncoder.Encode(header, writer);
                    PDUEncoder.Encode(pdu, writer);

                    var bytes = stream.ToArray();
                    _udpClient.Send(bytes, bytes.Length, _broadcastEndpoint);
                }
            }
        }
コード例 #3
0
            public void EnqueueIncomingPDU(BinaryReader reader)
            {
                var pdu = (PDU)Activator.CreateInstance(_type);

                PDUEncoder.Decode(pdu, reader);
                _incomingPDUsQueue.Enqueue(pdu);
            }
コード例 #4
0
        public static void Decode(IPDUEncodable target, BinaryReader reader)
        {
            PDUEncoder pduEncoder = new PDUEncoder();

            pduEncoder._state  = OperateState.Read;
            pduEncoder._reader = reader;
            target.Operate(pduEncoder);
        }
コード例 #5
0
        public static void Encode(IPDUEncodable target, BinaryWriter writer)
        {
            PDUEncoder pduEncoder = new PDUEncoder();

            pduEncoder._state  = OperateState.Write;
            pduEncoder._writer = writer;
            target.Operate(pduEncoder);
        }
コード例 #6
0
        public static int Size(IPDUEncodable target)
        {
            PDUEncoder pduEncoder = new PDUEncoder();

            pduEncoder._state = OperateState.Size;
            pduEncoder._size  = 0;
            target.Operate(pduEncoder);
            return(pduEncoder._size);
        }
コード例 #7
0
ファイル: PDUsStructs.cs プロジェクト: DuckbearLab/UniSim
 public void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref ProtocolVersion);
     pduEncoder.Operate(ref ExerciseId);
     pduEncoder.OperateEnumByte(ref PDUType);
     pduEncoder.Operate(ref ProtocolFamilyType);
     pduEncoder.Operate(ref TimeStamp);
     pduEncoder.Operate(ref PDULength);
     pduEncoder.Padding(2);
 }
コード例 #8
0
ファイル: PDUsStructs.cs プロジェクト: DuckbearLab/UniSim
 public void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref Kind);
     pduEncoder.Operate(ref Domain);
     pduEncoder.Operate(ref Country);
     pduEncoder.Operate(ref Category);
     pduEncoder.Operate(ref Subcategory);
     pduEncoder.Operate(ref Specific);
     pduEncoder.Operate(ref Extra);
 }
コード例 #9
0
ファイル: PDUs.cs プロジェクト: DuckbearLab/UniSim
 public override void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref OriginatingEntityID);
     pduEncoder.Operate(ref ReceivingEntityID);
     pduEncoder.Operate(ref EventType);
     pduEncoder.Padding(4);
     pduEncoder.OperateListSize32(ref FixedDatumRecords);
     pduEncoder.OperateListSize32(ref VariableDatumRecords);
     pduEncoder.Operate(ref FixedDatumRecords);
     pduEncoder.Operate(ref VariableDatumRecords);
 }
コード例 #10
0
ファイル: PDUs.cs プロジェクト: DuckbearLab/UniSim
 public override void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref FiringEntityId);
     pduEncoder.Operate(ref TargetEntityId);
     pduEncoder.Operate(ref MunitionId);
     pduEncoder.Operate(ref EventId);
     pduEncoder.Operate(ref FireMissionIndex);
     pduEncoder.Operate(ref Location);
     pduEncoder.Operate(ref BurstDescriptor);
     pduEncoder.Operate(ref Velocity);
     pduEncoder.Operate(ref Range);
 }
コード例 #11
0
ファイル: PDUs.cs プロジェクト: DuckbearLab/UniSim
 public override void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref FiringEntityId);
     pduEncoder.Operate(ref TargetEntityId);
     pduEncoder.Operate(ref MunitionId);
     pduEncoder.Operate(ref EventId);
     pduEncoder.Operate(ref Velocity);
     pduEncoder.Operate(ref Location);
     pduEncoder.Operate(ref BurstDescriptor);
     pduEncoder.Operate(ref LocationInEntityCoordinates);
     pduEncoder.OperateEnumByte(ref DetonationResult);
     pduEncoder.OperateArraySize(ref ArticulationParameters);
     pduEncoder.Padding(2);
     pduEncoder.Operate(ref ArticulationParameters);
 }
コード例 #12
0
ファイル: PDUs.cs プロジェクト: DuckbearLab/UniSim
 public override void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref EntityId);
     pduEncoder.Operate(ref ForceId);
     pduEncoder.OperateArraySize(ref ArticulatedParts);
     pduEncoder.Operate(ref EntityType);
     pduEncoder.Operate(ref AlternativeEntityType);
     pduEncoder.Operate(ref LinearVelocity);
     pduEncoder.Operate(ref Location);
     pduEncoder.Operate(ref Orientation);
     pduEncoder.Operate(ref Appearance);
     pduEncoder.Operate(ref DeadRecokning);
     pduEncoder.Operate(ref MarkingText);
     pduEncoder.Operate(ref Capabilities);
     pduEncoder.Operate(ref ArticulatedParts);
 }
コード例 #13
0
ファイル: PDUsStructs.cs プロジェクト: DuckbearLab/UniSim
 public void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref Site);
     pduEncoder.Operate(ref Application);
     pduEncoder.Operate(ref Entity);
 }
コード例 #14
0
ファイル: PDUsStructs.cs プロジェクト: DuckbearLab/UniSim
 public void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref BitValue);
 }
コード例 #15
0
ファイル: PDUsStructs.cs プロジェクト: DuckbearLab/UniSim
 public void Operate(PDUEncoder pduEncoder)
 {
     pduEncoder.Operate(ref X);
     pduEncoder.Operate(ref Y);
     pduEncoder.Operate(ref Z);
 }
コード例 #16
0
ファイル: PDUs.cs プロジェクト: DuckbearLab/UniSim
 public abstract void Operate(PDUEncoder pduEncoder);