diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduReceiver.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduReceiver.java new file mode 100644 index 0000000000000000000000000000000000000000..c080c6ede0f654ffe8d166a920baba7b25f8d453 --- /dev/null +++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduReceiver.java @@ -0,0 +1,66 @@ +package MV3500Cohort2019JulySeptember.homework4.Fetterolf; + +// originally edu.nps.moves.examples.ReceiverPerformance +import java.net.*; + +import edu.nps.moves.dis.*; +import edu.nps.moves.disutil.PduFactory; +import java.io.IOException; + +public class PduReceiver { + + public static final int MULTICAST_PORT = 3000; + public static final String MULTICAST_GROUP = "239.1.2.3"; + public static final boolean USE_FAST_ESPDU = false; + + public static void main(String args[]) { + PduFactory factory; + MulticastSocket socket; + InetAddress address; + DatagramPacket packet; + + try { + System.out.println("DisExamples.PduReceiver started..."); + socket = new MulticastSocket(MULTICAST_PORT); + address = InetAddress.getByName(MULTICAST_GROUP); + socket.joinGroup(address); + + factory = new PduFactory(); + + while (true) // Loop infinitely, receiving datagrams + { + byte buffer[] = new byte[1500]; // typical MTU size + + packet = new DatagramPacket(buffer, buffer.length); // reset + + socket.receive(packet); + + Pdu pdu = factory.createPdu(packet.getData()); + if (pdu != null) { + short currentPduType = pdu.getPduType(); + String currentPduTypeName = pdu.getClass().getName(); + short currentProtocolFamilyID = pdu.getProtocolFamily(); + String currentPduFamilyName = pdu.getClass().getSuperclass().getSimpleName(); + + StringBuilder message = new StringBuilder(); + message.append("received DIS PDU: "); + message.append("pduType "); + if (currentPduType < 10) { + message.append(" "); + } + message.append(currentPduType).append(" ").append(currentPduTypeName); + message.append(", protocolFamily ").append(currentProtocolFamilyID); + message.append(" ").append(currentPduFamilyName); + System.out.println(message.toString()); + } else { + System.out.println("received packet but pdu is null, packet.getData().length=" + packet.getData().length + ", error..."); + } + } + } catch (IOException e) { + System.out.println("Problem with DisExamples.PduReceiver, see exception trace:"); + System.out.println(e); + } finally { + System.out.println("DisExamples.PduReceiver complete."); + } + } +} diff --git a/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduSender.java b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduSender.java new file mode 100644 index 0000000000000000000000000000000000000000..f6c24eeec07f333f0e94b03422ba977580407934 --- /dev/null +++ b/assignments/src/MV3500Cohort2019JulySeptember/homework4/Fetterolf/PduSender.java @@ -0,0 +1,192 @@ +package MV3500Cohort2019JulySeptember.homework4.Fetterolf; + +import java.io.*; +import java.net.*; +import java.util.*; + +import edu.nps.moves.dis.*; +import edu.nps.moves.disenum.*; +import edu.nps.moves.examples.ClassNameComparator; + +/** + * This is an example that sends many/most types of PDUs. Useful for testing + * standards compliance or getting a full set of PDUs. It also writes the + * generated PDUs to an XML file. Adapted from OpenDIS library example package + * edu.nps.moves.examples + * + * @author DMcG + * @version $Id:$ + */ +public class PduSender { + + /** + * Default multicast group address we send on. + */ + public static final String DEFAULT_MULTICAST_ADDRESS = "239.1.2.3"; + + /** + * Default multicast port used, matches Wireshark DIS capture default + */ + public static final int DEFAULT_MULTICAST_PORT = 3000; + + private int port; + InetAddress multicastAddress; + + public PduSender(int port, String multicast) { + try { + this.port = port; + multicastAddress = InetAddress.getByName(multicast); + if (!multicastAddress.isMulticastAddress()) { + System.out.println("Not a multicast address: " + multicast); + } + } catch (UnknownHostException e) { + System.out.println("Unable to open socket: " + e); + } + } + + public void run() { + System.out.println("DisExamples.PduSender started..."); + try { + List<Pdu> generatedPdusList = new ArrayList<>(); + + // Loop through all the enumerated PDU types, create a PDU for each type, + // add that PDU to generatedPdusList, and send each one + for (PduType pdu : PduType.values()) { + Pdu aPdu = null; // edu.​nps .​moves.​dis,PDU superclass for all PDUs, + + switch (pdu) // using enumeration values from edu.nps.moves.disenum.* + { + case ENTITY_STATE: + aPdu = new EntityStatePdu(); + EntityStatePdu espdu = (EntityStatePdu) aPdu; + Marking marking = new Marking(); + marking.setCharactersString("PduSender"); // 11 characters max + espdu.setMarking(marking); + Vector3Double espduLocation = new Vector3Double(); + espduLocation.setX(1.0); + espduLocation.setY(2.0); + espduLocation.setZ(3.0); + espdu.setEntityLocation(espduLocation); + // it is important to identify questions as you think of them + // TODO how to set azimuth, i.e. course direction over ground? + break; + + case COMMENT: + aPdu = new CommentPdu(); + CommentPdu newCommentPdu = (CommentPdu) aPdu; + VariableDatum newVariableDatum = new VariableDatum(); + // etc. see Garrett and Pete's code + break; + + case FIRE: + aPdu = new FirePdu(); + break; + + case DETONATION: + aPdu = new DetonationPdu(); + break; + + case COLLISION: + aPdu = new CollisionPdu(); + break; + + case SERVICE_REQUEST: + aPdu = new ServiceRequestPdu(); + break; + + case RESUPPLY_OFFER: + aPdu = new ResupplyOfferPdu(); + break; + + case RESUPPLY_RECEIVED: + aPdu = new ResupplyReceivedPdu(); + break; + + case RESUPPLY_CANCEL: + aPdu = new ResupplyCancelPdu(); + break; + + case REPAIR_COMPLETE: + aPdu = new RepairCompletePdu(); + break; + + case REPAIR_RESPONSE: + aPdu = new RepairResponsePdu(); + break; + + case CREATE_ENTITY: + aPdu = new CreateEntityPdu(); + break; + + case REMOVE_ENTITY: + aPdu = new RemoveEntityPdu(); + break; + + case START_RESUME: + aPdu = new StartResumePdu(); + break; + + case STOP_FREEZE: + aPdu = new StopFreezePdu(); + break; + + case ACKNOWLEDGE: + aPdu = new AcknowledgePdu(); + break; + + case ACTION_REQUEST: + aPdu = new ActionRequestPdu(); + break; + + default: + System.out.print("PDU of type " + pdu + " not supported, created or sent "); + System.out.println(); + } + if (aPdu != null) { + generatedPdusList.add(aPdu); + } + } + + // Sort the created PDUs by class name, if desired +// Collections.sort(generatedPdusList, new ClassNameComparator()); + System.out.println("Send the " + generatedPdusList.size() + " PDUs we created..."); + + // Send the PDUs we created + InetAddress localMulticastAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS); + MulticastSocket socket = new MulticastSocket(DEFAULT_MULTICAST_PORT); + socket.joinGroup(localMulticastAddress); + + for (int idx = 0; idx < generatedPdusList.size(); idx++) { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(baos); + byte[] buffer; + + Pdu aPdu = generatedPdusList.get(idx); + aPdu.marshal(dos); + + buffer = baos.toByteArray(); + DatagramPacket packet = new DatagramPacket(buffer, buffer.length, localMulticastAddress, DEFAULT_MULTICAST_PORT); + socket.send(packet); + System.out.println("Sent PDU of type " + aPdu.getClass().getName()); + } + // write the PDUs out to an XML file. + //PduContainer container = new PduContainer(); + //container.setPdus(generatedPdus); + //container.marshallToXml("examplePdus.xml"); + } catch (IOException e) { + System.out.println(e); + } + } + + public static void main(String args[]) { + if (args.length == 2) { + PduSender sender = new PduSender(Integer.parseInt(args[0]), args[1]); + sender.run(); + } else { + System.out.println("Usage: PduSender <port> <multicast group>"); + System.out.println("Default: PduSender " + DEFAULT_MULTICAST_PORT + " " + DEFAULT_MULTICAST_ADDRESS); + PduSender sender = new PduSender(DEFAULT_MULTICAST_PORT, DEFAULT_MULTICAST_ADDRESS); + sender.run(); + } + } +}