public void ConnectToClient(string inputIPString) { Debug.Log("Trying to connect to: " + inputIPString); string pose_host_address = "tcp://" + inputIPString + ":" + pose_client_port.ToString(); string video_host_address = "tcp://" + inputIPString + ":" + video_client_port.ToString(); // Close ZMQ sockets pull_socket.Close(); push_socket.Close(); Debug.Log("Terminated ZMQ sockets."); NetMQConfig.Cleanup(); // Reinstantiate sockets InstantiateSockets(); // Try to connect sockets try { pull_socket.Connect(pose_host_address); push_socket.Connect(video_host_address); Debug.Log("Sockets bound."); // Save ip address for use on next boot. PlayerPrefs.SetString(client_ip_pref_key, inputIPString); PlayerPrefs.Save(); } catch (Exception) { Debug.LogError("Input address from textbox is invalid. Note that hostnames are not supported!"); throw; } }
/* ===================== * UNITY PLAYER EVENT HOOKS * ===================== */ // Function called when Unity Player is loaded. public IEnumerator Start() { // Check if the program should use CLI arguments (with defaults) if (!Application.isEditor) { pose_host = GetArg("-pose-host", pose_host_default); video_host = GetArg("-video-host", video_host_default); } // Init simple splash screen Text text_obj = splashScreen.GetComponentInChildren <Text>(true); text_obj.text = "FlightGoggles Simulation Environment" + Environment.NewLine + flight_goggles_version + Environment.NewLine + Environment.NewLine + "Waiting for client connection..." + Environment.NewLine + Environment.NewLine + "Pose input socket:" + Environment.NewLine + pose_host + Environment.NewLine + Environment.NewLine + "Video output socket:" + Environment.NewLine + video_host; splashScreen.SetActive(true); // Fixes for Unity/NetMQ conflict stupidity. AsyncIO.ForceDotNet.Force(); socket_lock = new object(); // Connect sockets Debug.Log("Creating sockets."); pull_socket = new NetMQ.Sockets.SubscriberSocket(); pull_socket.Options.ReceiveHighWatermark = 90; pull_socket.Connect(pose_host); // Setup subscriptions. pull_socket.Subscribe("Pose"); push_socket = new NetMQ.Sockets.PublisherSocket(); push_socket.Connect(video_host); Debug.Log("Sockets bound."); // Initialize Internal State internal_state = new UnityState_t(); // Do not try to do any processing this frame so that we can render our splash screen. internal_state.screenSkipFrames = 1; // Wait until end of frame to transmit images while (true) { // Wait until all rendering + UI is done. // Blocks until the frame is rendered. yield return(new WaitForEndOfFrame()); // Check if this frame should be rendered. if (internal_state.readyToRender) { // Read the frame from the GPU backbuffer and send it via ZMQ. sendFrameOnWire(); } } }
public void ConnectBothSockets() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Connect("pgm://224.0.0.1:5555"); sub.Connect("pgm://224.0.0.1:5555"); sub.Subscribe(""); pub.SendFrame("Hi"); bool more; Assert.AreEqual("Hi", sub.ReceiveFrameString(out more)); Assert.IsFalse(more); } }
public void Sending1000Messages() { // creating two different context and sending 1000 messages int count = 0; var subReady = new ManualResetEvent(false); Task subTask = Task.Factory.StartNew(() => { using (var sub = new SubscriberSocket()) { sub.Bind("pgm://224.0.0.1:5555"); sub.Subscribe(""); subReady.Set(); while (count < 1000) { bool more; Assert.AreEqual(count, BitConverter.ToInt32(sub.ReceiveFrameBytes(out more), 0)); Assert.IsFalse(more); count++; } } }); subReady.WaitOne(); Task pubTask = Task.Factory.StartNew(() => { using (var pub = new PublisherSocket()) { pub.Connect("pgm://224.0.0.1:5555"); for (int i = 0; i < 1000; i++) pub.SendFrame(BitConverter.GetBytes(i)); // if we close the socket before the subscriber receives all messages subscriber // might miss messages, lets wait another second Thread.Sleep(1000); } }); pubTask.Wait(); subTask.Wait(); Assert.AreEqual(1000, count); }
public void UseInterface() { #if NETCOREAPP1_0 var hostEntry = Dns.GetHostEntryAsync(Dns.GetHostName()).Result; #else var hostEntry = Dns.GetHostEntry(Dns.GetHostName()); #endif string ip = hostEntry.AddressList .Where(addr => addr.AddressFamily == AddressFamily.InterNetwork) .Select(addr => addr.ToString()) .FirstOrDefault(); using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Connect($"pgm://{ip};224.0.0.1:5555"); sub.Bind($"pgm://{ip};224.0.0.1:5555"); sub.Subscribe(""); pub.SendFrame("Hi"); bool more; Assert.AreEqual("Hi", sub.ReceiveFrameString(out more)); Assert.IsFalse(more); } }
public void SetPgmSettings() { const int MegaBit = 1024; const int MegaByte = 1024; using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Options.MulticastHops = 2; pub.Options.MulticastRate = 40*MegaBit; // 40 megabit pub.Options.MulticastRecoveryInterval = TimeSpan.FromMinutes(10); pub.Options.SendBuffer = MegaByte*10; // 10 megabyte pub.Connect("pgm://224.0.0.1:5555"); sub.Options.ReceiveBuffer = MegaByte*10; sub.Bind("pgm://224.0.0.1:5555"); sub.Subscribe(""); pub.SendFrame("Hi"); bool more; Assert.AreEqual("Hi", sub.ReceiveFrameString(out more)); Assert.IsFalse(more); Assert.AreEqual(2, pub.Options.MulticastHops); Assert.AreEqual(40*MegaBit, pub.Options.MulticastRate); Assert.AreEqual(TimeSpan.FromMinutes(10), pub.Options.MulticastRecoveryInterval); Assert.AreEqual(MegaByte*10, pub.Options.SendBuffer); Assert.AreEqual(MegaByte*10, sub.Options.ReceiveBuffer); } }
public void ThroughXPubXSubWithReconnectingPublisher() { using (var xpub = new XPublisherSocket()) using (var xsub = new XSubscriberSocket()) using (var poller = new NetMQPoller {xsub, xpub}) { var xPubPort = (ushort)xpub.BindRandomPort("tcp://*"); var xSubPort = (ushort)xsub.BindRandomPort("tcp://*"); var proxy = new Proxy(xsub, xpub, poller: poller); proxy.Start(); poller.RunAsync(); // long running subscriber using (var sub = new SubscriberSocket()) { sub.Connect(string.Format("tcp://localhost:{0}", xPubPort)); sub.Subscribe("A"); // publisher 1 using (var pub = new PublisherSocket()) { pub.Connect(string.Format("tcp://localhost:{0}", xSubPort)); // give the publisher a chance to learn of the subscription Thread.Sleep(100); pub.SendMoreFrame("A").SendFrame("1"); } // publisher 2 using (var pub = new PublisherSocket()) { pub.Connect(string.Format("tcp://localhost:{0}", xSubPort)); // give the publisher a chance to learn of the subscription Thread.Sleep(100); pub.SendMoreFrame("A").SendFrame("2"); } var frames = new List<string>(); Assert.True(sub.TryReceiveMultipartStrings(TimeSpan.FromSeconds(1), ref frames)); CollectionAssert.AreEqual(new[] { "A", "1" }, frames); Assert.True(sub.TryReceiveMultipartStrings(TimeSpan.FromSeconds(1), ref frames)); CollectionAssert.AreEqual(new[] { "A", "2" }, frames); } } }
public void ThroughXPubXSub() { using (var xpub = new XPublisherSocket()) using (var xsub = new XSubscriberSocket()) using (var proxyPoller = new NetMQPoller {xsub, xpub}) { var xPubPort = (ushort)xpub.BindRandomPort("tcp://*"); var xSubPort = (ushort)xsub.BindRandomPort("tcp://*"); var proxy = new Proxy(xsub, xpub, poller: proxyPoller); proxy.Start(); proxyPoller.RunAsync(); using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { // Client 1 sub.Connect(string.Format("tcp://localhost:{0}", xPubPort)); pub.Connect(string.Format("tcp://localhost:{0}", xSubPort)); sub.Subscribe("A"); // Client 2 Thread.Sleep(500); pub.SendMoreFrame("A").SendFrame("Hello"); var frames = new List<string>(); Assert.True(sub.TryReceiveMultipartStrings(TimeSpan.FromSeconds(1), ref frames)); CollectionAssert.AreEqual( new[] { "A", "Hello" }, frames); } } }
public void LargeMessage() { using (var pub = new PublisherSocket()) using (var sub = new SubscriberSocket()) { pub.Connect("pgm://224.0.0.1:5555"); sub.Bind("pgm://224.0.0.1:5555"); sub.Subscribe(""); var data = new byte[3200]; // this should be at least 3 packets for (Int16 i = 0; i < 1600; i++) Array.Copy(BitConverter.GetBytes(i), 0, data, i*2, 2); pub.SendFrame(data); byte[] message = sub.ReceiveFrameBytes(); Assert.AreEqual(3200, message.Length); for (Int16 i = 0; i < 1600; i++) Assert.AreEqual(i, BitConverter.ToInt16(message, i*2)); } }