diff --git a/src/main/java/seng302/Networking/BinaryMessageDecoder.java b/src/main/java/seng302/Networking/BinaryMessageDecoder.java index 6e270aea..5ea0796f 100644 --- a/src/main/java/seng302/Networking/BinaryMessageDecoder.java +++ b/src/main/java/seng302/Networking/BinaryMessageDecoder.java @@ -56,7 +56,7 @@ public class BinaryMessageDecoder { crc.update(this.fullMessage); //run through the checks - if (this.message.length != ByteConverter.bytesToInt(this.headerMessageLength) && this.message.length != ByteConverter.bytesToInt(this.headerMessageLength, ByteOrder.BIG_ENDIAN)){ + if (this.message.length != ByteConverter.bytesToShort(this.headerMessageLength, ByteOrder.BIG_ENDIAN) ){//&& this.message.length != ByteConverter.bytesToShort(this.headerMessageLength, ByteOrder.BIG_ENDIAN)){ System.err.println("message length in header does not equal the message length"); System.err.println("message length in header: " + ByteConverter.bytesToInt(this.headerMessageLength)); System.err.println("message length: " + this.message.length); diff --git a/src/main/java/seng302/Networking/MockOutput.java b/src/main/java/seng302/Networking/MockOutput.java new file mode 100644 index 00000000..8d805bd9 --- /dev/null +++ b/src/main/java/seng302/Networking/MockOutput.java @@ -0,0 +1,135 @@ +package seng302.Networking; +import seng302.Networking.MessageEncoders.RaceVisionByteEncoder; +import seng302.Networking.MessageEncoders.XMLMessageEncoder; +import seng302.Networking.Utils.BoatLocationMessage; +import seng302.Networking.Utils.MessageType; + +import java.io.*; +import java.net.*; +import java.util.ArrayList; + +/** + * TCP client to recive information from AC35 data source + */ +public class MockOutput +{ + private long lastHeartbeatTime; + + private RaceVisionByteEncoder messageEncoder = new RaceVisionByteEncoder(); + + //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port + private Socket mockSocket; + private DataOutputStream outToVisualiser; + + //a buffer that contains items that are waiting to be sent + private ArrayList messagesToSendBuffer = new ArrayList<>(); + + private short messageNumber = 1; + + private short xmlSequenceNumber = 1; + private int heartbeatSequenceNum = 1; + + + + MockOutput() throws IOException{ + /*******************************Test********************************/ + StringBuilder xmlString; + + BufferedReader br = new BufferedReader(new InputStreamReader( + this.getClass().getResourceAsStream(("/raceXML/Regatta.xml")))); + + String line; + xmlString = new StringBuilder(); + while((line=br.readLine())!= null){ + xmlString.append(line.trim()); + } + + parseXMLString(xmlString.toString(), 5); + + /*******************************Test********************************/ + + /**************sockets*******************/ + //start Time + lastHeartbeatTime = System.currentTimeMillis(); + + + mockSocket = new Socket("localhost", 4942); + outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); + + + //loop that sends + while(true) + { + System.out.println(timeSinceHeartbeat()); + //sends a heartbeat every 5 seconds + if (timeSinceHeartbeat() >= 5.00){ + outToVisualiser.write(heartbeat()); + lastHeartbeatTime = System.currentTimeMillis(); + } + + //checks the buffer to see if there is anything to send + if (messagesToSendBuffer.size() > 0) { + for (byte[] binaryMessage : messagesToSendBuffer) { + //sends the message to the visualiser + outToVisualiser.write(binaryMessage); + } + //cleans out buffer + messagesToSendBuffer.clear(); + } + } + /**************sockets*******************/ + } + + /** + * calculates the time since last heartbeat + * @return time since last heartbeat + */ + private double timeSinceHeartbeat() { + long now = System.currentTimeMillis(); + return (now - lastHeartbeatTime) / 1000.0; + } + + //returns the heartbeat message + private byte[] heartbeat(){ + byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum); + heartbeatSequenceNum++; + BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage); + messageNumber++; + return binaryMesageEncoder.getFullMessage(); + } + + /** + * Used to give the mockOutput an xml string to be made into a message and sent + * @param xmlString the xml string to send + * @param messageType the kind of xml string, values given in AC35 spec (5 regatta, 6 race, 7 boat) + */ + public void parseXMLString(String xmlString, int messageType){ + XMLMessageEncoder encoder = new XMLMessageEncoder((byte)1, messageNumber, System.currentTimeMillis(), (byte)messageType, xmlSequenceNumber,(short) xmlString.length(), xmlString); + //iterates the sequence numbers + xmlSequenceNumber++; + byte[] encodedXML = encoder.encode(); + + BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), messageNumber, (short)encodedXML.length, encodedXML); + //iterates the message number + messageNumber++; + + addMessageToBufferToSend(binaryMesageEncoder.getFullMessage()); + } + + /** + * Used to give the mocOutput information about boat location to be made into a message and sent + */ + public void parseBoatLocation(){ + /// TODO: 26/04/17 + } + + private void addMessageToBufferToSend(byte[] messagesToSendBuffer) { + this.messagesToSendBuffer.add(messagesToSendBuffer); + } + + public static void main(String argv[]) throws Exception + { + MockOutput client = new MockOutput(); + } + +} \ No newline at end of file diff --git a/src/main/java/seng302/TCPServer.java b/src/main/java/seng302/Networking/VisualiserInput.java similarity index 68% rename from src/main/java/seng302/TCPServer.java rename to src/main/java/seng302/Networking/VisualiserInput.java index a5dbd810..61ad3f2a 100644 --- a/src/main/java/seng302/TCPServer.java +++ b/src/main/java/seng302/Networking/VisualiserInput.java @@ -1,6 +1,7 @@ -package seng302; +package seng302.Networking; import seng302.Networking.BinaryMessageDecoder; import seng302.Networking.MessageDecoders.XMLMessageDecoder; +import seng302.Networking.Utils.MessageType; import java.io.*; import java.net.*; @@ -8,19 +9,22 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.Arrays; +import static seng302.Networking.Utils.ByteConverter.bytesToInt; +import static seng302.Networking.Utils.ByteConverter.bytesToShort; + /** * TCP server to act as the mock AC35 streaming interface */ -public class TCPServer +public class VisualiserInput { public static void main(String argv[]) throws Exception { //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port ServerSocket visualiserSocket = new ServerSocket(4942); + Socket connectionSocket = visualiserSocket.accept(); while(true) { - Socket connectionSocket = visualiserSocket.accept(); InputStream inFromClient = connectionSocket.getInputStream(); byte[] binaryMessage = getBytes(inFromClient); @@ -32,10 +36,16 @@ public class TCPServer System.out.println(testDecoder.getSourceID()); System.out.println(testDecoder.getMessageLength()); System.out.println("----"); - XMLMessageDecoder xmlMessageDecoder = new XMLMessageDecoder(testDecoder.getMessage()); - xmlMessageDecoder.decode(); - System.out.println("--message--"); - System.out.println(xmlMessageDecoder.getXmlMessageInputSource()); + if (testDecoder.getMessageType() == MessageType.XMLMESSAGE.getValue()){ + XMLMessageDecoder xmlMessageDecoder = new XMLMessageDecoder(testDecoder.getMessage()); + xmlMessageDecoder.decode(); + System.out.println("--message--"); + System.out.println(xmlMessageDecoder.getXmlMessageInputSource()); + } + if (testDecoder.getMessageType() == MessageType.HEARTBEAT.getValue()){ + System.out.println(bytesToInt(testDecoder.getMessage())); + } + } } @@ -50,25 +60,14 @@ public class TCPServer private static byte[] getBytes(InputStream inStream) throws IOException { byte[] headerBytes = new byte[15]; int i = inStream.read(headerBytes); - System.out.println(i); byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15); - short messageLen = bytesToShort(messageLenBytes); - System.out.println("m " + messageLen); + short messageLen = bytesToShort(messageLenBytes, ByteOrder.BIG_ENDIAN); byte[] messageBytesWithCRC = new byte[messageLen+4]; int j = inStream.read(messageBytesWithCRC); - System.out.println(j); ByteBuffer binaryMessageBytes = ByteBuffer.allocate(i+j); binaryMessageBytes.put(headerBytes); binaryMessageBytes.put(messageBytesWithCRC); return binaryMessageBytes.array(); } - private static short bytesToShort(byte[] bytesShort){ - ByteBuffer byteBuffer = ByteBuffer.allocate(2); - byteBuffer.put(bytesShort[0]); - byteBuffer.put(bytesShort[1]); - short shortVal = byteBuffer.getShort(0); - return shortVal; - } - } diff --git a/src/main/java/seng302/TCPClient.java b/src/main/java/seng302/TCPClient.java deleted file mode 100644 index 62279d13..00000000 --- a/src/main/java/seng302/TCPClient.java +++ /dev/null @@ -1,61 +0,0 @@ -package seng302; -import seng302.Networking.BinaryMesageEncoder; -import seng302.Networking.BinaryMessageDecoder; -import seng302.Networking.MessageEncoders.XMLMessageEncoder; -import seng302.Networking.Utils.MessageType; - -import java.io.*; -import java.net.*; - -/** - * TCP client to recive information from AC35 data source - */ -public class TCPClient -{ - public static void main(String argv[]) throws Exception - { - -// String sentence; -// String modifiedSentence; -// BufferedReader inFromUser = new BufferedReader( new InputStreamReader(System.in)); -// Socket clientSocket = new Socket("localhost", 6789); -// DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); -// BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); -// sentence = inFromUser.readLine(); -// outToServer.writeBytes(sentence + '\n'); -// modifiedSentence = inFromServer.readLine(); -// System.out.println("FROM SERVER: " + modifiedSentence); -// clientSocket.close(); - TCPClient client = new TCPClient(); - } - - TCPClient() throws IOException{ - StringBuilder xmlString; - - BufferedReader br = new BufferedReader(new InputStreamReader( - this.getClass().getResourceAsStream(("/raceXML/Regatta.xml")))); - - String line; - xmlString = new StringBuilder(); - while((line=br.readLine())!= null){ - xmlString.append(line.trim()); - } - XMLMessageEncoder encodedMessage = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)xmlString.length(), xmlString.toString()); - byte[] encodedXML = encodedMessage.encode(); - - BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), 1, (short)encodedXML.length, encodedXML); - - /**************sockets*******************/ - - //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port - Socket mockSocket = new Socket("localhost", 4942); - - while(true) - { - DataOutputStream outToVisualiser = new DataOutputStream(mockSocket.getOutputStream()); - outToVisualiser.write(binaryMesageEncoder.getFullMessage()); - } - /**************sockets*******************/ - } - -} \ No newline at end of file