Esempio n. 1
0
        public bool Connect(IMoCapClient_ConnectionInfo connectionInfo)
        {
            // extract server address from connection info
            IPAddress serverAddress = (connectionInfo is NatNetClient.ConnectionInfo) ?
                                      ((NatNetClient.ConnectionInfo)connectionInfo).serverAddress :
                                      IPAddress.Loopback; // fallback > localhost

            // try connecting
            try
            {
                IPEndPoint commandEndpoint = new IPEndPoint(serverAddress, PORT_COMMAND);

                packetOut = new NatNetPacket_Out(commandEndpoint);
                packetIn  = new NatNetPacket_In();

                commandClient = new UdpClient();                 // connect to server's command port

                if (PingServer())
                {
                    GetSceneDescription();

                    Debug.Log("Connected to NatNet server '" + serverInfo.serverName + "'.");

                    // immediately get first packet of frame data
                    GetFrameData();
                    connected        = true;
                    streamingEnabled = false;
                }
            }
            catch (Exception e)
            {
                Debug.LogWarning("Could not connect to NatNet server " + serverAddress + " (" + e.Message + ").");
            }

            if (connected)
            {
                // request streaming IP address
                try
                {
                    if (SendRequest("getDataStreamAddress") && (serverResponse.Length > 0))
                    {
                        multicastAddress = IPAddress.Parse(serverResponse);
                        Debug.Log("Data stream address: " + multicastAddress);

                        // Prepare multicast data reception
                        dataClient = new UdpClient();
                        dataClient.ExclusiveAddressUse = false;
                        dataClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                        dataClient.Client.Bind(new IPEndPoint(IPAddress.Any, PORT_DATA));
                        dataClient.JoinMulticastGroup(multicastAddress);

                        dataClient.Client.ReceiveTimeout = 100;
                    }
                }
                catch (Exception e)
                {
                    Debug.LogWarning("Could not establish data streaming (" + e.Message + ").");
                    if (dataClient != null)
                    {
                        dataClient.Close();
                        dataClient = null;
                    }
                }

                // request framerate
                try
                {
                    if (SendRequest("getFramerate") && (serverResponse.Length > 0))
                    {
                        updateRate = float.Parse(serverResponse);
                    }
                }
                catch (Exception e)
                {
                    Debug.LogWarning("Could not establish framerate (" + e.Message + ").");
                }
            }

            return(connected);
        }
		public bool Connect(IMoCapClient_ConnectionInfo connectionInfo)
		{
			// extract server address from connection info
			IPAddress serverAddress = (connectionInfo is NatNetClient.ConnectionInfo) ?
				((NatNetClient.ConnectionInfo) connectionInfo).serverAddress :
				IPAddress.Loopback; // fallback > localhost
			
			// try connecting
			try
			{
				IPEndPoint commandEndpoint = new IPEndPoint(serverAddress, PORT_COMMAND);

				packetOut = new NatNetPacket_Out(commandEndpoint);
				packetIn  = new NatNetPacket_In();
				
				commandClient = new UdpClient(); // connect to server's command port

				if ( PingServer() )
				{
					GetSceneDescription();

					Debug.Log("Connected to NatNet server '" + serverInfo.serverName + "'.");
					// print list of actor and device names
					if (scene.actors.Length > 0)
					{
						string actorNames = "";
						foreach (Actor a in scene.actors)
						{
							if (actorNames.Length > 0) { actorNames += ", "; }
							actorNames += a.name;
						}
						Debug.Log("Actors (" + scene.actors.Length + "): " + actorNames);
					}
					if (scene.devices.Length > 0)
					{
						string deviceNames = "";
						foreach (Device d in scene.devices)
						{
							if (deviceNames.Length > 0) { deviceNames += ", "; }
							deviceNames += d.name;
						}
						Debug.Log("Devices (" + scene.devices.Length + "): " + deviceNames);
					}

					// immediately get first packet of frame data
					GetFrameData();
					connected = true;
					streamingEnabled = false;
				}
			}
			catch (Exception e)
			{
				Debug.LogWarning("Could not connect to NatNet server " + serverAddress + " (" + e.Message + ").");
			}

			// request streaming IP address
			if (connected)
			{
				try
				{
					if (SendRequest("getDataStreamAddress") && (serverResponse.Length > 0))
					{
						multicastAddress = IPAddress.Parse(serverResponse);
						Debug.Log("Data stream address: " + multicastAddress);

						// Prepare multicast data reception
						dataClient = new UdpClient();
						dataClient.ExclusiveAddressUse = false;
						dataClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
						dataClient.Client.Bind(new IPEndPoint(IPAddress.Any, PORT_DATA));
						dataClient.JoinMulticastGroup(multicastAddress);

						dataClient.Client.ReceiveTimeout = 100;
					}
				}
				catch (Exception e)
				{
					Debug.LogWarning("Could not establish data streaming (" + e.Message + ").");
					if (dataClient != null)
					{
						dataClient.Close();
						dataClient = null;
					}
				}
			}

			return connected;
		}