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); }
protected virtual void OnDevicesFound(DevicesFoundEventArgs args) { DevicesFound?.Invoke(args); }