diff options
| author | Roy <Roy.mail.net@gmail.com> | 2022-12-20 13:06:58 +0200 |
|---|---|---|
| committer | Roy <Roy.mail.net@gmail.com> | 2022-12-20 13:06:58 +0200 |
| commit | 2daf438fd6902138b4229e21a8d67b02da778599 (patch) | |
| tree | d91655cbf00b48d48a375bec1e48367809808fd9 /Software/Visual_Studio/Tango.Integration | |
| parent | 144f4d40b74b552277c12edc6d41b8676440070a (diff) | |
| download | Tango-2daf438fd6902138b4229e21a8d67b02da778599.tar.gz Tango-2daf438fd6902138b4229e21a8d67b02da778599.zip | |
Modified TCP machines discovery method to MultiCast.
Diffstat (limited to 'Software/Visual_Studio/Tango.Integration')
3 files changed, 55 insertions, 18 deletions
diff --git a/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeScanner.cs b/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeScanner.cs index 694502d2e..5e99dd647 100644 --- a/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeScanner.cs +++ b/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeScanner.cs @@ -23,6 +23,8 @@ using Tango.PMR.Common; using Tango.PMR.Integration; using Tango.Settings; using Tango.Transport.Adapters; +using Tango.Transport.Discovery; +using Tango.Transport.Helpers; namespace Tango.Integration.ExternalBridge { @@ -35,7 +37,6 @@ namespace Tango.Integration.ExternalBridge private Thread _tcpDiscoveryThread; private Thread _usbDiscoveryThread; private Thread _signalRDiscoveryThread; - private UdpClient _server; private IntegrationSettings _settings; private HubConnection _connection; private IHubProxy _proxy; @@ -99,13 +100,6 @@ namespace Tango.Integration.ExternalBridge { LogManager.Log("External bridge scanner started..."); - if (_server == null) - { - _server = new UdpClient(); - _server.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); - _server.Client.Bind(new IPEndPoint(IPAddress.Any, _settings.ExternalBridgeServiceDiscoveryPort)); - } - IsStarted = true; foreach (var machine in AvailableMachines.OfType<ExternalBridgeTcpClient>().ToList()) @@ -209,13 +203,40 @@ namespace Tango.Integration.ExternalBridge { try { - var ClientEp = new IPEndPoint(IPAddress.Any, _settings.ExternalBridgeServiceDiscoveryPort); - _server.EnableBroadcast = true; - var ClientRequestData = _server.Receive(ref ClientEp); + ExternalBridgeUdpDiscoveryPacket discoveryPacket = null; + String address = null; + + if (_settings.ExternalBridgeDiscoveryMethod == DiscoveryMethod.Multicast) + { + using (UdpClient udpClient = new UdpClient()) + { + udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, _settings.ExternalBridgeServiceDiscoveryPort)); + udpClient.Ttl = 10; + udpClient.JoinMulticastGroup(IPAddress.Parse(_settings.ExternalBridgeMulticastGroup), IPAddress.Parse(IPAddressHelper.GetLocalIpAddress())); + + var endPoint = new IPEndPoint(IPAddress.Any, 0); + var discoveryData = udpClient.Receive(ref endPoint); - ExternalBridgeUdpDiscoveryPacket packet = ExternalBridgeUdpDiscoveryPacket.Parser.ParseFrom(ClientRequestData); + discoveryPacket = ExternalBridgeUdpDiscoveryPacket.Parser.ParseFrom(discoveryData); + address = endPoint.Address.ToString(); + } + } + else + { + using (UdpClient udpClient = new UdpClient()) + { + udpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); + udpClient.Client.Bind(new IPEndPoint(IPAddress.Any, _settings.ExternalBridgeServiceDiscoveryPort)); + var endPoint = new IPEndPoint(IPAddress.Any, _settings.ExternalBridgeServiceDiscoveryPort); - String address = ClientEp.Address.ToString(); + udpClient.EnableBroadcast = true; + var discoveryData = udpClient.Receive(ref endPoint); + + discoveryPacket = ExternalBridgeUdpDiscoveryPacket.Parser.ParseFrom(discoveryData); + address = endPoint.Address.ToString(); + } + } //validate service existence using TCP connection. try @@ -226,7 +247,7 @@ namespace Tango.Integration.ExternalBridge } catch { - var disconnected_machine = AvailableMachines.OfType<ExternalBridgeTcpClient>().ToList().FirstOrDefault(x => x.SerialNumber == packet.SerialNumber && x.IPAddress == address); + var disconnected_machine = AvailableMachines.OfType<ExternalBridgeTcpClient>().ToList().FirstOrDefault(x => x.SerialNumber == discoveryPacket.SerialNumber && x.IPAddress == address); if (disconnected_machine != null) { @@ -238,14 +259,14 @@ namespace Tango.Integration.ExternalBridge continue; } - if (!AvailableMachines.OfType<ExternalBridgeTcpClient>().ToList().Exists(x => x.SerialNumber == packet.SerialNumber && x.IPAddress == address)) + if (!AvailableMachines.OfType<ExternalBridgeTcpClient>().ToList().Exists(x => x.SerialNumber == discoveryPacket.SerialNumber && x.IPAddress == address)) { ExternalBridgeTcpClient newMachine = null; - var knownMachine = KnownMachines.FirstOrDefault(x => x.SerialNumber == packet.SerialNumber); + var knownMachine = KnownMachines.FirstOrDefault(x => x.SerialNumber == discoveryPacket.SerialNumber); if (knownMachine == null && KnownMachines.Count == 0) { - newMachine = new ExternalBridgeTcpClient(packet.SerialNumber, address); + newMachine = new ExternalBridgeTcpClient(discoveryPacket.SerialNumber, address); } else if (knownMachine != null) { diff --git a/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeService.cs b/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeService.cs index 4218f9e9a..6396774ae 100644 --- a/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeService.cs +++ b/Software/Visual_Studio/Tango.Integration/ExternalBridge/ExternalBridgeService.cs @@ -40,6 +40,7 @@ namespace Tango.Integration.ExternalBridge private TcpServer _tcpServer; private int _discovery_port = 8888; //Will be overridden by settings in constructor.. private int _external_bridge_port = 1984; //Will be overridden by settings in constructor.. + private String _multicastAddress = "234.55.66.77"; //Will be overridden by settings in constructor.. private HubConnection _connection; private IHubProxy _proxy; private bool _isSignalRConnected; @@ -199,6 +200,7 @@ namespace Tango.Integration.ExternalBridge _discovery_port = settings.ExternalBridgeServiceDiscoveryPort; _external_bridge_port = settings.ExternalBridgeServicePort; + _multicastAddress = settings.ExternalBridgeMulticastGroup; _tcpServer = new TcpServer(_external_bridge_port); _tcpServer.ClientConnected += _tcpServer_ClientConnected; @@ -234,7 +236,8 @@ namespace Tango.Integration.ExternalBridge _discoveryService = new UdpDiscoveryService<ExternalBridgeUdpDiscoveryPacket>(_discovery_port, new ExternalBridgeUdpDiscoveryPacket() { SerialNumber = Machine.SerialNumber, - }); + Guid = Machine.Guid, + }) { MulticastGroupAddress = _multicastAddress }; _discoveryService.BeforeBroadcasting -= _discoverySevice_BeforeBroadcasting; _discoveryService.BeforeBroadcasting += _discoverySevice_BeforeBroadcasting; diff --git a/Software/Visual_Studio/Tango.Integration/IntegrationSettings.cs b/Software/Visual_Studio/Tango.Integration/IntegrationSettings.cs index ce6ace32a..20d0b76e4 100644 --- a/Software/Visual_Studio/Tango.Integration/IntegrationSettings.cs +++ b/Software/Visual_Studio/Tango.Integration/IntegrationSettings.cs @@ -5,6 +5,7 @@ using System.Text; using System.Threading.Tasks; using Tango.Settings; using Tango.Transport.Adapters; +using Tango.Transport.Discovery; namespace Tango.Integration { @@ -21,6 +22,16 @@ namespace Tango.Integration public int ExternalBridgeServiceDiscoveryPort { get; set; } /// <summary> + /// Gets or sets the external bridge multi-cast group address. + /// </summary> + public String ExternalBridgeMulticastGroup { get; set; } + + /// <summary> + /// Gets or sets the discovery method. + /// </summary> + public DiscoveryMethod ExternalBridgeDiscoveryMethod { get; set; } + + /// <summary> /// Gets or sets the name of the embedded device. /// </summary> public String EmbeddedDeviceName { get; set; } @@ -42,6 +53,8 @@ namespace Tango.Integration { ExternalBridgeServicePort = 1984; ExternalBridgeServiceDiscoveryPort = 8888; + ExternalBridgeMulticastGroup = "234.55.66.77"; + ExternalBridgeDiscoveryMethod = DiscoveryMethod.Multicast; EmbeddedDeviceName = "Tango USB Serial Port"; FilterExternalBridgeUsbMachines = false; EmbeddedSerialBaudRate = UsbSerialBaudRates.BR_115200; |
