|
@@ -4,102 +4,57 @@ using System.Net;
|
|
|
using System.Net.Sockets;
|
|
|
using System.Text;
|
|
|
using System.Threading;
|
|
|
+using System.Threading.Tasks;
|
|
|
using UnityEngine;
|
|
|
-
|
|
|
+
|
|
|
public class UdpConnection
|
|
|
{
|
|
|
- private UdpClient udpClient;
|
|
|
-
|
|
|
- private readonly Queue<string> incomingQueue = new Queue<string>();
|
|
|
- Thread receiveThread;
|
|
|
- private bool threadRunning = false;
|
|
|
- private string senderIp;
|
|
|
- private int senderPort;
|
|
|
-
|
|
|
- public void StartConnection(string sendIp, int sendPort, int receivePort)
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ private UdpClient client;
|
|
|
+
|
|
|
+ private bool listening = false;
|
|
|
+ private Action<AccData> onAccData;
|
|
|
+
|
|
|
+ public UdpConnection(String ipAddress, int port, Action<AccData> onAccData)
|
|
|
{
|
|
|
- try { udpClient = new UdpClient(receivePort); }
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- Debug.Log("Failed to listen for UDP at port " + receivePort + ": " + e.Message);
|
|
|
- return;
|
|
|
- }
|
|
|
- Debug.Log("Created receiving client at ip and port " + receivePort);
|
|
|
- this.senderIp = sendIp;
|
|
|
- this.senderPort = sendPort;
|
|
|
-
|
|
|
- Debug.Log("Set sendee at ip " + sendIp + " and port " + sendPort);
|
|
|
-
|
|
|
- StartReceiveThread();
|
|
|
+ this.onAccData = onAccData;
|
|
|
+ client = new UdpClient(new IPEndPoint(IPAddress.Parse(ipAddress), port));
|
|
|
}
|
|
|
-
|
|
|
- private void StartReceiveThread()
|
|
|
+
|
|
|
+ public void Listen() => Task.Run(async () =>
|
|
|
{
|
|
|
- receiveThread = new Thread(() => ListenForMessages(udpClient));
|
|
|
- receiveThread.IsBackground = true;
|
|
|
- threadRunning = true;
|
|
|
- receiveThread.Start();
|
|
|
- }
|
|
|
-
|
|
|
- private void ListenForMessages(UdpClient client)
|
|
|
- {
|
|
|
- IPEndPoint remoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
|
|
|
-
|
|
|
- while (threadRunning)
|
|
|
+ listening = true;
|
|
|
+ while (listening)
|
|
|
{
|
|
|
- try
|
|
|
+ var result = await client.ReceiveAsync();
|
|
|
+ String receivedStr = Encoding.UTF8.GetString(result.Buffer);
|
|
|
+
|
|
|
+ var data = receivedStr.Split(':');
|
|
|
+ if (data.Length == 2)
|
|
|
{
|
|
|
- Byte[] receiveBytes = client.Receive(ref remoteIpEndPoint);
|
|
|
- string returnData = Encoding.UTF8.GetString(receiveBytes);
|
|
|
-
|
|
|
- lock (incomingQueue)
|
|
|
+ var name = data[0];
|
|
|
+ if (name.Equals("ACC"))
|
|
|
+ {
|
|
|
+ onAccData(AccData.fromString(data[1]));
|
|
|
+ }else if (name.Equals("ECG"))
|
|
|
{
|
|
|
- incomingQueue.Enqueue(returnData);
|
|
|
+
|
|
|
+ }else if (name.Equals("HR"))
|
|
|
+ {
|
|
|
+
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
- catch (SocketException e)
|
|
|
- {
|
|
|
-
|
|
|
- if (e.ErrorCode != 10004) Debug.Log("Socket exception while receiving data from udp client: " + e.Message);
|
|
|
- }
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- Debug.Log("Error receiving data from udp client: " + e.Message);
|
|
|
- }
|
|
|
- Thread.Sleep(1);
|
|
|
+
|
|
|
+ Debug.Log($"RECEIVED DATA VIA UDP: {receivedStr}");
|
|
|
}
|
|
|
- }
|
|
|
-
|
|
|
- public string[] getMessages()
|
|
|
- {
|
|
|
- string[] pendingMessages = new string[0];
|
|
|
- lock (incomingQueue)
|
|
|
- {
|
|
|
- pendingMessages = new string[incomingQueue.Count];
|
|
|
- int i = 0;
|
|
|
- while (incomingQueue.Count != 0)
|
|
|
- {
|
|
|
- pendingMessages[i] = incomingQueue.Dequeue();
|
|
|
- i++;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return pendingMessages;
|
|
|
- }
|
|
|
-
|
|
|
- public void Send(string message)
|
|
|
- {
|
|
|
- Debug.Log(String.Format("Send msg to ip:{0} port:{1} msg:{2}",senderIp,senderPort,message));
|
|
|
- IPEndPoint serverEndpoint = new IPEndPoint(IPAddress.Parse(senderIp), senderPort);
|
|
|
- Byte[] sendBytes = Encoding.UTF8.GetBytes(message);
|
|
|
- udpClient.Send(sendBytes, sendBytes.Length, serverEndpoint);
|
|
|
- }
|
|
|
-
|
|
|
- public void Stop()
|
|
|
+ });
|
|
|
+
|
|
|
+ public void StopListening()
|
|
|
{
|
|
|
- threadRunning = false;
|
|
|
- receiveThread.Abort();
|
|
|
- udpClient.Close();
|
|
|
+ listening = false;
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
+
|
|
|
+}
|