Ejemplo n.º 1
0
        private async void UnicastLocalSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
        {
            string address = $"{args.RemoteAddress.CanonicalName}:{args.RemotePort}";
            var    reader  = args.GetDataReader();
            var    data    = reader.ReadString(reader.UnconsumedBufferLength);

            logger.WriteLine($"UNICAST ControlPoint [{address}]\n{data}");
            try
            {
                SsdpMessage ssdpMessage = new SsdpMessage(data);

                if (!TryFindNetworkAdapterInfoByIp(args.RemoteAddress.CanonicalName, out NetworkAdapterInfo network))
                {
                    logger.WriteLine($"Network for ip {args.RemoteAddress.CanonicalName} not found");
                    return;
                }

                Device device = Device.ConstructDevice(args.RemoteAddress, network.NetworkAdapter.NetworkAdapterId, ssdpMessage);
                await RegisterDevice(device);
            }
            catch (InvalidMessageException e)
            {
                logger.WriteLine($"Invalid ssdp message:\n{e.ToString()}");
            }
        }
Ejemplo n.º 2
0
        private async Task <uint> SendSearchDevicesRequest(SsdpMessage request, CancellationToken token)
        {
            token.ThrowIfCancellationRequested();
            var outputStream = await unicastLocalSocket.GetOutputStreamAsync(Constants.SSDP_HOST, Constants.SSDP_PORT);

            var writer = new DataWriter(outputStream);

            writer.WriteString(request.ToString());
            return(await writer.StoreAsync());
        }
Ejemplo n.º 3
0
        private async void MulticastSsdpSocket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args)
        {
            string address = $"{args.RemoteAddress.CanonicalName}:{args.RemotePort}";
            var    reader  = args.GetDataReader();
            var    data    = reader.ReadString(reader.UnconsumedBufferLength);

            try
            {
                var ssdpMessage = new SsdpMessage(data);
                if (Target != "ssdp:all")
                {
                    if (ssdpMessage.NT != Target)
                    {
                        return;
                    }
                }

                if (!TryFindNetworkAdapterInfoByIp(args.RemoteAddress.CanonicalName, out NetworkAdapterInfo network))
                {
                    logger.WriteLine($"Network for ip {args.RemoteAddress.CanonicalName} not found");
                    return;
                }

                if (ssdpMessage.Type == SsdpMessageType.AdvertiseAlive)
                {
                    var device = Device.ConstructDevice(args.RemoteAddress, network.NetworkAdapter.NetworkAdapterId, ssdpMessage);
                    await RegisterDevice(device);
                }
                if (ssdpMessage.Type == SsdpMessageType.AdvertiseByeBye)
                {
                    var device = Device.ConstructDevice(args.RemoteAddress, network.NetworkAdapter.NetworkAdapterId, ssdpMessage);
                    await UnregisterDevice(device);
                }
            }
            catch (InvalidMessageException e)
            {
                logger.WriteLine($"Invalid ssdp message:\n{e.ToString()}");
            }
        }
Ejemplo n.º 4
0
        private async Task RespondToSearch(HostName host, string port)
        {
            SsdpMessage searchResponse = new SsdpMessage
            {
                Type              = SsdpMessageType.SearchResponse,
                CacheControl      = "max-age = 30",
                Date              = DateTimeOffset.UtcNow,
                Server            = Name,
                ST                = Target,
                USN               = USN,
                AdditionalHeaders = new Dictionary <string, string> {
                    { "PORT", Port.ToString() }
                },
            };

            var unicastSocket = new DatagramSocket();
            var outputStream  = await unicastSocket.GetOutputStreamAsync(host, port);

            var writer = new DataWriter(outputStream);

            writer.WriteString(searchResponse.ToString());
            await writer.StoreAsync();
        }
Ejemplo n.º 5
0
        public IAsyncOperation <uint> AdvertiseByeBye()
        {
            return(Task.Run(async() =>
            {
                SsdpMessage request = new SsdpMessage
                {
                    Type = SsdpMessageType.AdvertiseByeBye,
                    Host = Constants.SSDP_ADDRESS,
                    NT = Target,
                    NTS = "ssdp:byebye",
                    Server = Name,
                    USN = USN,
                    AdditionalHeaders = new Dictionary <string, string> {
                        { "PORT", Port.ToString() }
                    },
                };

                var outputStream = await multicastSsdpSocket.GetOutputStreamAsync(Constants.SSDP_HOST, Constants.SSDP_PORT);
                var writer = new DataWriter(outputStream);
                writer.WriteString(request.ToString());
                return await writer.StoreAsync();
            }).AsAsyncOperation());
        }
Ejemplo n.º 6
0
        public IAsyncOperation <uint> SearchDevices()
        {
            var cancellationTokenSource = new CancellationTokenSource();
            var token = cancellationTokenSource.Token;

            return(Task.Run(async() =>
            {
                var searchRequest = new SsdpMessage
                {
                    Type = SsdpMessageType.SearchRequest,
                    Host = Constants.SSDP_ADDRESS,
                    MAN = "ssdp:discover",
                    MX = "1",
                    ST = Target,
                };

                await SendSearchDevicesRequest(searchRequest, token);
                await Task.Delay(1000);
                await SendSearchDevicesRequest(searchRequest, token);
                await Task.Delay(1000);
                return await SendSearchDevicesRequest(searchRequest, token);
            }, token).AsAsyncOperation());
        }