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; } }
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); }
public void Dispose() { _serviceDiscovery.ServiceInstanceDiscovered -= OnServiceInstanceDiscovered; _serviceDiscovery.ServiceDiscovered -= OnServiceDiscovered; _serviceDiscovery.Dispose(); }
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(); } }
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); }
public Task <bool> Stop() { _serviceAdvertiser.Dispose(); return(Task.FromResult(true)); }
public Task <bool> Stop() { _multicastService.Stop(); _serviceDiscovery.Dispose(); return(Task.FromResult(true)); }
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); }