private void MDnsDiscovery_ServiceAdded(object sender, ServiceAnnouncementEventArgs e)
        {
            if (CancelSsdpDiscoveryOnMDns)
            {
                ssdpCancellation.Cancel();
            }

            var report = ParseServiceAnnouncement(e.Announcement);

            Trace.WriteLine(report);
            OnDeviceDiscovered(new DeviceDiscoveryEventArgs(report));
        }
 private void MDnsDiscovery_ServiceChanged(object sender, ServiceAnnouncementEventArgs e)
 {
     Trace.WriteLine("Service changed.");
 }
Example #3
0
        private void MDnsDiscovery_ServiceAdded(object sender, ServiceAnnouncementEventArgs e)
        {

            IPAddress localInterface = IPAddress.Any;

            // Retrieve local interface address
            // TODO: This will need some IPv6 love at some point
            if (e.Announcement.NetworkInterface.Information.OperationalStatus == System.Net.NetworkInformation.OperationalStatus.Up)
            {
                var ipv4Addresses = e.Announcement.NetworkInterface.Information.GetIPProperties().UnicastAddresses.Where((ad) => ad.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork);
                localInterface = ipv4Addresses.FirstOrDefault().Address;
            }

            // Retrieve version string
            var versionTempString = e.Announcement.Txt.Where((kvp) => kvp.Contains("ve=")).FirstOrDefault();
            int versionNumber = 2;
            if (string.IsNullOrEmpty(versionTempString) == false)
            {
                versionNumber = int.Parse(versionTempString.Split('=')[1]);
            }

            // Retrieve device ID
            var idTempString = e.Announcement.Txt.Where((kvp) => kvp.Contains("id=")).FirstOrDefault();
            string Id = "";
            if (string.IsNullOrEmpty(idTempString) == false)
            {
                Id = idTempString.Split('=')[1];
            }
            else
            {
                // Log.Error(string.Format("Unable to get ID of device {0}", e.Announcement.Hostname));
                return;
            }

            // Optional: Verify that it's a Chromecast device
            var tempDeviceType = e.Announcement.Txt.Where((kvp) => kvp.Contains("md=")).FirstOrDefault();
            var deviceType = DeviceType.Generic;
            if (string.IsNullOrEmpty(tempDeviceType) == false && tempDeviceType.Split('=')[1] == "Chromecast")
            {
                deviceType = DeviceType.Chromecast;
            }
            else
            {
                deviceType = DeviceType.Generic;
            }


            // Build baseUrl
            // This might not be right as there URI scheme could be something else.
            var scheme = "http";
            var address = e.Announcement.Addresses.First();
            var port = e.Announcement.Port;
            var uri = new Uri(string.Format("{0}://{1}:{2}", scheme, address, port));

            var report = new ChromecastV2DeviceDiscoveryReportItem()
            {
                DeviceType = deviceType,
                Version = versionNumber,
                Id = Id,
                Name = e.Announcement.Hostname,
                Endpoint = new IPEndPoint(e.Announcement.Addresses.First(), e.Announcement.Port),
                Interface = localInterface,
                BaseUri = uri,
            };

            Trace.WriteLine(report);
            OnDeviceDiscovered(new DeviceDiscoveryEventArgs(report));
        }