예제 #1
0
        private void Discover()
        {
            ServiceDiscovery sd = new ServiceDiscovery(mdns);

            mdns.NetworkInterfaceDiscovered += (s, e) =>
            {
                foreach (var networkInterface in e.NetworkInterfaces)
                {
                    logger.Info($"Network-Interface: '{networkInterface.Name}' found");
                }
            };

            sd.ServiceDiscovered         += Sd_ServiceDiscovered;
            sd.ServiceInstanceDiscovered += Sd_ServiceInstanceDiscovered;
            sd.ServiceInstanceShutdown   += Sd_ServiceInstanceShutdown;

            try
            {
                mdns.Start();

                cancellationToken = new CancellationTokenSource();
                while (!cancellationToken.IsCancellationRequested)
                {
                    sd.QueryAllServices();
                    Thread.Sleep(DISCOVER_THREAD_DELAY);
                }
            }
            finally
            {
                sd.Dispose();
                mdns.Stop();
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!_disposedValue)
            {
                if (disposing)
                {
                    _mdns.Dispose();
                    _sd.Dispose();
                }

                _disposedValue = true;
            }
        }
예제 #3
0
        public sealed override void RefreshSystem()
        {
            var sd = DataUtil.GetSystemData();

            _devMode  = sd.DeviceMode;
            _hostName = _sd.DeviceName;
            _discovery?.Dispose();
            var address = new List <IPAddress> {
                IPAddress.Parse(IpUtil.GetLocalIpAddress())
            };
            var service = new ServiceProfile(_hostName, "_glimmr._tcp", 21324, address);

            service.AddProperty("mac", sd.DeviceId);
            _discovery = new ServiceDiscovery();
            _discovery.Advertise(service);
        }
예제 #4
0
 public void Dispose()
 {
     _serviceDiscovery.ServiceInstanceDiscovered -= OnServiceInstanceDiscovered;
     _serviceDiscovery.ServiceDiscovered         -= OnServiceDiscovered;
     _serviceDiscovery.Dispose();
 }
예제 #5
0
        public static void Main(string[] args)
        {
            var mdns = new MulticastService();
            var sd   = new ServiceDiscovery(mdns);

            mdns.NetworkInterfaceDiscovered += (s, e) =>
            {
                foreach (var nic in e.NetworkInterfaces)
                {
                    Console.WriteLine($"NIC '{nic.Name}'");
                }

                // Ask for the name of all services.
                sd.QueryAllServices();
            };

            sd.ServiceDiscovered += (s, serviceName) =>
            {
                Console.WriteLine($"service '{serviceName}'");

                // Ask for the name of instances of the service.
                mdns.SendQuery(serviceName, type: DnsType.PTR);
            };

            mdns.AnswerReceived += (s, e) =>
            {
                // Is this an answer to a instances query?
                var pointers = e.Message.Answers.OfType <PTRRecord>().Where(p => p.Name != ServiceDiscovery.ServiceName);
                foreach (var pointer in pointers)
                {
                    Console.WriteLine($"service instance '{pointer.DomainName}'");

                    // Ask for the service instance details.
                    mdns.SendQuery(pointer.DomainName, type: DnsType.SRV);
                }

                // Is this an answer to a service instance details?
                var servers = e.Message.Answers.OfType <SRVRecord>();
                foreach (var server in servers)
                {
                    Console.WriteLine($"host '{server.Target}' for '{server.Name}'");

                    // Ask for the host IP addresses.
                    mdns.SendQuery(server.Target, type: DnsType.A);
                    mdns.SendQuery(server.Target, type: DnsType.AAAA);
                }

                // Is this an answer to host addresses?
                var addresses = e.Message.Answers.OfType <AddressRecord>();
                foreach (var address in addresses)
                {
                    Console.WriteLine($"host '{address.Name}' at {address.Address}");
                }
            };

            try
            {
                mdns.Start();
                Console.ReadKey();
            }
            finally
            {
                sd.Dispose();
                mdns.Stop();
            }
        }
예제 #6
0
        public static async Task <List <NanoData> > Discover(int timeout = 5)
        {
            var output = new List <NanoData>();
            var mDns   = new MulticastService();
            var sd     = new ServiceDiscovery(mDns);

            mDns.NetworkInterfaceDiscovered += (s, e) => {
                // Ask for the name of all services.
                sd.QueryServiceInstances("_nanoleafapi._tcp");
            };

            sd.ServiceDiscovered += (s, serviceName) => { mDns.SendQuery(serviceName, type: DnsType.PTR); };

            sd.ServiceInstanceDiscovered += (s, e) => {
                var name  = e.ServiceInstanceName.ToString();
                var nData = new NanoData {
                    IpAddress = string.Empty
                };
                if (!name.Contains("nanoleafapi", StringComparison.InvariantCulture))
                {
                    return;
                }
                foreach (var msg in e.Message.AdditionalRecords)
                {
                    switch (msg.Type)
                    {
                    case DnsType.A:
                        var aString = msg.ToString();
                        var aValues = aString.Split(" ");
                        nData.IpAddress = aValues[4];
                        nData.Name      = aValues[0].Split(".")[0];
                        break;

                    case DnsType.TXT:
                        var txtString = msg.ToString();
                        var txtValues = txtString.Split(" ");
                        nData.Version = txtValues[5]
                                        .Replace("srcvers=", string.Empty, StringComparison.InvariantCulture);
                        nData.Type = txtValues[4].Replace("md=", string.Empty, StringComparison.InvariantCulture);
                        nData.Id   = txtValues[3].Replace("id=", string.Empty, StringComparison.InvariantCulture);
                        break;

                    case DnsType.AAAA:
                        var mString = msg.ToString();
                        var mValues = mString.Split(" ");
                        nData.IpV6Address = mValues[4];
                        // Remove rest of FQDN
                        nData.Name = mValues[0].Split(".")[0];
                        break;

                    case DnsType.SRV:
                        var sString = msg.ToString();
                        var sValues = sString.Split(" ");
                        nData.Port     = int.Parse(sValues[6], CultureInfo.InvariantCulture);
                        nData.Hostname = sValues[7];
                        break;
                    }
                }

                if (string.IsNullOrEmpty(nData.IpAddress) && !string.IsNullOrEmpty(nData.Hostname))
                {
                    nData.IpAddress = nData.Hostname;
                }

                if (!string.IsNullOrEmpty(nData.IpAddress) && !string.IsNullOrEmpty(nData.Id))
                {
                    output.Add(nData);
                }
            };

            mDns.Start();
            LogUtil.Write("Nano: Discovery Started.");
            await Task.Delay(timeout * 1000).ConfigureAwait(false);

            mDns.Stop();
            sd.Dispose();
            mDns.Dispose();
            LogUtil.Write($"Nano: Discovery complete, found {output.Count} devices.");
            return(output);
        }
예제 #7
0
 public Task <bool> Stop()
 {
     _serviceAdvertiser.Dispose();
     return(Task.FromResult(true));
 }
예제 #8
0
 public Task <bool> Stop()
 {
     _multicastService.Stop();
     _serviceDiscovery.Dispose();
     return(Task.FromResult(true));
 }
예제 #9
0
        public static async Task <List <WLedData> > Discover(int timeout = 5)
        {
            var output   = new List <WLedData>();
            var existing = new List <WLedData>();

            try {
                existing = DataUtil.GetCollection <WLedData>("Dev_Wled");
            } catch (Exception e) {
                LogUtil.Write("No Led data...");
            }

            if (existing == null)
            {
                existing = new List <WLedData>();
            }

            var mDns = new MulticastService();
            var sd   = new ServiceDiscovery(mDns);

            mDns.NetworkInterfaceDiscovered += (s, e) => {
                // Ask for the name of all services.
                sd.QueryServiceInstances("_wled._tcp");
            };

            sd.ServiceDiscovered += (s, serviceName) => {
                mDns.SendQuery(serviceName, type: DnsType.PTR);
            };

            sd.ServiceInstanceDiscovered += (s, e) => {
                var name = e.ServiceInstanceName.ToString();


                if (!name.Contains("wled", StringComparison.InvariantCulture))
                {
                    return;
                }
                var rr = e.Message.AdditionalRecords;

                foreach (var id in from msg in rr where msg.Type == DnsType.TXT select msg.CanonicalName.Split(".")[0])
                {
                    var nData = new WLedData(id);
                    foreach (var ee in existing)
                    {
                        if (ee.Id == nData.Id)
                        {
                            nData.CopyExisting(ee);
                        }
                    }
                    LogUtil.Write("We should be inserting here: " + JsonConvert.SerializeObject(nData));
                    DataUtil.InsertCollection <WLedData>("Dev_Wled", nData);
                }
            };

            mDns.Start();
            LogUtil.Write("WLED: Discovery Started.");
            await Task.Delay(timeout * 1000);

            mDns.Stop();
            sd.Dispose();
            mDns.Dispose();
            LogUtil.Write($"WLED: Discovery complete, found {output.Count} devices.");
            return(output);
        }