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]
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+18
-19
@@ -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*******************/
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user