public bool ConnectGateway()
        {
            try
            {
                internetAccessAdapter = GetAdapterWithInternetAccess();

                log.LogInformation("Adapter with Internet Access: " + internetAccessAdapter);

                TCPClientGateway = new TcpClient();
                TCPClientGateway.Client.Connect(ServerEndpoint);

                UDPListen = true;
                TCPListen = true;

                SendMessageUDP(LocalHubInfo.Simplified(), ServerEndpoint);
                LocalHubInfo.InternalEndpoint = (IPEndPoint)UDPClientGateway.Client.LocalEndPoint;

                Thread.Sleep(550);
                SendMessageTCP(LocalHubInfo);

                Thread keepAlive = new Thread(new ThreadStart(delegate
                {
                    while (TCPClientGateway.Connected)
                    {
                        Thread.Sleep(5000);
                        SendMessageTCP(new KeepAlive(LocalHubInfo.Id));
                    }
                }))
                {
                    IsBackground = true
                };

                keepAlive.Start();

                hub.Publish(new GatewayConnectedEvent());

                return(true);
            }
            catch (Exception ex)
            {
                log.LogError($"Error when connecting to gateway {ServerEndpoint.ToString()}. Will retry again soon...", ex);
                hub.Publish(new GatewayErrorEvent($"Error when connecting to gateway {ServerEndpoint.ToString()}. Will retry again soon..."));
            }

            return(false);
        }