mirror of
https://github.com/storytold/LiveScan3D.git
synced 2026-10-09 00:09:58 +00:00
Merge pull request #12 from MarekKowalski/streaming
Streaming of the merged point cloud to other services.
This commit is contained in:
@@ -65,6 +65,8 @@
|
|||||||
<Compile Include="SettingsForm.Designer.cs">
|
<Compile Include="SettingsForm.Designer.cs">
|
||||||
<DependentUpon>SettingsForm.cs</DependentUpon>
|
<DependentUpon>SettingsForm.cs</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="TransferServer.cs" />
|
||||||
|
<Compile Include="TransferSocket.cs" />
|
||||||
<Compile Include="Utils.cs" />
|
<Compile Include="Utils.cs" />
|
||||||
<EmbeddedResource Include="MainWindowForm.resx">
|
<EmbeddedResource Include="MainWindowForm.resx">
|
||||||
<DependentUpon>MainWindowForm.cs</DependentUpon>
|
<DependentUpon>MainWindowForm.cs</DependentUpon>
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ namespace KinectServer
|
|||||||
static extern float ICP(IntPtr verts1, IntPtr verts2, int nVerts1, int nVerts2, float[] R, float[] t, int maxIter = 200);
|
static extern float ICP(IntPtr verts1, IntPtr verts2, int nVerts1, int nVerts2, float[] R, float[] t, int maxIter = 200);
|
||||||
|
|
||||||
KinectServer oServer;
|
KinectServer oServer;
|
||||||
|
TransferServer oTranfserServer;
|
||||||
|
|
||||||
//Those three variables are shared with the OpenGLWindow class and are used to exchange data with it.
|
//Those three variables are shared with the OpenGLWindow class and are used to exchange data with it.
|
||||||
//Vertices from all of the sensors
|
//Vertices from all of the sensors
|
||||||
@@ -82,6 +83,9 @@ namespace KinectServer
|
|||||||
|
|
||||||
oServer = new KinectServer(oSettings);
|
oServer = new KinectServer(oSettings);
|
||||||
oServer.eSocketListChanged += new SocketListChangedHandler(UpdateListView);
|
oServer.eSocketListChanged += new SocketListChangedHandler(UpdateListView);
|
||||||
|
oTranfserServer = new TransferServer();
|
||||||
|
oTranfserServer.lVertices = lAllVertices;
|
||||||
|
oTranfserServer.lColors = lAllColors;
|
||||||
|
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
}
|
}
|
||||||
@@ -96,6 +100,7 @@ namespace KinectServer
|
|||||||
stream.Close();
|
stream.Close();
|
||||||
|
|
||||||
oServer.StopServer();
|
oServer.StopServer();
|
||||||
|
oTranfserServer.StopServer();
|
||||||
}
|
}
|
||||||
|
|
||||||
//Starts the server
|
//Starts the server
|
||||||
@@ -106,11 +111,13 @@ namespace KinectServer
|
|||||||
if (bServerRunning)
|
if (bServerRunning)
|
||||||
{
|
{
|
||||||
oServer.StartServer();
|
oServer.StartServer();
|
||||||
|
oTranfserServer.StartServer();
|
||||||
btStart.Text = "Stop server";
|
btStart.Text = "Stop server";
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
oServer.StopServer();
|
oServer.StopServer();
|
||||||
|
oTranfserServer.StopServer();
|
||||||
btStart.Text = "Start server";
|
btStart.Text = "Start server";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,123 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Threading;
|
||||||
|
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Net;
|
||||||
|
|
||||||
|
|
||||||
|
namespace KinectServer
|
||||||
|
{
|
||||||
|
class TransferServer
|
||||||
|
{
|
||||||
|
public List<float> lVertices = new List<float>();
|
||||||
|
public List<byte> lColors = new List<byte>();
|
||||||
|
|
||||||
|
TcpListener oListener;
|
||||||
|
List<TransferSocket> lClientSockets = new List<TransferSocket>();
|
||||||
|
|
||||||
|
object oClientSocketLock = new object();
|
||||||
|
bool bServerRunning = false;
|
||||||
|
|
||||||
|
public void StartServer()
|
||||||
|
{
|
||||||
|
if (!bServerRunning)
|
||||||
|
{
|
||||||
|
oListener = new TcpListener(IPAddress.Any, 48002);
|
||||||
|
oListener.Start();
|
||||||
|
|
||||||
|
bServerRunning = true;
|
||||||
|
Thread listeningThread = new Thread(this.ListeningWorker);
|
||||||
|
listeningThread.Start();
|
||||||
|
Thread receivingThread = new Thread(this.ReceivingWorker);
|
||||||
|
receivingThread.Start();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void StopServer()
|
||||||
|
{
|
||||||
|
if (bServerRunning)
|
||||||
|
{
|
||||||
|
bServerRunning = false;
|
||||||
|
|
||||||
|
oListener.Stop();
|
||||||
|
lock (oClientSocketLock)
|
||||||
|
lClientSockets.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ListeningWorker()
|
||||||
|
{
|
||||||
|
while (bServerRunning)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
TcpClient newClient = oListener.AcceptTcpClient();
|
||||||
|
|
||||||
|
lock (oClientSocketLock)
|
||||||
|
{
|
||||||
|
lClientSockets.Add(new TransferSocket(newClient));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (SocketException)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
System.Threading.Thread.Sleep(100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ReceivingWorker()
|
||||||
|
{
|
||||||
|
System.Timers.Timer checkConnectionTimer = new System.Timers.Timer();
|
||||||
|
checkConnectionTimer.Interval = 1000;
|
||||||
|
|
||||||
|
checkConnectionTimer.Elapsed += delegate (object sender, System.Timers.ElapsedEventArgs e)
|
||||||
|
{
|
||||||
|
lock (oClientSocketLock)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < lClientSockets.Count; i++)
|
||||||
|
{
|
||||||
|
if (!lClientSockets[i].SocketConnected())
|
||||||
|
{
|
||||||
|
lClientSockets.RemoveAt(i);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
checkConnectionTimer.Start();
|
||||||
|
|
||||||
|
while (bServerRunning)
|
||||||
|
{
|
||||||
|
lock (oClientSocketLock)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < lClientSockets.Count; i++)
|
||||||
|
{
|
||||||
|
byte[] buffer = lClientSockets[i].Receive(1);
|
||||||
|
|
||||||
|
while (buffer.Length != 0)
|
||||||
|
{
|
||||||
|
if (buffer[0] == 0)
|
||||||
|
{
|
||||||
|
lock (lVertices)
|
||||||
|
{
|
||||||
|
lClientSockets[i].SendFrame(lVertices, lColors);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buffer = lClientSockets[i].Receive(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Thread.Sleep(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
checkConnectionTimer.Stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
using System.Net.Sockets;
|
||||||
|
using System.Runtime.Serialization.Formatters.Binary;
|
||||||
|
|
||||||
|
namespace KinectServer
|
||||||
|
{
|
||||||
|
class TransferSocket
|
||||||
|
{
|
||||||
|
TcpClient oSocket;
|
||||||
|
|
||||||
|
public TransferSocket(TcpClient clientSocket)
|
||||||
|
{
|
||||||
|
oSocket = clientSocket;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] Receive(int nBytes)
|
||||||
|
{
|
||||||
|
byte[] buffer;
|
||||||
|
if (oSocket.Available != 0)
|
||||||
|
{
|
||||||
|
buffer = new byte[Math.Min(nBytes, oSocket.Available)];
|
||||||
|
oSocket.GetStream().Read(buffer, 0, nBytes);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
buffer = new byte[0];
|
||||||
|
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SocketConnected()
|
||||||
|
{
|
||||||
|
return oSocket.Connected;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteInt(int val)
|
||||||
|
{
|
||||||
|
oSocket.GetStream().Write(BitConverter.GetBytes(val), 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void WriteFloat(float val)
|
||||||
|
{
|
||||||
|
oSocket.GetStream().Write(BitConverter.GetBytes(val), 0, 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void SendFrame(List<float> vertices, List<byte> colors)
|
||||||
|
{
|
||||||
|
short[] sVertices = Array.ConvertAll(vertices.ToArray(), x => (short)(x * 1000));
|
||||||
|
|
||||||
|
|
||||||
|
int nVerticesToSend = vertices.Count / 3;
|
||||||
|
byte[] buffer = new byte[sizeof(short) * 3 * nVerticesToSend];
|
||||||
|
Buffer.BlockCopy(sVertices, 0, buffer, 0, sizeof(short) * 3 * nVerticesToSend);
|
||||||
|
try
|
||||||
|
{
|
||||||
|
WriteInt(nVerticesToSend);
|
||||||
|
oSocket.GetStream().Write(buffer, 0, buffer.Length);
|
||||||
|
oSocket.GetStream().Write(colors.ToArray(), 0, sizeof(byte) * 3 * nVerticesToSend);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user