/// <inheritdoc /> public Task StartAsync() { MulticastService.NetworkInterfaceDiscovered += (s, e) => { try { var profile = BuildProfile(); var discovery = new ServiceDiscovery(MulticastService); OnServiceDiscovery(discovery); discovery.ServiceInstanceDiscovered += OnServiceInstanceDiscovered; if (Broadcast && profile != null) { log.Debug($"Advertising {profile.FullyQualifiedName}"); discovery.Advertise(profile); } // Ask all peers to broadcast discovery info. discovery.QueryServiceInstances(ServiceName); } catch (Exception ex) { log.Debug("Failed to send query", ex); // eat it } }; return(Task.CompletedTask); }
/// <summary> /// Uses DNS-SD to find all Factory Orchestrator services on your local network. /// </summary> /// <param name="secondsToWait">Number of seconds to wait for services to respond</param> /// <param name="serverIdentity">The service certificate identity to use</param> /// <param name="certhash">The service certificate hash to use</param> /// <returns>List of FactoryOrchestratorClient representing all discovered clients</returns> public static List <FactoryOrchestratorClient> DiscoverFactoryOrchestratorDevices(int secondsToWait = 5, string serverIdentity = "FactoryServer", string certhash = "E8BF0011168803E6F4AF15C9AFE8C9C12F368C8F") { List <FactoryOrchestratorClient> clients = new List <FactoryOrchestratorClient>(); using (var sd = new ServiceDiscovery()) { sd.ServiceInstanceDiscovered += ((s, e) => { foreach (var srv in e.Message.AdditionalRecords.Union(e.Message.Answers).OfType <SRVRecord>().Where(x => x.CanonicalName.EndsWith("_factorch._tcp.local", StringComparison.InvariantCultureIgnoreCase)).Distinct()) { var port = srv.Port; foreach (var ip in e.Message.AdditionalRecords.Union(e.Message.Answers).OfType <ARecord>()) { var client = new FactoryOrchestratorClient(ip.Address, port, serverIdentity, certhash); client.HostName = ip.CanonicalName.Replace(".factorch.local", ""); var osVer = e.Message.AdditionalRecords.Union(e.Message.Answers).OfType <TXTRecord>().SelectMany(x => x.Strings).Where(x => x.StartsWith("OSVersion=", StringComparison.InvariantCultureIgnoreCase)).DefaultIfEmpty(string.Empty).FirstOrDefault().Replace("OSVersion=", ""); client.OSVersion = osVer; clients.Add(client); } } }); sd.QueryServiceInstances("_factorch._tcp"); Thread.Sleep(secondsToWait * 1000); } return(clients); }
private void InterfaceDiscovered(object?sender, NetworkInterfaceEventArgs e) { _sd.QueryServiceInstances("_nanoleafapi._tcp"); }
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 static async Task <int> Send(SendParameters param) { if (param.text == null && param.files == null) { Console.WriteLine("One of text and files must be specified"); return(-1); } Console.WriteLine("Scanning..."); var instances = new HashSet <DomainName>(); using (var sd = new ServiceDiscovery()) { sd.ServiceInstanceDiscovered += (s, e) => { if (!instances.Contains(e.ServiceInstanceName)) { Console.WriteLine($"Found '{e.ServiceInstanceName}'"); instances.Add(e.ServiceInstanceName); } }; sd.QueryServiceInstances(ADropDomainName); System.Threading.Thread.Sleep(TimeSpan.FromSeconds(10.0)); } if (instances.Count() == 0) { Console.WriteLine("Cannot find another endpoint..."); return(0); } var instancesList = instances.Select(s => { return(s.ToString()); }).ToList(); var index = DisplayMenu("Select an endpoint", instancesList); if (index == -1) { Console.WriteLine("Invalid input..."); return(-1); } var server = instancesList[index]; SRVRecord s; try { var source = new CancellationTokenSource(5000); s = await ADrop.Util.Resolve(server, source.Token); } catch (TaskCanceledException) { Console.WriteLine($"Failed to resolve {server}, timeout"); return(0); } if (s == null) { Console.WriteLine($"Failed to resolve {server}, SRVRecord is empty"); return(0); } try { using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) { socket.Connect(s.Target.ToString(), s.Port); using (var sender = new ADrop.Sender(socket)) { var files = new List <MetaInfo.Types.FileInfo>(); if (param.text != null) { files.Add(new MetaInfo.Types.FileInfo { FileType = "text/plain" }); } if (param.files != null) { foreach (var file in param.files) { files.Add(new MetaInfo.Types.FileInfo { FileType = MimeTypes.MimeTypeMap.GetMimeType(file.Name) }); } } var meta = new MetaInfo { FileInfos = { files } }; sender.SendMetadata(meta); var action = sender.WaitForConfirmation(); switch (action.Type) { case ADrop.Proto.Action.Types.ActionType.Accepted: if (param.text != null) { Console.WriteLine("Sending text..."); sender.SendData(Encoding.UTF8.GetBytes(param.text)); } if (param.files != null) { foreach (var file in param.files) { Console.WriteLine($"Sending file {file.Name} ..."); using (var stream = file.OpenRead()) { sender.SendData(stream); } } } Console.WriteLine("Request completed"); break; default: Console.WriteLine("Request is rejected."); break; } } } } catch (SocketException e) { Console.WriteLine(e); } return(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); }