예제 #1
0
 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();
     }
 }
예제 #2
0
        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());
        }