コード例 #1
0
        public void FindDevices()
        {
            IsSearching = true;
            _devices.Clear();
            _discoveryCancellationTokenSource = new CancellationTokenSource();
            var token = _discoveryCancellationTokenSource.Token;

            var startTime = DateTime.UtcNow;

            Task.Run(() =>
            {
                //find devices in folder with ipaddresses
                var files = _fileManager.GetFiles(Path.Combine(_fileManager.DataDirectory, "LDARtools", "emulators"));

                foreach (var file in files)
                {
                    var ipText   = _fileManager.ReadAllText(file);
                    FileInfo f   = new FileInfo(file);
                    var fileName = f.Name.Replace(f.Extension, "");

                    if (IPAddress.TryParse(ipText, out var ip))
                    {
                        var deviceService           = new PhxTcpDeviceService(ipText, fileName);
                        deviceService.Connected    += DeviceOnConnected;
                        deviceService.Disconnected += DeviceOnDisconnected;
                        _devices.Add(deviceService);
                        try
                        {
                            DevicesFound?.Invoke(new DevicesFoundEventArgs(Devices));
                        }
#pragma warning disable 168
                        catch (Exception e)
#pragma warning restore 168
                        {
                            Debugger.Break();
                        }
                    }
                }

                //find using udp
                try
                {
                    using (var udpClient = new UdpClient())
                    {
                        udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, UdpDiscoveryPort));
                        udpClient.JoinMulticastGroup(IPAddress.Parse(MulticastAddress));
                        var messageSource = new IPEndPoint(0, 0);
                        while (true)
                        {
                            if (token.IsCancellationRequested)
                            {
                                break;
                            }
                            var encodedMessage = udpClient.Receive(ref messageSource);
                            var message        = Encoding.UTF8.GetString(encodedMessage);
                            if (message.StartsWith("phx@"))
                            {
                                var computerName = message.Substring(4, message.Length - 4);
                                var deviceName   = $"phxSim@{computerName}({messageSource.Address})";
                                if (_devices.All(d => d.SerialNumber != deviceName))
                                {
                                    var deviceService =
                                        new PhxTcpDeviceService(messageSource.Address.ToString(), deviceName);
                                    deviceService.Connected    += DeviceOnConnected;
                                    deviceService.Disconnected += DeviceOnDisconnected;
                                    _devices.Add(deviceService);
                                    try
                                    {
                                        DevicesFound?.Invoke(new DevicesFoundEventArgs(Devices));
                                    }
#pragma warning disable CS0168 // Variable is declared but never used
                                    catch (Exception e)
#pragma warning restore CS0168 // Variable is declared but never used
                                    {
                                        Debugger.Break();
                                    }
                                }
                            }

                            if (DateTime.UtcNow - startTime > TimeSpan.FromSeconds(30))
                            {
                                break;
                            }
                        }

                        DevicesFoundComplete?.Invoke(this, EventArgs.Empty);
                    }
                }
                catch
                {
                    //do nothing
                }
            }, token);
        }
コード例 #2
0
 protected virtual void OnDevicesFoundComplete()
 {
     DevicesFoundComplete?.Invoke(this, EventArgs.Empty);
 }