Skip to content
Snippets Groups Projects
Commit 277c27bf authored by ctsfi's avatar ctsfi
Browse files

Project Progress

parent e1b1a16c
No related branches found
No related tags found
No related merge requests found
package MV3500Cohort2020JulySeptember.homework4.White.test;
import MV3500Cohort2020JulySeptember.homework4.White.working.*;
import java.io.*;
import java.net.*;
import java.util.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.utilities.*;
/**
* Receives PDUs from GermanyEspduReceiverEspduVPNSender in IEEE DIS format.
*
* @date 09/05/2020
* @author Bernd/Stefan
* @version 0.1
*/
public class PDUReciever {
/**
* Max size of a PDU in binary format that we can receive. This is actually
* somewhat outdated--PDUs can be larger--but this is a reasonable starting
* point.
*/
public static final int MAX_PDU_SIZE = 8192;
/**
* Default port used, matches Wireshark DIS capture default
*/
public static final int DEFAULT_PORT = 2317;
public static final int SECOND_PORT = 3000;
public static final int THIRD_PORT = 2318;
/**
* Output prefix to identify this class
*/
private final static String TRACE_PREFIX = "[" + PDUReciever.class.getName() + "] ";
public static void main(String args[]) {
System.out.println(TRACE_PREFIX + "started...");
MulticastSocket socket1;
MulticastSocket socket2;
MulticastSocket socket3;
DatagramPacket packet;
DatagramPacket packet2;
DatagramPacket packet3;
PduFactory pduFactory = new PduFactory();
ArrayList<EntityID> knownEntities = new ArrayList<EntityID>();
int pduCount = 0;
try {
// Specify the socket to receive data
socket1 = new MulticastSocket(DEFAULT_PORT);
socket2 = new MulticastSocket(SECOND_PORT);
socket3 = new MulticastSocket(THIRD_PORT);
System.out.println(TRACE_PREFIX + "listening for PDU packets on port " + DEFAULT_PORT );//+ " " + SECOND_PORT + " " + THIRD_PORT);
System.out.println("====================================================");
while (true) // Loop infinitely, receiving datagrams
{
byte buffer[] = new byte[MAX_PDU_SIZE];
packet = new DatagramPacket(buffer, buffer.length);
socket1.receive(packet);
List<Pdu> pduBundle = pduFactory.getPdusFromBundle(packet.getData(), packet.getLength());
if (pduBundle.size() > 1) { // should be 1 for this project
System.out.println("Bundle size is " + pduBundle.size());
}
// end iterator loop through PDU bundle
for (Pdu aPdu : pduBundle) {
pduCount++;
String receiptMessage = String.format("%3s", pduCount) // right justify, 3 characters
+ ". received PDU type " + aPdu.getPduType().getValue() + "=" + aPdu.getPduType().name() + " " + aPdu.getClass().getName() + " from " + packet.getAddress();
if (aPdu instanceof EntityStatePdu) {
System.out.println(receiptMessage);
EntityID entityID = ((EntityStatePdu) aPdu).getEntityID();
Vector3Double position = ((EntityStatePdu) aPdu).getEntityLocation();
System.out.println(" entityID triplet: [" + entityID.getSiteID() + ", " + entityID.getApplicationID() + ", " + entityID.getEntityID() + "] ");
if (!knownEntities.contains(entityID)){
knownEntities.add(entityID);
EntityType entityType = ((EntityStatePdu) aPdu).getEntityType();
System.out.println(" New Entity: " +entityType.getEntityKind() + " "+ entityType.getDomain() + " "+ entityType.getCountry() + " "+ entityType.getCategory() + " "+ entityType.getSubCategory() + " "+ entityType.getSpecific() );
}
System.out.println(" Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
}
else if (aPdu instanceof FirePdu){
System.out.println(receiptMessage);
EntityID firingEntityID = ((FirePdu) aPdu).getFiringEntityID();
EntityID targetEntityID = ((FirePdu) aPdu).getTargetEntityID();
MunitionDescriptor munitionDescriptor = ((FirePdu) aPdu).getDescriptor();
System.out.println(" firingEntityID triplet: [" + firingEntityID.getSiteID() + ", " + firingEntityID.getApplicationID() + ", " + firingEntityID.getEntityID() + "] ");
System.out.println(" targetEntityID triplet: [" + targetEntityID.getSiteID() + ", " + targetEntityID.getApplicationID() + ", " + targetEntityID.getEntityID() + "] ");
System.out.println(" Munition Information: [" + munitionDescriptor.getMunitionType().getDomain() + "."+munitionDescriptor.getMunitionType().getCountry() + "." + munitionDescriptor.getMunitionType().getCategory() + "."+ munitionDescriptor.getMunitionType().getSubCategory() + "." + munitionDescriptor.getMunitionType().getSpecific() + "]");
}
else if (aPdu instanceof CommentReliablePdu){
System.out.println(receiptMessage);
ArrayList<VariableDatum> payloadList = (ArrayList)((CommentReliablePdu) aPdu).getVariableDatumRecords();
if (!payloadList.isEmpty())
System.out.print (" messages: ");
for (VariableDatum variableDatum : payloadList)
{
String nextComment = new String(variableDatum.getVariableDatumValue()); // convert byte[] to String
System.out.print (" \"" + nextComment + "\"");
System.out.println();
}//
}
else if (aPdu instanceof ResupplyOfferPdu){
System.out.println(receiptMessage);
EntityID receiverID = ((ResupplyOfferPdu) aPdu).getReceivingEntityID();
EntityID supplierID = ((ResupplyOfferPdu) aPdu).getSupplyingEntityID();
List<SupplyQuantity> supplyList = ((ResupplyOfferPdu) aPdu).getSupplies();
System.out.println(" Resupply Offer from Entity [" + supplierID.getSiteID() + ", "+ supplierID.getApplicationID() + ", " + supplierID.getEntityID() + "] to resupply Entity ["+ receiverID.getSiteID() + ", "+ receiverID.getApplicationID() + ", " + receiverID.getEntityID() + "]" );
for (int i = 0; i < supplyList.size(); i++){
SupplyQuantity supplyQ = supplyList.get(i);
EntityType entityType = supplyQ.getSupplyType();
float supplyQuantity = supplyQ.getQuantity();
System.out.println(" Supplies Offered: [Quantity: " + supplyQuantity + ", Type: " +entityType.getEntityKind() + " "+ entityType.getDomain() + " "+ entityType.getCountry() + " "+ entityType.getCategory() + " "+ entityType.getSubCategory() + " "+ entityType.getSpecific() + " ]");
}
}
//OTHER PDU TYPES
else {
System.out.println(receiptMessage);
}
} // end of bundle loop
} // end of while loop
} // end try block // end try block // end try block // end try block
catch (IOException ioe) {
System.out.println(TRACE_PREFIX + "Problem with input/output, see exception trace:");
System.out.println(ioe);
}
System.out.println(TRACE_PREFIX + "complete.");
} // end main
} // end class
/**
* Copyright (c) 2008-2020, MOVES Institute, Naval Postgraduate School (NPS). All rights reserved.
* This work is provided under a BSD open-source license, see project license.html and license.txt
*/
package MV3500Cohort2020JulySeptember.homework4.White.test;
import MV3500Cohort2020JulySeptember.homework4.White.working.*;
import MV3500Cohort2020JulySeptember.homework4.White.*;
import edu.nps.moves.dis7.enumerations.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.utilities.*;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
public class WhiteSimulation
{
// class variables
PduFactory pduFactory = new PduFactory();
DisThreadedNetworkInterface disNetworkInterface;
DisThreadedNetworkInterface.PduListener pduListener;
Pdu receivedPdu;
private String networkAddress = "10.1.105.7";
private int networkPort = 2317;
/**
* Constructor design goal: additional built-in initialization conveniences can go here
* to keep student efforts focused on the runSimulation() method.
*/
public WhiteSimulation()
{
// Under consideration. Constructor is not currently needed.
}
/**
* Utility Constructor
* @param address network address to use
* @param port corresponding network port to use
*/
public WhiteSimulation(String address, int port)
{
setNetworkAddress(address);
setNetworkPort(port);
}
/**
* @return the networkAddress
*/
public String getNetworkAddress()
{
return networkAddress;
}
/**
* @param networkAddress the networkAddress to set
*/
public final void setNetworkAddress(String networkAddress)
{
this.networkAddress = networkAddress;
}
/**
* @return the networkPort
*/
public int getNetworkPort()
{
return networkPort;
}
/**
* @param networkPort the networkPort to set
*/
public final void setNetworkPort(int networkPort)
{
this.networkPort = networkPort;
}
/**
* Initialize network interface, choosing best available network interface
*/
public void setUpNetworkInterface()
{
disNetworkInterface = new DisThreadedNetworkInterface(getNetworkAddress(), getNetworkPort());
System.out.println("Network confirmation: address=" + disNetworkInterface.getMcastGroup() + " port=" + disNetworkInterface.getDisPort());
pduListener = new DisThreadedNetworkInterface.PduListener()
{
/** Callback handler for listener */
@Override
public void incomingPdu(Pdu newPdu)
{
receivedPdu = newPdu;
}
};
disNetworkInterface.addListener(pduListener);
}
/** All done, release network resources */
public void tearDownNetworkInterface()
{
disNetworkInterface.removeListener(pduListener);
disNetworkInterface.kill();
disNetworkInterface = null;
}
/**
* Send a single Protocol Data Unit (PDU) of any type
* @param pdu the pdu to send
*/
private void sendSinglePdu(Pdu pdu)
{
try
{
disNetworkInterface.send(pdu);
Thread.sleep(100); // TODO consider refactoring the wait logic and moving externally
}
catch (InterruptedException ex)
{
System.err.println(this.getClass().getName() + " Error sending PDU: " + ex.getLocalizedMessage());
System.exit(1);
}
}
/**
* Send EntityState, Fire, Comment PDUs
* @see <a href="https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html">Passing Information to a Method or a Constructor</a> Arbitrary Number of Arguments
* @param entityStatePdu the ESPDU to send, if any
* @param firePdu the FirePDU to send, if any
* @param commentType enumeration value describing the narrative comment
* @param comments String array of narrative comments
*/
public void sendAllPdus(EntityStatePdu entityStatePdu,
FirePdu firePdu,
VariableRecordType commentType,
// vararg... variable length string
String... comments)
{
if (entityStatePdu != null)
sendPDU(entityStatePdu);
if (firePdu != null)
sendPDU(firePdu); // bang
if ((comments != null) && (comments.length > 0))
{
ArrayList<String> newCommentsList = new ArrayList<>();
for (int i = 0; i < comments.length; i++)
{
if (!comments[i].isEmpty())
newCommentsList.add(comments[i]); // OK found something to send
}
if (!newCommentsList.isEmpty())
{
if (commentType == null)
commentType = VariableRecordType.OTHER;
CommentPdu commentPdu = pduFactory.makeCommentPdu(commentType, newCommentsList.toArray(new String[0])); // comments);
sendPDU(commentPdu);
}
}
}
/**
* Main method is first executed when a program instance is loaded.
* @see <a href="https://docs.oracle.com/javase/tutorial/getStarted/application/index.html">Java Tutorials: A Closer Look at the "Hello World!" Application</a>
* @param args command-line arguments are an array of optional String parameters that are passed from execution environment during invocation
*/
public static void main(String[] args)
{
WhiteSimulation thisProgram = new WhiteSimulation(); // creates instance
// initial execution: can handle args array of initialization arguments here
if (args.length == 2)
{
if ((args[0] != null) && !args[0].isEmpty())
thisProgram.setNetworkAddress(args[0]);
if ((args[1] != null) && !args[1].isEmpty())
thisProgram.setNetworkPort(Integer.parseInt(args[1]));
}
else if (args.length != 0)
{
System.err.println("Usage: " + thisProgram.getClass().getName() + " [address port]");
System.exit(-1);
}
// OK here we go...
//thisProgram.setUpNetworkInterface();
thisProgram.runSimulation (); // customization code goes in there
//thisProgram.tearDownNetworkInterface();
}
/**
* Programmer-modifiable method for defining and running a new simulation of interest.
* Support include DIS EntityStatePdu, FirePdu and CommentPdu all available for
* modification and sending in a simulation loop.
*/
@SuppressWarnings("SleepWhileInLoop")
public void runSimulation ()
{
try
{
final double LOOP_DURATION_SECONDS = 1.0; // seconds
final int MAX_LOOP_COUNT = 10;
int loopCount = 0;
VariableRecordType narrativeType = VariableRecordType.OTHER; // of potential use
boolean simulationComplete = false; // sentinel variable as termination condition
boolean fireBool = false;
boolean destBool = false;
// TODO reset clock to zero each time for consistent outputs.
// your model setup: who's who in this zoo?
// create PDU objects and set their values
Vector3Double eloc3 = new Vector3Double();
double[] loc3 = CoordinateConversions.getXYZfromLatLonDegrees(36.600757, -121.869309, 0 );//NPS Corner by lake
EntityID entityID_1 = new EntityID();
entityID_1.setSiteID(1).setApplicationID(2).setEntityID(3); // made-up example ID
EntityStatePdu entityStatePdu = pduFactory.makeEntityStatePdu();
entityStatePdu.setEntityID(entityID_1);
EntityID lavID = new EntityID();
lavID.setSiteID(1);
lavID.setApplicationID(13);
lavID.setEntityID(25);
entityStatePdu.setEntityID(lavID);
EntityType lavType = new EntityType(); //1.1.225.2.41.3 Platform,Ground,USA,ArmoredFightingVehicle,LAV,LAV25A2
lavType.setEntityKind(EntityKind.PLATFORM);
lavType.setDomain(Domain.inst(PlatformDomain.LAND));
lavType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
lavType.setCategory(2);
lavType.setSubCategory(41);
lavType.setSpecific(3);
entityStatePdu.setEntityType(lavType);
Vector3Double eloc2 = new Vector3Double();
double[] loc2 = CoordinateConversions.getXYZfromLatLonDegrees(36.599831, -121.878842, 0); //sloat delmonte intersection
eloc2.setX(loc2[0]);
eloc2.setY(loc2[1]);
eloc2.setZ(loc2[2]);
entityStatePdu.setEntityLocation(eloc2);
EulerAngles orient2 = new EulerAngles();
orient2.setPhi((float) 0.0);
orient2.setPsi((float) 0.0);
orient2.setTheta((float) 0.0);
entityStatePdu.setEntityOrientation(orient2);
EntityStatePdu entityStatePdu2 = pduFactory.makeEntityStatePdu();
EntityID bmpID = new EntityID();
bmpID.setSiteID(1);
bmpID.setApplicationID(13);
bmpID.setEntityID(2);
entityStatePdu2.setEntityID(bmpID);
EntityType bmpType = new EntityType(); //1.1.222.2.2.1 Platform,Ground,Russia,ArmoredFightingVehicle,BMP2,BMP2
bmpType.setEntityKind(EntityKind.PLATFORM);
bmpType.setDomain(Domain.inst(PlatformDomain.LAND));
bmpType.setCountry(Country.RUSSIA);
bmpType.setCategory(2);
bmpType.setSubCategory(41);
bmpType.setSpecific(3);
entityStatePdu2.setEntityType(bmpType);
Vector3Double eloc1 = new Vector3Double();
double[] loc1 = CoordinateConversions.getXYZfromLatLonDegrees(36.594116, -121.877463, 0); //NPS Main Gate
eloc1.setX(loc1[0]);
eloc1.setY(loc1[1]);
eloc1.setZ(loc1[2]);
entityStatePdu2.setEntityLocation(eloc1);
EulerAngles orient1 = new EulerAngles();
orient1.setPhi((float) 3.1415);
orient1.setPsi((float) 0.0);
orient1.setTheta((float) 0.0);
entityStatePdu2.setEntityOrientation(orient1);
int BMPHitsReceived = 0;
System.out.println(eloc2.toString());
System.out.println(eloc1.toString());
//FirePdu firePduNull = new FirePdu();
FirePdu firePdu = pduFactory.makeFirePdu();
EntityID fireID = new EntityID();
fireID.setSiteID(1);
fireID.setApplicationID(13);
fireID.setEntityID(25);
EntityID targetID = new EntityID();
targetID.setSiteID(1);
targetID.setApplicationID(13);
targetID.setEntityID(2);
firePdu.setFiringEntityID(fireID);
firePdu.setTargetEntityID(targetID);
EntityType HEType = new EntityType(); //2.9.225.2.2.1
HEType.setEntityKind(EntityKind.MUNITION);
HEType.setDomain(Domain.inst(PlatformDomain.AIR));
HEType.setCountry(Country.UNITED_STATES_OF_AMERICA_USA);
HEType.setCategory(2);
HEType.setSubCategory(2);
HEType.setSpecific(1);
MunitionDescriptor HEIT = new MunitionDescriptor();
HEIT.setMunitionType(HEType);
HEIT.setQuantity(3);
HEIT.setFuse(MunitionDescriptorFuse.CONTACT_GRAZE);
HEIT.setRate(200);
firePdu.setDescriptor(HEIT);
EntityID HEID = new EntityID();
HEID.setEntityID(1);
firePdu.setMunitionExpendibleID(HEID);
//
CommentReliablePdu bmpDestroyedComment = pduFactory.makeCommentReliablePdu("BMP2 DESTROYED BY LAV25-A2 AFTER TWO BURSTS OF 25mm HEI-T ON TARGET");
CommentReliablePdu bmpSightedComment = pduFactory.makeCommentReliablePdu("LAV25-A2 ACQUIRES TARGET BMP2 WITHIN FIRING DISTANCE");
//if(eloc1.getX())
ResupplyOfferPdu resupplyOfferPdu = pduFactory.makeResupplyOfferPdu();
ArrayList<SupplyQuantity> pSupplies = new ArrayList<SupplyQuantity>();
SupplyQuantity ammoSupplyQ = new SupplyQuantity();
ammoSupplyQ.setSupplyType(HEType);
ammoSupplyQ.setQuantity(500);
//EntityType ammoSupply = new EntityType();
// ammoSupply.setEntityKind(EntityKind.MUNITION);
//ammoSupply.setDomain(Entity)
//ammoSupplyQ.setSupplyType(EntityType.)
pSupplies.add(ammoSupplyQ);
resupplyOfferPdu.setSupplies(pSupplies);
resupplyOfferPdu.setReceivingEntityID(lavID);
resupplyOfferPdu.setSupplyingEntityID(bmpID);
// should we customize this munition? what is it for your simulation?
while (loopCount < MAX_LOOP_COUNT) // loop the simulation while allowed, can set additional conditions to break
{
String narrativeMessage1, narrativeMessage2, narrativeMessage3, narrativeMessage4;
narrativeMessage4 = "";
// initialize loop variables
loopCount++;
// =============================================================================================
// your own simulation code starts here!
// compute a track, update an ESPDU, whatever it is that your model is doing...
// Where is my entity?
entityStatePdu.getEntityLocation().setX(entityStatePdu.getEntityLocation().getX() - 20); // 1m per timestep
entityStatePdu.getEntityLocation().setY(entityStatePdu.getEntityLocation().getY() - 75);
// decide whether to fire, and then update the firePdu. Hmmm, you might want a target to shoort at!
Double dx = eloc2.getX() - eloc1.getX();
Double dy = eloc2.getY() - eloc1.getY();
Double dz = eloc2.getZ() - eloc1.getZ();
Double range = Math.sqrt(dx*dx + dy*dy);
System.out.println("range" + range + " dx:" +dx + " dy:"+ dy);
// etc. etc. your code goes here
if(range < 100){
if (!fireBool)
sendPDU(bmpSightedComment);
fireBool = true;
System.out.println("Entity#" + firePdu.getFiringEntityID().getEntityID() + " is firing " + firePdu.getDescriptor().getMunitionType().getDomain() + "."+firePdu.getDescriptor().getMunitionType().getCountry() + "." + firePdu.getDescriptor().getMunitionType().getCategory() + "."+ firePdu.getDescriptor().getMunitionType().getSubCategory() + "." + firePdu.getDescriptor().getMunitionType().getSpecific() + "."+ " at Entity#"+ firePdu.getTargetEntityID().getEntityID());
if(firePdu.getTargetEntityID().getEntityID() == 2){
BMPHitsReceived += 1;
if (BMPHitsReceived > 1) {
//DESTROY THE BMP!
System.out.println("BMP Destroyed after "+ BMPHitsReceived + " hits from 25mm HEI-T");
narrativeMessage4 = "Destroyed BMP2";
destBool = true;
}
}
}
// your loop termination condition goes here
if (loopCount > 4) // for example
{
simulationComplete = true;
}
// your own simulation code is finished here!
// =============================================================================================
// keep track of timestep: wait duration for elapsed time in this loop
// Thread.sleep needs a (long) parameter for milliseconds, which are clumsy to use sometimes
Thread.sleep((long)(LOOP_DURATION_SECONDS * 1000)); // seconds * (1000 msec/sec) = milliseconds
System.out.println ("... Pausing for " + LOOP_DURATION_SECONDS + " seconds");
// send the status PDUs for this loop and continue
System.out.println ("sending PDUs for simulation step " + loopCount + ", monitor loopback to confirm sent");
//sendAllPdus(entityStatePdu, firePduNull, null, narrativeMessage1, narrativeMessage2, narrativeMessage3);
//sendAllPdus(entityStatePdu2, null, null, narrativeMessage1, narrativeMessage2, narrativeMessage4);
sendPDU(entityStatePdu);
sendPDU(entityStatePdu2);
if (fireBool)
sendPDU(firePdu);
if (destBool){
sendPDU(bmpDestroyedComment);
sendPDU(resupplyOfferPdu);
}
System.out.println ("... PDUs successfully sent");
// ===============================
// loop now finished, thus terminate if simulation complete, otherwise send latest PDUs and continue
if (simulationComplete || (loopCount > 10000)) // for example; including fail-safe condition is good
{
CommentReliablePdu completionPdu = pduFactory.makeCommentReliablePdu("White Simulation Completed");
sendPDU(completionPdu);
System.out.println ("... Termination condition met, simulationComplete=" + simulationComplete);
break;
}
} // end of while loop
}
catch (Exception ex) // handle any exception that your code might choose to provoke!
{
Logger.getLogger(WhiteSimulation.class.getName()).log(Level.SEVERE, null, ex);
}
}
public void sendPDU(Pdu pdu) {
System.out.println("Sending a PDU");
MulticastSocket socket = null; // must be initialized, even if null
InetAddress destinationIp = null; // must be initialized, even if null
try {
destinationIp = InetAddress.getByName(networkAddress);
} catch (UnknownHostException e) {
System.out.println(e + " Cannot create address");
System.exit(0);
}
try {
// Set up a socket to send information
socket = new MulticastSocket(2317);
} catch (IOException ex) {
Logger.getLogger(WhiteSimulation.class.getName()).log(Level.SEVERE, null, ex);
}
Set<InetAddress> broadcastAddresses;
// Loop through sending one ESPDUs
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
try {
pdu.marshal(dos);
byte[] data = baos.toByteArray();
DatagramPacket packet = new DatagramPacket(data, data.length, destinationIp, 2317);
socket.send(packet);
socket.close();
} catch (Exception ex) {
Logger.getLogger(WhiteSimulation.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
\ No newline at end of file
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