Worked on the MockOutput Class

-Renamed TCPclient to MockOutput
-Renamed TCPserver toVisualiserInput
-set up a heartbeat message to send every 5 seconds
-set up a method for mockoutput to handle xml strings

-minor edits to VisualiserInput to print the data it gets

#story[778]
main
hba56 9 years ago
parent 8223ae46a1
commit bd7fefd67e

@ -56,7 +56,7 @@ public class BinaryMessageDecoder {
crc.update(this.fullMessage); crc.update(this.fullMessage);
//run through the checks //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 does not equal the message length");
System.err.println("message length in header: " + ByteConverter.bytesToInt(this.headerMessageLength)); System.err.println("message length in header: " + ByteConverter.bytesToInt(this.headerMessageLength));
System.err.println("message length: " + this.message.length); System.err.println("message length: " + this.message.length);

@ -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<byte[]> 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();
}
}

@ -1,6 +1,7 @@
package seng302; package seng302.Networking;
import seng302.Networking.BinaryMessageDecoder; import seng302.Networking.BinaryMessageDecoder;
import seng302.Networking.MessageDecoders.XMLMessageDecoder; import seng302.Networking.MessageDecoders.XMLMessageDecoder;
import seng302.Networking.Utils.MessageType;
import java.io.*; import java.io.*;
import java.net.*; import java.net.*;
@ -8,19 +9,22 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.Arrays; 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 * TCP server to act as the mock AC35 streaming interface
*/ */
public class TCPServer public class VisualiserInput
{ {
public static void main(String argv[]) throws Exception public static void main(String argv[]) throws Exception
{ {
//socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port //socket port 4942 as 4940 is ac35 live port and 4941 is ac35 test port
ServerSocket visualiserSocket = new ServerSocket(4942); ServerSocket visualiserSocket = new ServerSocket(4942);
Socket connectionSocket = visualiserSocket.accept();
while(true) while(true)
{ {
Socket connectionSocket = visualiserSocket.accept();
InputStream inFromClient = connectionSocket.getInputStream(); InputStream inFromClient = connectionSocket.getInputStream();
byte[] binaryMessage = getBytes(inFromClient); byte[] binaryMessage = getBytes(inFromClient);
@ -32,10 +36,16 @@ public class TCPServer
System.out.println(testDecoder.getSourceID()); System.out.println(testDecoder.getSourceID());
System.out.println(testDecoder.getMessageLength()); System.out.println(testDecoder.getMessageLength());
System.out.println("----"); System.out.println("----");
XMLMessageDecoder xmlMessageDecoder = new XMLMessageDecoder(testDecoder.getMessage()); if (testDecoder.getMessageType() == MessageType.XMLMESSAGE.getValue()){
xmlMessageDecoder.decode(); XMLMessageDecoder xmlMessageDecoder = new XMLMessageDecoder(testDecoder.getMessage());
System.out.println("--message--"); xmlMessageDecoder.decode();
System.out.println(xmlMessageDecoder.getXmlMessageInputSource()); 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 { private static byte[] getBytes(InputStream inStream) throws IOException {
byte[] headerBytes = new byte[15]; byte[] headerBytes = new byte[15];
int i = inStream.read(headerBytes); int i = inStream.read(headerBytes);
System.out.println(i);
byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15); byte[] messageLenBytes = Arrays.copyOfRange(headerBytes, 13, 15);
short messageLen = bytesToShort(messageLenBytes); short messageLen = bytesToShort(messageLenBytes, ByteOrder.BIG_ENDIAN);
System.out.println("m " + messageLen);
byte[] messageBytesWithCRC = new byte[messageLen+4]; byte[] messageBytesWithCRC = new byte[messageLen+4];
int j = inStream.read(messageBytesWithCRC); int j = inStream.read(messageBytesWithCRC);
System.out.println(j);
ByteBuffer binaryMessageBytes = ByteBuffer.allocate(i+j); ByteBuffer binaryMessageBytes = ByteBuffer.allocate(i+j);
binaryMessageBytes.put(headerBytes); binaryMessageBytes.put(headerBytes);
binaryMessageBytes.put(messageBytesWithCRC); binaryMessageBytes.put(messageBytesWithCRC);
return binaryMessageBytes.array(); 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;
}
} }

@ -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*******************/
}
}
Loading…
Cancel
Save