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