Skip to content
Snippets Groups Projects
Commit 3192ddec authored by brutzman's avatar brutzman
Browse files

various refinements

parent 85eeae9d
No related branches found
No related tags found
No related merge requests found
......@@ -23,7 +23,7 @@ public class EspduSender
/**
* Putting any upper limit on # packets sent avoids possibility of non-terminating infinite loops that continue sending packets.
*/
public static final int NUMBER_PDUS_TO_SEND = 5; // 5000
public static final int NUMBER_OF_LOOPS = 1; // 5
/**
* Default multicast group address we send on.
......@@ -38,6 +38,11 @@ public class EspduSender
public enum NetworkMode {
UNICAST, MULTICAST, BROADCAST
};
/**
* Output prefix to identify this class
*/
private final static String TRACE_PREFIX = "[" + EspduSender.class.getName() + "] ";
/**
* Possible system properties, passed in via -Dattr=val networkMode:
......@@ -53,16 +58,16 @@ public class EspduSender
@SuppressWarnings("SleepWhileInLoop") // allows Thread.sleep(value) without warning in code
public static void main(String args[])
{
System.out.println("OpenDis7Examples.EspduSender started...");
System.out.println(TRACE_PREFIX + " started...");
// Default settings. These are used if no system properties are set.
// If system properties are passed in, these are overridden later.
NetworkMode networkMode = NetworkMode.BROADCAST;
InetAddress address = null; // must be initialized, even if null
int port = DEFAULT_MULTICAST_PORT;
MulticastSocket socket = null; // must be initialized to avoid later error, even if null;
EntityStatePdu espdu = new EntityStatePdu();
DisTime disTime = new DisTime();
// Default settings. These are used if no system properties are set.
// If system properties are passed in, these are overridden later.
NetworkMode networkMode = NetworkMode.MULTICAST;
InetAddress address = null; // must be initialized, even if null
int port = DEFAULT_MULTICAST_PORT;
MulticastSocket socket = null; // must be initialized to avoid later error, even if null;
EntityStatePdu espdu = new EntityStatePdu();
DisTime disTime = new DisTime();
// ICBM coordinates for my office
double latitude = 36.595517;
......@@ -73,7 +78,7 @@ public class EspduSender
}
catch (UnknownHostException e)
{
System.out.println(e + " Cannot create multicast address");
System.out.println(TRACE_PREFIX + e + " Cannot create multicast address");
System.exit(0);
}
......@@ -125,14 +130,27 @@ public class EspduSender
socket.joinGroup(address); // TODO select correct NetworkInterface
}
} // end networkModeString
else if (networkMode == NetworkMode.MULTICAST)
{
networkModeString = "multicast";
}
else if (networkMode == NetworkMode.UNICAST)
{
networkModeString = "unicast";
}
else if (networkMode == NetworkMode.BROADCAST)
{
networkModeString = "broadcast";
}
}
catch (IOException | RuntimeException e)
{
System.out.println("Unable to initialize network correctly, exiting.");
System.out.println(TRACE_PREFIX + "Unable to initialize network correctly, exiting.");
System.out.println(e);
System.exit(-1); // outta here
}
System.out.println("EspduPduSender: sending ESPDU packets to " + address.getHostAddress() + " port " + port);
System.out.println(TRACE_PREFIX + " sending " + networkModeString + " ESPDU packets to " +
address.getHostAddress() + " port " + port);
// Initialize values in the Entity State PDU object. The exercise ID is
// a way to differentiate between different virtual worlds on one network.
......@@ -158,21 +176,22 @@ public class EspduSender
// enumerations in C++ and Java, but to keep things simple we just use
// numbers here.
// Manual way to identify platform information:
EntityType entityType = espdu.getEntityType();
entityType.setEntityKind (EntityKind.PLATFORM); //(short) 1); // Platform (vs lifeform, munition, sensor, etc.)
entityType.setCountry (Country.UNITED_STATES_OF_AMERICA_USA); // 225 USA
entityType.setDomain (Domain.inst(PlatformDomain.LAND)); // Land (vs air, surface, subsurface, space)
entityType.setCategory ((byte) 1); // Tank
entityType.setSubCategory((byte) 1); // M1 Abrams
entityType.setSpecific ((byte) 3); // M1A2 Abrams
// Manual way to override platform information:
EntityType entityType = espdu.getEntityType()
.setEntityKind (EntityKind.PLATFORM).setEntityKind (EntityKind.PLATFORM) //(short) 1); // Platform (vs lifeform, munition, sensor, etc.); //(short) 1); // Platform (vs lifeform, munition, sensor, etc.)
.setCountry (Country.UNITED_STATES_OF_AMERICA_USA) // 225 USA
.setDomain (Domain.inst(PlatformDomain.LAND)) // Land (vs air, surface, subsurface, space)
.setCategory ((byte) 1) // Tank
.setSubCategory((byte) 1) // M1 Abrams
.setSpecific ((byte) 3); // M1A2 Abrams
// New way using entity jar(s)
espdu.setEntityType(new edu.nps.moves.dis7.entities.usa.platform.land.M1A2());
// or simply use import statement above
// or simply use an enumeration by name, with accompanying import statement above
espdu.setEntityType(new M1A2());
// Inspecting an enumeration:
// Inspecting an enumeration
System.out.println("===============");
System.out.println("espdu entityType information:");
System.out.println(" EntityKind =" + espdu.getEntityType().getEntityKind());
System.out.println(" Country =" + espdu.getEntityType().getCountry());
......@@ -186,9 +205,9 @@ public class EspduSender
try // Loop through sending N ESPDUs
{
System.out.println("Sending " + NUMBER_PDUS_TO_SEND + " sets of packets:"); // + address.toString()
System.out.println(TRACE_PREFIX + "sending " + NUMBER_OF_LOOPS + " sets of packets:"); // + address.toString()
for (int index = 0; index < NUMBER_PDUS_TO_SEND; index++)
for (int index = 0; index < NUMBER_OF_LOOPS; index++)
{
// DIS time is a pain in the uh, neck. DIS time units are 2^31-1 units per
// hour, and time is set to DIS time units from the top of the hour.
......@@ -276,22 +295,53 @@ public class EspduSender
FirePdu firePdu = new FirePdu();
firePdu.setLocationInWorldCoordinates(espdu.getEntityLocation());
byte[] fireArray = firePdu.marshal();
// CommentPdu newCommentPdu = new CommentPdu();
// ArrayList<VariableDatum> payloadList = new ArrayList<>();
// ArrayList<String> commentsList = new ArrayList<>();
// commentsList.add("Hello CommentPDU");
// commentsList.add("Here is a second line of text in this comment.");
// if (!commentsList.isEmpty())
// System.out.println("Preparing CommentPDU:");
//
// for (String comment : commentsList)
// {
// VariableDatum newVariableDatum = new VariableDatum();
// newVariableDatum.setVariableDatumValue (comment.getBytes()); // conversion
// newVariableDatum.setVariableDatumLengthInBytes(comment.getBytes().length); // also available in bits, see spec and javadoc
// // alternatively, you do not need to set this and the marshaller will figure it out from the byte array
// // (see javadoc for VariableDatum.setVariableDatumLength())
// payloadList.add(newVariableDatum);
// System.out.println(" \"" + comment + "\"");
// }
// newCommentPdu.setVariableDatums(payloadList);
// byte[] commentArray = newCommentPdu.marshal();
localNetworkAddresses = getBroadcastAddresses();
for (InetAddress networkAddress : localNetworkAddresses) {
if (espduArray.length > 0)
{
System.out.println("Sending espdu datagram packet to " + String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
System.out.println(TRACE_PREFIX + "sending datagram packet [" + espdu.getPduType().toString() + "] to " +
String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
packet = new DatagramPacket(espduArray, espduArray.length, networkAddress, port);
socket.send(packet);
}
// TODO experiment with these! 8)
if (fireArray.length > 0)
{
System.out.println("Sending fire datagram packet to " + String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
System.out.println(TRACE_PREFIX + "sending datagram packet [" + firePdu.getPduType().toString() + " ] to " +
String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
packet = new DatagramPacket(fireArray, fireArray.length, networkAddress, port); // alternate
socket.send(packet);
}
// // TODO experiment with these! 8)
// if (newCommentPdu != null)
// {
// System.out.println(TRACE_PREFIX + "sending datagram packet [" + newCommentPdu.getPduType().toString() + " ] to " +
// String.format("%-15s", networkAddress.getHostAddress()) + " port " + port);
// packet = new DatagramPacket(commentArray, commentArray.length, networkAddress, port); // alternate
// socket.send(packet);
// }
}
// Send every 1 second within loop. Otherwise all this will be all over in a fraction of a second.
Thread.sleep(1000); // msec
......@@ -299,11 +349,11 @@ public class EspduSender
}
catch (Exception e)
{
System.out.println("Problem with OpenDis7Examples.EspduSender, see exception trace:");
System.out.println(TRACE_PREFIX + "Problem with " + e.getMessage() + ", see exception trace:");
System.out.println(e);
}
System.out.println("===============");
System.out.println("OpenDis7Examples.EspduSender complete.");
System.out.println(TRACE_PREFIX + "complete.");
}
/**
......@@ -350,7 +400,7 @@ public class EspduSender
}
catch (SocketException e)
{
System.out.println("Problem with OpenDis7Examples.EspduSender.getBroadcastAddresses(), see exception trace:");
System.out.println(TRACE_PREFIX + "Problem with .getBroadcastAddresses(), see exception trace:" + e.getMessage());
System.out.println(e);
}
return broadcastAddresses;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment