updated the visualiserinput to be a thread
#story[782]
This commit is contained in:
+2
-2
@@ -14,7 +14,7 @@ import static seng302.Networking.Utils.ByteConverter.shortToBytes;
|
|||||||
/**
|
/**
|
||||||
* Created by hba56 on 21/04/17.
|
* Created by hba56 on 21/04/17.
|
||||||
*/
|
*/
|
||||||
public class BinaryMesageEncoder {
|
public class BinaryMessageEncoder {
|
||||||
private byte[] fullMessage;
|
private byte[] fullMessage;
|
||||||
private byte[] header;
|
private byte[] header;
|
||||||
private byte[] message;
|
private byte[] message;
|
||||||
@@ -27,7 +27,7 @@ public class BinaryMesageEncoder {
|
|||||||
private int headerSourceID;
|
private int headerSourceID;
|
||||||
private short headerMessageLength;
|
private short headerMessageLength;
|
||||||
|
|
||||||
public BinaryMesageEncoder(MessageType headerMessageType, long headerTimeStamp, int headerSourceID, short headerMessageLength, byte[] message){
|
public BinaryMessageEncoder(MessageType headerMessageType, long headerTimeStamp, int headerSourceID, short headerMessageLength, byte[] message){
|
||||||
//set the header
|
//set the header
|
||||||
this.headerMessageType = headerMessageType.getValue();
|
this.headerMessageType = headerMessageType.getValue();
|
||||||
this.headerTimeStamp = headerTimeStamp;
|
this.headerTimeStamp = headerTimeStamp;
|
||||||
@@ -1,7 +1,9 @@
|
|||||||
package seng302.Networking;
|
package seng302.Networking;
|
||||||
|
|
||||||
|
import SharedModel.BoatInRace;
|
||||||
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
import seng302.Networking.MessageEncoders.RaceVisionByteEncoder;
|
||||||
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
||||||
|
import seng302.Networking.Utils.BoatLocationMessage;
|
||||||
import seng302.Networking.Utils.MessageType;
|
import seng302.Networking.Utils.MessageType;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@@ -27,6 +29,7 @@ public class MockOutput implements Runnable
|
|||||||
private short messageNumber = 1;
|
private short messageNumber = 1;
|
||||||
private short xmlSequenceNumber = 1;
|
private short xmlSequenceNumber = 1;
|
||||||
private int heartbeatSequenceNum = 1;
|
private int heartbeatSequenceNum = 1;
|
||||||
|
private int boatLocationSequenceNumber = 1;
|
||||||
|
|
||||||
public MockOutput() throws IOException {
|
public MockOutput() throws IOException {
|
||||||
//start Time
|
//start Time
|
||||||
@@ -48,9 +51,9 @@ public class MockOutput implements Runnable
|
|||||||
private byte[] heartbeat(){
|
private byte[] heartbeat(){
|
||||||
byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum);
|
byte[] heartbeatMessage = messageEncoder.heartBeat(heartbeatSequenceNum);
|
||||||
heartbeatSequenceNum++;
|
heartbeatSequenceNum++;
|
||||||
BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage);
|
BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.HEARTBEAT, System.currentTimeMillis(), messageNumber, (short)heartbeatMessage.length, heartbeatMessage);
|
||||||
messageNumber++;
|
messageNumber++;
|
||||||
return binaryMesageEncoder.getFullMessage();
|
return binaryMessageEncoder.getFullMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -64,18 +67,32 @@ public class MockOutput implements Runnable
|
|||||||
xmlSequenceNumber++;
|
xmlSequenceNumber++;
|
||||||
byte[] encodedXML = encoder.encode();
|
byte[] encodedXML = encoder.encode();
|
||||||
|
|
||||||
BinaryMesageEncoder binaryMesageEncoder = new BinaryMesageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), messageNumber, (short)encodedXML.length, encodedXML);
|
BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.XMLMESSAGE, System.currentTimeMillis(), messageNumber, (short)encodedXML.length, encodedXML);
|
||||||
//iterates the message number
|
//iterates the message number
|
||||||
messageNumber++;
|
messageNumber++;
|
||||||
|
|
||||||
addMessageToBufferToSend(binaryMesageEncoder.getFullMessage());
|
addMessageToBufferToSend(binaryMessageEncoder.getFullMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to give the mocOutput information about boat location to be made into a message and sent
|
* Used to give the mocOutput information about boat location to be made into a message and sent
|
||||||
*/
|
*/
|
||||||
public void parseBoatLocation(){
|
public void parseBoatLocation(BoatInRace boat){
|
||||||
/// TODO: 26/04/17
|
BoatLocationMessage boatLocationMessage = new BoatLocationMessage(boat, boatLocationSequenceNumber);
|
||||||
|
//iterates the sequence number
|
||||||
|
boatLocationSequenceNumber++;
|
||||||
|
|
||||||
|
//encodeds the messages
|
||||||
|
byte[] encodedBoatLoc = messageEncoder.boatLocation(boatLocationMessage);
|
||||||
|
|
||||||
|
//encodeds the full message with header
|
||||||
|
BinaryMessageEncoder binaryMessageEncoder = new BinaryMessageEncoder(MessageType.BOATLOCATION, System.currentTimeMillis(), messageNumber, (short)encodedBoatLoc.length,
|
||||||
|
encodedBoatLoc);
|
||||||
|
|
||||||
|
//iterates the message number
|
||||||
|
messageNumber++;
|
||||||
|
|
||||||
|
addMessageToBufferToSend(binaryMessageEncoder.getFullMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addMessageToBufferToSend(byte[] messagesToSendBuffer) {
|
private void addMessageToBufferToSend(byte[] messagesToSendBuffer) {
|
||||||
|
|||||||
@@ -1,11 +1,8 @@
|
|||||||
package seng302.Networking.PacketDump;
|
package seng302.Networking.PacketDump;
|
||||||
|
|
||||||
import seng302.Networking.BinaryMesageEncoder;
|
|
||||||
import seng302.Networking.BinaryMessageDecoder;
|
import seng302.Networking.BinaryMessageDecoder;
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
|
|||||||
@@ -4,7 +4,9 @@ package seng302.Networking.Utils;
|
|||||||
* Created by f123 on 21-Apr-17.
|
* Created by f123 on 21-Apr-17.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import SharedModel.BoatInRace;
|
||||||
import SharedModel.Constants;
|
import SharedModel.Constants;
|
||||||
|
import SharedModel.GPSCoordinate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents the information in a boat location message (AC streaming spec: 4.9).
|
* Represents the information in a boat location message (AC streaming spec: 4.9).
|
||||||
@@ -147,6 +149,33 @@ public class BoatLocationMessage extends AC35Data
|
|||||||
this.rudderAngle = rudderAngle;
|
this.rudderAngle = rudderAngle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BoatLocationMessage(BoatInRace boat, long sequenceNumber) {
|
||||||
|
super(MessageType.BOATLOCATION);
|
||||||
|
|
||||||
|
this.messageVersionNumber = (byte) 1;
|
||||||
|
this.time = System.currentTimeMillis();
|
||||||
|
this.sourceID = boat.getSourceID();
|
||||||
|
this.sequenceNumber = sequenceNumber;
|
||||||
|
this.deviceType = 1;
|
||||||
|
this.latitude = 0;//boat.getCurrentPosition().getLatitude();
|
||||||
|
this.longitude = 0;//boat.getCurrentPosition().getLongitude();
|
||||||
|
this.altitude = 0;
|
||||||
|
this.heading = 0;
|
||||||
|
this.pitch = 0;
|
||||||
|
this.roll = 0;
|
||||||
|
this.boatSpeed = 0;
|
||||||
|
this.boatCOG = 0;
|
||||||
|
this.boatSOG = 0;
|
||||||
|
this.apparentWindSpeed = 0;
|
||||||
|
this.apparentWindAngle = 0;
|
||||||
|
this.trueWindSpeed = 0;
|
||||||
|
this.trueWindDirection = 0;
|
||||||
|
this.trueWindAngle = 0;
|
||||||
|
this.currentDrift = 0;
|
||||||
|
this.currentSet = 0;
|
||||||
|
this.rudderAngle = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
//Getters and setters for message properties.
|
//Getters and setters for message properties.
|
||||||
|
|
||||||
|
|||||||
@@ -17,13 +17,12 @@ import static seng302.Networking.Utils.MessageType.*;
|
|||||||
/**
|
/**
|
||||||
* TCP server to act as the mock AC35 streaming interface
|
* TCP server to act as the mock AC35 streaming interface
|
||||||
*/
|
*/
|
||||||
public class VisualiserInput
|
public class VisualiserInput implements Runnable
|
||||||
{
|
{
|
||||||
//time since last heartbeat
|
//time since last heartbeat
|
||||||
private long lastHeartbeatTime;
|
private long lastHeartbeatTime;
|
||||||
|
|
||||||
//socket port 4945 as 4940 is ac35 live port and 4941 is ac35 test port
|
//socket port 4945 as 4940 is ac35 live port and 4941 is ac35 test port
|
||||||
private ServerSocket visualiserSocket;
|
|
||||||
private Socket connectionSocket;
|
private Socket connectionSocket;
|
||||||
|
|
||||||
long heartbeatSeqNum;
|
long heartbeatSeqNum;
|
||||||
@@ -32,91 +31,14 @@ public class VisualiserInput
|
|||||||
|
|
||||||
VisualiserInput() throws IOException{
|
VisualiserInput() throws IOException{
|
||||||
|
|
||||||
Socket connectionSocket = new Socket(InetAddress.getLocalHost(), 4942);
|
// connectionSocket = new Socket(InetAddress.getLocalHost(), 4942);
|
||||||
|
|
||||||
//this is the test data that streams form the AC35 website
|
//this is the test data that streams form the AC35 website
|
||||||
// Socket connectionSocket = new Socket("livedata.americascup.com",4941);
|
connectionSocket = new Socket("livedata.americascup.com",4941);
|
||||||
|
|
||||||
|
|
||||||
//start Time
|
//start Time
|
||||||
lastHeartbeatTime = System.currentTimeMillis();
|
lastHeartbeatTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
|
||||||
//receiver loop that gets the input
|
|
||||||
boolean receiverLoop = true;
|
|
||||||
while(receiverLoop) {
|
|
||||||
//gets the input from the socket
|
|
||||||
InputStream inFromClient = connectionSocket.getInputStream();
|
|
||||||
|
|
||||||
//converts the input into a byte array that can be read by the decoder
|
|
||||||
byte[] binaryMessage = getBytes(inFromClient);
|
|
||||||
|
|
||||||
//decode the binary message into readable date
|
|
||||||
BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(binaryMessage);
|
|
||||||
AC35Data data = testDecoder.decode();
|
|
||||||
if (data == null){
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
//checks which message is being received and does what is needed for that message
|
|
||||||
MessageType mType = data.getType();
|
|
||||||
switch (mType) {
|
|
||||||
case HEARTBEAT:
|
|
||||||
lastHeartbeatTime = System.currentTimeMillis();
|
|
||||||
//note: if the program runs for over 340 years, this will crash.
|
|
||||||
heartbeatSeqNum = ByteConverter.bytesToLong(testDecoder.getMessage());
|
|
||||||
System.out.println("HeartBeat Message! " + heartbeatSeqNum);
|
|
||||||
break;
|
|
||||||
case RACESTATUS:
|
|
||||||
System.out.println("Race Status Message");
|
|
||||||
break;
|
|
||||||
case DISPLAYTEXTMESSAGE:
|
|
||||||
System.out.println("Display Text Message");
|
|
||||||
//no decoder for this.
|
|
||||||
break;
|
|
||||||
case XMLMESSAGE:
|
|
||||||
System.out.println("XML Message!");
|
|
||||||
System.out.println(((XMLMessage)data).getXmlMessage());
|
|
||||||
break;
|
|
||||||
case RACESTARTSTATUS:
|
|
||||||
System.out.println("Race Start Status Message");
|
|
||||||
break;
|
|
||||||
case YACHTEVENTCODE:
|
|
||||||
System.out.println("Yacht Action Code!");
|
|
||||||
//no decoder
|
|
||||||
break;
|
|
||||||
case YACHTACTIONCODE:
|
|
||||||
System.out.println("Yacht Action Code!");
|
|
||||||
//no decoder
|
|
||||||
break;
|
|
||||||
case CHATTERTEXT:
|
|
||||||
System.out.println("Chatter Text Message!");
|
|
||||||
//no decoder
|
|
||||||
break;
|
|
||||||
case BOATLOCATION:
|
|
||||||
System.out.println("Boat Location Message!");
|
|
||||||
break;
|
|
||||||
case MARKROUNDING:
|
|
||||||
System.out.println("Mark Rounding Message!");
|
|
||||||
break;
|
|
||||||
case COURSEWIND:
|
|
||||||
System.out.println("Course Wind Message!");
|
|
||||||
break;
|
|
||||||
case AVGWIND:
|
|
||||||
System.out.println("Average Wind Message!");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
System.out.println("Broken Message!");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
//if no heartbeat has been received in more than 6 seconds
|
|
||||||
//the connection will need to be restarted
|
|
||||||
if (timeSinceHeartbeat() > 6){
|
|
||||||
System.out.println("Connection has stopped, trying to reconnect");
|
|
||||||
receiverLoop = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -148,9 +70,92 @@ public class VisualiserInput
|
|||||||
return binaryMessageBytes.array();
|
return binaryMessageBytes.array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void run(){
|
||||||
|
try{
|
||||||
|
//receiver loop that gets the input
|
||||||
|
boolean receiverLoop = true;
|
||||||
|
while(receiverLoop) {
|
||||||
|
//gets the input from the socket
|
||||||
|
InputStream inFromClient = connectionSocket.getInputStream();
|
||||||
|
|
||||||
|
//converts the input into a byte array that can be read by the decoder
|
||||||
|
byte[] binaryMessage = getBytes(inFromClient);
|
||||||
|
|
||||||
|
//decode the binary message into readable date
|
||||||
|
BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(binaryMessage);
|
||||||
|
AC35Data data = testDecoder.decode();
|
||||||
|
if (data == null){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//checks which message is being received and does what is needed for that message
|
||||||
|
MessageType mType = data.getType();
|
||||||
|
switch (mType) {
|
||||||
|
case HEARTBEAT:
|
||||||
|
lastHeartbeatTime = System.currentTimeMillis();
|
||||||
|
//note: if the program runs for over 340 years, this will crash.
|
||||||
|
heartbeatSeqNum = ByteConverter.bytesToLong(testDecoder.getMessage());
|
||||||
|
System.out.println("HeartBeat Message! " + heartbeatSeqNum);
|
||||||
|
break;
|
||||||
|
case RACESTATUS:
|
||||||
|
// System.out.println("Race Status Message");
|
||||||
|
break;
|
||||||
|
case DISPLAYTEXTMESSAGE:
|
||||||
|
// System.out.println("Display Text Message");
|
||||||
|
//no decoder for this.
|
||||||
|
break;
|
||||||
|
case XMLMESSAGE:
|
||||||
|
// System.out.println("XML Message!");
|
||||||
|
System.out.println(((XMLMessage)data).getXmlMessage());
|
||||||
|
break;
|
||||||
|
case RACESTARTSTATUS:
|
||||||
|
// System.out.println("Race Start Status Message");
|
||||||
|
break;
|
||||||
|
case YACHTEVENTCODE:
|
||||||
|
// System.out.println("Yacht Action Code!");
|
||||||
|
//no decoder
|
||||||
|
break;
|
||||||
|
case YACHTACTIONCODE:
|
||||||
|
// System.out.println("Yacht Action Code!");
|
||||||
|
//no decoder
|
||||||
|
break;
|
||||||
|
case CHATTERTEXT:
|
||||||
|
// System.out.println("Chatter Text Message!");
|
||||||
|
//no decoder
|
||||||
|
break;
|
||||||
|
case BOATLOCATION:
|
||||||
|
// System.out.println("Boat Location Message!");
|
||||||
|
break;
|
||||||
|
case MARKROUNDING:
|
||||||
|
// System.out.println("Mark Rounding Message!");
|
||||||
|
break;
|
||||||
|
case COURSEWIND:
|
||||||
|
// System.out.println("Course Wind Message!");
|
||||||
|
break;
|
||||||
|
case AVGWIND:
|
||||||
|
// System.out.println("Average Wind Message!");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// System.out.println("Broken Message!");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
//if no heartbeat has been received in more than 6 seconds
|
||||||
|
//the connection will need to be restarted
|
||||||
|
if (timeSinceHeartbeat() > 6){
|
||||||
|
System.out.println("Connection has stopped, trying to reconnect");
|
||||||
|
receiverLoop = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}catch(IOException e){
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String argv[]) throws Exception
|
public static void main(String argv[]) throws Exception
|
||||||
{
|
{
|
||||||
VisualiserInput reciever = new VisualiserInput();
|
VisualiserInput reciever = new VisualiserInput();
|
||||||
|
reciever.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package seng302.Networking;
|
|||||||
|
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.xml.sax.InputSource;
|
|
||||||
import seng302.Networking.MessageDecoders.XMLMessageDecoder;
|
import seng302.Networking.MessageDecoders.XMLMessageDecoder;
|
||||||
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
import seng302.Networking.MessageEncoders.XMLMessageEncoder;
|
||||||
import seng302.Networking.Utils.MessageType;
|
import seng302.Networking.Utils.MessageType;
|
||||||
@@ -29,7 +28,7 @@ public class BinaryMessageDecoderTest {
|
|||||||
|
|
||||||
byte[] encodedMessage = testEncoder.encode();
|
byte[] encodedMessage = testEncoder.encode();
|
||||||
|
|
||||||
BinaryMesageEncoder testMessage = new BinaryMesageEncoder(MessageType.XMLMESSAGE, time, 1, (short)encodedMessage.length, encodedMessage);
|
BinaryMessageEncoder testMessage = new BinaryMessageEncoder(MessageType.XMLMESSAGE, time, 1, (short)encodedMessage.length, encodedMessage);
|
||||||
|
|
||||||
BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(testMessage.getFullMessage());
|
BinaryMessageDecoder testDecoder = new BinaryMessageDecoder(testMessage.getFullMessage());
|
||||||
testDecoder.decode();
|
testDecoder.decode();
|
||||||
|
|||||||
Reference in New Issue
Block a user