- Encodes heartBeat - Encodes raceStatus - Encodes displayTextMessage - Encodes raceStartStatus - Encodes yachtEventCode #story[778]main
commit
54a2c08258
@ -0,0 +1,102 @@
|
|||||||
|
package seng302;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by hba56 on 20/04/17.
|
||||||
|
*/
|
||||||
|
public class XMLMessageDecoder {
|
||||||
|
private byte messageVersionNumber;
|
||||||
|
private short ackNumber;
|
||||||
|
private long timeStamp;
|
||||||
|
private byte xmlMsgSubType;
|
||||||
|
private short sequenceNumber;
|
||||||
|
private short xmlMsgLength;
|
||||||
|
private String xmlMessage;
|
||||||
|
|
||||||
|
private byte[] bytes;
|
||||||
|
|
||||||
|
public XMLMessageDecoder(byte[] bytes) {
|
||||||
|
this.bytes = bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void decode(){
|
||||||
|
byte[] ackNumberBytes = Arrays.copyOfRange(bytes, 1, 3);
|
||||||
|
byte[] timeStampBytes = Arrays.copyOfRange(bytes, 3, 9);
|
||||||
|
byte[] sequenceNumberBytes = Arrays.copyOfRange(bytes, 10, 12);
|
||||||
|
byte[] xmlMsgLengthBytes = Arrays.copyOfRange(bytes, 12, 14);
|
||||||
|
byte[] xmlMessagebytes = Arrays.copyOfRange(bytes, 14, bytes.length);
|
||||||
|
|
||||||
|
this.xmlMsgSubType = bytes[9];
|
||||||
|
this.messageVersionNumber = bytes[0];
|
||||||
|
this.ackNumber = bytesToShort(ackNumberBytes);
|
||||||
|
|
||||||
|
this.timeStamp = bytesToLong(timeStampBytes);
|
||||||
|
|
||||||
|
this.sequenceNumber = bytesToShort(sequenceNumberBytes);
|
||||||
|
this.xmlMsgLength = bytesToShort(xmlMsgLengthBytes);
|
||||||
|
this.xmlMessage = new String(xmlMessagebytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private short bytesToShort(byte[] bytesShort){
|
||||||
|
ByteBuffer byteBuffer = ByteBuffer.allocate(2);
|
||||||
|
byteBuffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
byteBuffer.put(bytesShort[0]);
|
||||||
|
byteBuffer.put(bytesShort[1]);
|
||||||
|
short shortVal = byteBuffer.getShort(0);
|
||||||
|
return shortVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
private long bytesToLong(byte[] bytesLong){
|
||||||
|
ByteBuffer byteBuffer = ByteBuffer.allocate(8);
|
||||||
|
byteBuffer.order(ByteOrder.BIG_ENDIAN);
|
||||||
|
byteBuffer.put((byte)0);
|
||||||
|
byteBuffer.put((byte)0);
|
||||||
|
byteBuffer.put(bytesLong[0]);
|
||||||
|
byteBuffer.put(bytesLong[1]);
|
||||||
|
byteBuffer.put(bytesLong[2]);
|
||||||
|
byteBuffer.put(bytesLong[3]);
|
||||||
|
byteBuffer.put(bytesLong[4]);
|
||||||
|
byteBuffer.put(bytesLong[5]);
|
||||||
|
|
||||||
|
// System.out.println("====decode====");
|
||||||
|
// for (byte i:byteBuffer.array()
|
||||||
|
// ) {
|
||||||
|
// System.out.println(i);
|
||||||
|
// }
|
||||||
|
// System.out.println("====decode====");
|
||||||
|
|
||||||
|
long longVal = byteBuffer.getLong(0);
|
||||||
|
return longVal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getMessageVersionNumber() {
|
||||||
|
return messageVersionNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getAckNumber() {
|
||||||
|
return ackNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getTimeStamp() {
|
||||||
|
return timeStamp;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getXmlMsgSubType() {
|
||||||
|
return xmlMsgSubType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getSequenceNumber() {
|
||||||
|
return sequenceNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
public short getXmlMsgLength() {
|
||||||
|
return xmlMsgLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getXmlMessage() {
|
||||||
|
return xmlMessage;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,77 @@
|
|||||||
|
package seng302;
|
||||||
|
|
||||||
|
import java.nio.ByteBuffer;
|
||||||
|
import java.nio.ByteOrder;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes a XML file into a message of AC35 format
|
||||||
|
*/
|
||||||
|
public class XMLMessageEncoder {
|
||||||
|
private byte messageVersionNumber;
|
||||||
|
private short ackNumber;
|
||||||
|
private long timeStamp;
|
||||||
|
private byte xmlMsgSubType;
|
||||||
|
private short sequenceNumber;
|
||||||
|
private short xmlMsgLength;
|
||||||
|
private String xmlMessage;
|
||||||
|
|
||||||
|
public XMLMessageEncoder(byte messageVersionNumber, short ackNumber, long timeStamp, byte xmlMsgSubType, short sequenceNumber, short xmlMsgLenght, String xmlMessage) {
|
||||||
|
this.messageVersionNumber = messageVersionNumber;
|
||||||
|
this.ackNumber = ackNumber;
|
||||||
|
this.timeStamp = timeStamp;
|
||||||
|
this.xmlMsgSubType = xmlMsgSubType;
|
||||||
|
this.sequenceNumber = sequenceNumber;
|
||||||
|
this.xmlMsgLength = xmlMsgLenght;
|
||||||
|
this.xmlMessage = xmlMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] encode() {
|
||||||
|
byte[] messageBytes = xmlMessage.getBytes();
|
||||||
|
if (messageBytes.length > this.xmlMsgLength) {
|
||||||
|
//System.err.println("Xml message is to big");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
ByteBuffer tempOutputByteBuffer = ByteBuffer.allocate(14 + messageBytes.length);
|
||||||
|
|
||||||
|
//ackNumber converted to bytes
|
||||||
|
byte[] ackNumberBytes = new byte[2];
|
||||||
|
ackNumberBytes[0] = (byte) (ackNumber & 0xff);
|
||||||
|
ackNumberBytes[1] = (byte) ((ackNumber >> 8) & 0xff);
|
||||||
|
|
||||||
|
//sequenceNumber converted to bytes
|
||||||
|
byte[] sequenceNumberBytes = new byte[2];
|
||||||
|
sequenceNumberBytes[0] = (byte) (sequenceNumber & 0xff);
|
||||||
|
sequenceNumberBytes[1] = (byte) ((sequenceNumber >> 8) & 0xff);
|
||||||
|
|
||||||
|
//xmlMsgLength converted to bytes
|
||||||
|
byte[] xmlMsgLengthBytes = new byte[2];
|
||||||
|
xmlMsgLengthBytes[0] = (byte) (xmlMsgLength & 0xff);
|
||||||
|
xmlMsgLengthBytes[1] = (byte) ((xmlMsgLength >> 8) & 0xff);
|
||||||
|
|
||||||
|
|
||||||
|
tempOutputByteBuffer.put(messageVersionNumber);
|
||||||
|
tempOutputByteBuffer.put(ackNumberBytes);
|
||||||
|
tempOutputByteBuffer.put(longToSixBytes(timeStamp));
|
||||||
|
tempOutputByteBuffer.put(xmlMsgSubType);
|
||||||
|
tempOutputByteBuffer.put(sequenceNumberBytes);
|
||||||
|
tempOutputByteBuffer.put(xmlMsgLengthBytes);
|
||||||
|
tempOutputByteBuffer.put(messageBytes);
|
||||||
|
|
||||||
|
return tempOutputByteBuffer.array();
|
||||||
|
}
|
||||||
|
|
||||||
|
private byte[] longToSixBytes(long x) {
|
||||||
|
ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
|
||||||
|
buffer.putLong(x);
|
||||||
|
|
||||||
|
// System.out.println("====encode====");
|
||||||
|
// for (byte i:buffer.array()
|
||||||
|
// ) {
|
||||||
|
// System.out.println(i);
|
||||||
|
// }
|
||||||
|
// System.out.println("====encode====");
|
||||||
|
|
||||||
|
return Arrays.copyOfRange(buffer.array(), 2, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,47 @@
|
|||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import seng302.XMLMessageDecoder;
|
||||||
|
import seng302.XMLMessageEncoder;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStreamReader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by hba56 on 20/04/17.
|
||||||
|
*/
|
||||||
|
public class XMLMessageDecoderTest {
|
||||||
|
@Test
|
||||||
|
public void getByteArrayTest(){
|
||||||
|
try{
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
long time = System.currentTimeMillis();
|
||||||
|
XMLMessageEncoder testEncoder = new XMLMessageEncoder((byte)1, (short)1, time, (byte)7, (short)1, (short)xmlString.length(), xmlString.toString());
|
||||||
|
|
||||||
|
byte[] encodedXML = testEncoder.encode();
|
||||||
|
|
||||||
|
XMLMessageDecoder decoderXML = new XMLMessageDecoder(encodedXML);
|
||||||
|
decoderXML.decode();
|
||||||
|
|
||||||
|
|
||||||
|
Assert.assertEquals((byte)1, decoderXML.getMessageVersionNumber());
|
||||||
|
Assert.assertEquals((short)1, decoderXML.getAckNumber());
|
||||||
|
Assert.assertEquals(time, decoderXML.getTimeStamp());
|
||||||
|
Assert.assertEquals((byte)7, decoderXML.getXmlMsgSubType());
|
||||||
|
Assert.assertEquals((short)1, decoderXML.getSequenceNumber());
|
||||||
|
Assert.assertEquals((short)xmlString.length(), decoderXML.getXmlMsgLength());
|
||||||
|
Assert.assertEquals(xmlString.toString(), decoderXML.getXmlMessage());
|
||||||
|
|
||||||
|
|
||||||
|
}catch (IOException e){
|
||||||
|
System.out.println(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,53 @@
|
|||||||
|
import org.junit.Assert;
|
||||||
|
import org.junit.Test;
|
||||||
|
import seng302.XMLMessageEncoder;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by hba56 on 19/04/17.
|
||||||
|
*/
|
||||||
|
public class XMLMessageEncoderTest {
|
||||||
|
@Test
|
||||||
|
public void getByteArrayTest(){
|
||||||
|
StringBuilder xmlString;
|
||||||
|
try{
|
||||||
|
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 testEncoder = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)xmlString.length(), xmlString.toString());
|
||||||
|
|
||||||
|
byte[] encodedXML = testEncoder.encode();
|
||||||
|
|
||||||
|
//1 + 2 + 6 + 1 + 2 + 2 + 374
|
||||||
|
Assert.assertEquals(388, encodedXML.length);
|
||||||
|
}catch (IOException e){
|
||||||
|
System.out.println(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void getByteArrayNullTest(){
|
||||||
|
StringBuilder xmlString;
|
||||||
|
try{
|
||||||
|
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 testEncoder = new XMLMessageEncoder((byte)1, (short)1, System.currentTimeMillis(), (byte)7, (short)1, (short)1, xmlString.toString());
|
||||||
|
|
||||||
|
byte[] encodedXML = testEncoder.encode();
|
||||||
|
|
||||||
|
Assert.assertEquals(null, encodedXML);
|
||||||
|
}catch (IOException e){
|
||||||
|
System.out.println(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
||||||
|
<RegattaConfig>
|
||||||
|
<RegattaID>1</RegattaID>
|
||||||
|
<RegattaName>Seng302 Mock Test</RegattaName>
|
||||||
|
<CourseName>Bermuda AC35</CourseName>
|
||||||
|
<CentralLatitude>-32.296577</CentralLatitude>
|
||||||
|
<CentralLongitude>64.854304</CentralLongitude>
|
||||||
|
<CentralAltitude>0.00</CentralAltitude>
|
||||||
|
<UtcOffset>-4</UtcOffset>
|
||||||
|
<MagneticVariation>-14.78</MagneticVariation>
|
||||||
|
</RegattaConfig>
|
||||||
Loading…
Reference in new issue