Files
HawkeyeVision/framework/Inspectron.HawkEye/Protocol/Discovery/DiscoveryClient.cs
2025-08-19 12:45:50 +02:00

84 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace Inspectron.HawkEye.Protocol.Discovery
{
public class DiscoveryClient
{
public ReadOnlyCollection<CameraInfo> Discovered => new ReadOnlyCollection<CameraInfo>(_discovered);
private readonly int _port;
private readonly List<CameraInfo> _discovered = new List<CameraInfo>();
private readonly object _discoveryLock = new object();
public DiscoveryClient(int port)
{
_port = port;
}
public event Action<CameraInfo> CameraFound = delegate { };
public void Discover()
{
var allInterfaces = NetworkInterface
.GetAllNetworkInterfaces()
.Where(nic => nic.OperationalStatus == OperationalStatus.Up);
Parallel.ForEach(allInterfaces, DiscoverOnInterface);
//foreach (NetworkInterface i in allInterfaces)
//{
// DiscoverOnInterface(i);
//}
}
private void DiscoverOnInterface(NetworkInterface iface)
{
var address = iface.GetIPProperties().UnicastAddresses
.First(x => x.Address.AddressFamily == AddressFamily.InterNetwork).Address;
UdpClient client;
lock (_discoveryLock)
{
client = new UdpClient(new IPEndPoint(address, 0));
var requestData = Encoding.ASCII.GetBytes("discovery");
client.Client.ReceiveTimeout = 2000;
var s = client.Client;
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
s.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontRoute, 1);
client.EnableBroadcast = true;
client.Send(requestData, requestData.Length, new IPEndPoint(IPAddress.Broadcast, _port));
client.Send(requestData, requestData.Length, new IPEndPoint(IPAddress.Broadcast, _port));
client.Send(requestData, requestData.Length, new IPEndPoint(IPAddress.Broadcast, _port));
}
var serverEp = new IPEndPoint(IPAddress.Any, 0);
byte[] serverResponseData;
try
{
serverResponseData = client.Receive(ref serverEp);
var serverResponse = Encoding.ASCII.GetString(serverResponseData);
Console.WriteLine("Recived {0} from {1}", serverResponse, serverEp.Address);
var found = new CameraInfo {Mac = serverResponse, Address = serverEp.Address,AdapterAddress = address};
lock (_discoveryLock)
{
if (_discovered.Any(x => x.Mac == found.Mac)) return;
}
CameraFound(found);
_discovered.Add(found);
}
catch
{
}
}
}
}