private void OnServiceAdded(object sender, ServiceAnnouncementEventArgs e) { ServiceAddedSemaphoreSlim.Wait(); try { var txtValues = e.Announcement.Txt .Select(i => i.Split('=')) .ToDictionary(y => y[0], y => y[1]); if (!txtValues.ContainsKey("fn")) { return; } var ip = e.Announcement.Addresses[0]; Uri.TryCreate("https://" + ip, UriKind.Absolute, out Uri myUri); var chromecast = new ChromecastReceiver { DeviceUri = myUri, Name = txtValues["fn"], Model = txtValues["md"], Version = txtValues["ve"], ExtraInformation = txtValues, Status = txtValues["rs"], Port = e.Announcement.Port }; ChromecastReceivedFound?.Invoke(this, chromecast); DiscoveredDevices.Add(chromecast); } finally { ServiceAddedSemaphoreSlim.Release(); } }
public async Task <ChromecastStatus> ConnectChromecast(ChromecastReceiver chromecastReceiver) { await Dispose(); _receiver = chromecastReceiver; _client = new TcpClient(); await _client.ConnectAsync(chromecastReceiver.DeviceUri.Host, chromecastReceiver.Port); //Open SSL stream to Chromecast and bypass all SSL validation var secureStream = new SslStream(_client.GetStream(), true, (sender, certificate, chain, sslPolicyErrors) => true); await secureStream.AuthenticateAsClientAsync(chromecastReceiver.DeviceUri.Host); _stream = secureStream; ReceiveTcs = new TaskCompletionSource <bool>(); Receive(); await GetChannel <IConnectionChannel>().ConnectAsync(); return(await GetChannel <IReceiverChannel>().GetChromecastStatusAsync()); }