예제 #1
0
        /// <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);
        }
예제 #3
0
 private void InterfaceDiscovered(object?sender, NetworkInterfaceEventArgs e)
 {
     _sd.QueryServiceInstances("_nanoleafapi._tcp");
 }
예제 #4
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);
        }
예제 #5
0
        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);
        }
예제 #6
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);
        }