16 private UdpClient udpClient;
18 private Thread udpThread;
20 private string ControlIP;
21 private List<uint> allowedStreams;
22 private List<ReceiverStreamParams> receiverStreams;
32 ref List<uint> allowedStreams, ref List<ReceiverStreamParams> receiverStreams)
34 this.allowedStreams = allowedStreams;
35 this.receiverStreams = receiverStreams;
37 this.ControlIP = ControlIP;
38 this.udpPort = udpPort;
39 udpClient =
new UdpClient(ControlIP, udpPort);
54 udpThread =
new Thread(listenForUDPData);
63 void listenForUDPData()
65 IPEndPoint ep =
new IPEndPoint(IPAddress.Parse(ControlIP), udpPort);
66 Debug.Log(
"Opening UDP Connection" + ep);
70 udpClient.BeginReceive(
new AsyncCallback(UDPReceiveCallback), state);
77 Debug.Log(
"Closing UDP Connection");
85 void UDPReceiveCallback(IAsyncResult ar)
91 UdpClient c = ((UdpState)(ar.AsyncState)).c;
92 IPEndPoint e = ((UdpState)(ar.AsyncState)).e;
93 byte[] buf = udpClient.EndReceive(ar, ref e);
96 UdpState state =
new UdpState(e, c);
97 udpClient.BeginReceive(
new AsyncCallback(UDPReceiveCallback), state);
106 void parseUDPMessage(
byte[] udpBuf)
108 int headerSize = BitConverter.ToUInt16(udpBuf, 0);
109 int dataSize = (int)BitConverter.ToUInt16(udpBuf, 2);
110 uint streamID = (uint)BitConverter.ToUInt16(udpBuf, 4);
111 int federationID = (int)BitConverter.ToUInt16(udpBuf, 6);
115 byte[] header =
new byte[headerSize];
118 Buffer.BlockCopy(udpBuf, 8, header, 0, headerSize);
120 byte[] msg =
new byte[dataSize];
121 Buffer.BlockCopy(udpBuf, 8 + headerSize, msg, 0, dataSize);
124 if (allowedStreams.Contains(streamID))
126 for (
int i = 0; i < receiverStreams.Count; i++)
128 if (receiverStreams[i].streamIDs.Contains(streamID))
130 receiverStreams[i].ReceiverStream.OnMessage(streamID, header, msg);
144 byte[] numByte = BitConverter.GetBytes(num);
145 byte[] UDPInitMsg = constructUDPMsg(streamID,
new byte[0], numByte);
146 udpClient.Send(UDPInitMsg, UDPInitMsg.Length);
148 Debug.Log(
"Sent empty receiver packet");
162 public void send(uint streamID,
byte[] header,
byte[] data)
164 if (udpClient ==
null)
throw new Exception(
"udpClient undefined");
168 byte[] UDPInitMsg = constructUDPMsg(streamID, header, data);
169 udpClient.Send(UDPInitMsg, UDPInitMsg.Length);
171 catch (SocketException socketException)
173 Debug.LogException(socketException);
174 throw new Exception(
"Socket exception: " + socketException);
185 byte[] constructUDPMsg(uint streamID,
byte[] header,
byte[] data)
187 byte[] dataPacket =
new byte[8 + header.Length + data.Length];
189 byte[] headerLengthBytes = BitConverter.GetBytes((ushort)header.Length);
191 dataPacket[0] = headerLengthBytes[0];
192 dataPacket[1] = headerLengthBytes[1];
194 byte[] dataLengthBytes = BitConverter.GetBytes((ushort)data.Length);
195 dataPacket[2] = dataLengthBytes[0];
196 dataPacket[3] = dataLengthBytes[1];
199 byte[] streamIDBytes = BitConverter.GetBytes((ushort)streamID);
200 dataPacket[4] = streamIDBytes[0];
201 dataPacket[5] = streamIDBytes[1];
207 if (header.Length > 0)
209 string headerStr = JsonUtility.ToJson(header);
210 byte[] headerByte = Encoding.ASCII.GetBytes(headerStr);
211 Buffer.BlockCopy(headerByte, 0, dataPacket, 8, headerByte.Length);
214 Buffer.BlockCopy(data, 0, dataPacket, 8 + header.Length, data.Length);