Пример #1
0
        private Task sendPeerLocationPacketAsync()
        {
            var packet = new PeerLocationMessagePacket
            {
                IsListeningForTcpConnection = true,
                ListeningTcpPort            = Convert.ToUInt16(_networkService.LocalTcpListenPort),
                Type  = CitpPeerType.MediaServer,
                Name  = _device.PeerName,
                State = Status
            };

            return(_networkService.SendMulticastPacketAsync(packet));
        }
Пример #2
0
        private void receivedPeerLocationMessage(PeerLocationMessagePacket message, IpAddress remoteIp)
        {
            // Filter out the local CITP peer
            if (remoteIp == _nicAddress && message.Name == _device.PeerName && message.ListeningTcpPort == LocalTcpListenPort)
            {
                return;
            }

            var peer = Peers.FirstOrDefault(p => p.Ip.Equals(remoteIp) && p.Name == message.Name);

            if (peer == null)
            {
                peer = new CitpPeer(remoteIp, message.Name);
                _peers.Add(peer);
            }

            peer.Type  = message.Type;
            peer.State = message.State;
            peer.LastUpdateReceived = DateTime.Now;
        }
Пример #3
0
        public static CitpPacket FromByteArray(byte[] data, IpEndpoint?remoteEndpoint = null)
        {
            CitpPacket packet;

            var layerType = getLayerType(data);

            if (layerType == null)
            {
                var layerTypeArray = new byte[4];
                Buffer.BlockCopy(data, CitpContentTypePosition, layerTypeArray, 0, 4);
                throw new InvalidOperationException(
                          $"Unrecognised CITP content type: {Encoding.UTF8.GetString(layerTypeArray, 0, layerTypeArray.Length)}");
            }

            switch (layerType)
            {
            case CitpLayerType.PeerInformationLayer:
            {
                var messageType = PinfPacket.GetMessageType(data);

                if (messageType == null)
                {
                    var messageTypeArray = new byte[4];
                    Buffer.BlockCopy(data, PinfPacket.CitpMessageTypePosition, messageTypeArray, 0, 4);
                    throw new InvalidOperationException(
                              $"Unrecognised PING message type: {Encoding.UTF8.GetString(messageTypeArray, 0, messageTypeArray.Length)}");
                }

                switch (messageType)
                {
                case PinfMessageType.PeerLocationMessage:
                    packet = new PeerLocationMessagePacket();
                    break;

                case PinfMessageType.PeerNameMessage:
                    packet = new PeerNameMessagePacket();
                    break;

                default:
                    throw new NotImplementedException("Unimplemented PINF message type");
                }

                break;
            }

            case CitpLayerType.MediaServerExtensionsLayer:
            {
                var messageType = MsexPacket.GetMessageType(data);

                if (messageType == null)
                {
                    var messageTypeArray = new byte[4];
                    Buffer.BlockCopy(data, MsexPacket.CitpMessageTypePosition, messageTypeArray, 0, 4);
                    throw new InvalidOperationException(
                              $"Unrecognised MSEX message type: {Encoding.UTF8.GetString(messageTypeArray, 0, messageTypeArray.Length)}");
                }

                switch (messageType)
                {
                case MsexMessageType.ClientInformationMessage:
                    packet = new ClientInformationMessagePacket();
                    break;

                case MsexMessageType.ServerInformationMessage:
                    packet = new ServerInformationMessagePacket();
                    break;

                case MsexMessageType.NegativeAcknowledgeMessage:
                    packet = new NegativeAcknowledgeMessagePacket();
                    break;

                case MsexMessageType.LayerStatusMessage:
                    packet = new LayerStatusMessagePacket();
                    break;

                case MsexMessageType.GetElementLibraryInformationMessage:
                    packet = new GetElementLibraryInformationMessagePacket();
                    break;

                case MsexMessageType.ElementLibraryInformationMessage:
                    packet = new ElementLibraryInformationMessagePacket();
                    break;

                case MsexMessageType.ElementLibraryUpdatedMessage:
                    packet = new ElementLibraryUpdatedMessagePacket();
                    break;

                case MsexMessageType.GetElementInformationMessage:
                    packet = new GetElementInformationMessagePacket();
                    break;

                case MsexMessageType.MediaElementInformationMessage:
                    packet = new MediaElementInformationMessagePacket();
                    break;

                case MsexMessageType.EffectElementInformationMessage:
                    packet = new EffectElementInformationMessagePacket();
                    break;

                case MsexMessageType.GenericElementInformationMessage:
                    packet = new GenericElementInformationMessagePacket();
                    break;

                case MsexMessageType.GetElementLibraryThumbnailMessage:
                    packet = new GetElementLibraryThumbnailMessagePacket();
                    break;

                case MsexMessageType.ElementLibraryThumbnailMessage:
                    packet = new ElementLibraryThumbnailMessagePacket();
                    break;

                case MsexMessageType.GetElementThumbnailMessage:
                    packet = new GetElementThumbnailMessagePacket();
                    break;

                case MsexMessageType.ElementThumbnailMessage:
                    packet = new ElementThumbnailMessagePacket();
                    break;

                case MsexMessageType.GetVideoSourcesMessage:
                    packet = new GetVideoSourcesMessagePacket();
                    break;

                case MsexMessageType.RequestStreamMessage:
                    packet = new RequestStreamMessagePacket();
                    break;

                case MsexMessageType.StreamFrameMessage:
                    packet = new StreamFrameMessagePacket();
                    break;

                default:
                    throw new NotImplementedException("Unimplemented MSEX message type");
                }

                break;
            }

            default:
                throw new NotImplementedException("Unimplemented CITP content type");
            }



            using (var reader = new CitpBinaryReader(new MemoryStream(data)))
                packet.DeserializeFromStream(reader);

            packet.RemoteEndpoint = remoteEndpoint;

            return(packet);
        }