Skip to content
Snippets Groups Projects
OpenDisPduSender.java 6.53 KiB
package MV3500Cohort2018JanuaryMarch.homework3;

// package edu.nps.moves.examples; // copy example from OpenDIS distribution, modify to serve as template

import java.io.*;
import java.net.*;
import java.util.*;

import edu.nps.moves.dis.*; // OpenDIS version 4
import edu.nps.moves.disenum.*;

/**
 * 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.
 *
 * @author DMcG
 * @version $Id:$
 */
public class OpenDisPduSender
{
    /** socket parameter of interest */
    public static final int    PORT = 3000;
    /** socket parameter of interest */
    public static final String MULTICAST_ADDRESS = "239.1.2.3";
    private int port;
    InetAddress multicastAddress;

	/**
	 * Constructor creates a new object.
	 * @param port of interest
	 * @param multicast address of interest
	 */
    public OpenDisPduSender(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() {
        try {
            List<Pdu> generatedPdus = new ArrayList<>();

            // Loop through all the enumerated PDU types, create a PDU for each type,
            // and add that PDU to a list.
            for (PduType pdu : PduType.values()) {
                Pdu aPdu = null;

                switch (pdu) {
                    case ENTITY_STATE:
                        // TODO continue to add unit tests
						EntityStatePdu entityStatePdu = new EntityStatePdu();
						Marking espduMarking = new Marking();
						espduMarking.setCharactersString("Testing 123");
						// TODO libary should warn if > 11 characters
						entityStatePdu.setMarking(espduMarking);
						EntityID espduEntityID = new EntityID();
						espduEntityID.setSite(1);
						espduEntityID.setApplication(2);
						espduEntityID.setEntity(3);
						entityStatePdu.setEntityID(espduEntityID);
                        // TODO consider adding utility methods to Open-DIS
						aPdu = entityStatePdu;
                        break;
                        
                    case COMMENT:
                        aPdu = new CommentPdu();
                        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) {
                    generatedPdus.add(aPdu);
                }
            }

            // Sort the created PDUs by class name
            Collections.sort(generatedPdus, new edu.nps.moves.examples.ClassNameComparator());

            // Send the PDUs we created
            InetAddress localMulticastAddress = InetAddress.getByName(MULTICAST_ADDRESS);
            MulticastSocket socket = new MulticastSocket(PORT);
            socket.joinGroup(localMulticastAddress);

            for (int idx = 0; idx < generatedPdus.size(); idx++) {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                DataOutputStream dos = new DataOutputStream(baos);
                byte[] buffer;

                Pdu aPdu = generatedPdus.get(idx);
                aPdu.marshal(dos);

                buffer = baos.toByteArray();
                DatagramPacket packet = new DatagramPacket(buffer, buffer.length, localMulticastAddress, 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);
        }
    }

    /**
     * Program invocation, execution starts here
     * @param args command-line arguments
     */
    public static void main(String args[]) {
        if (args.length == 2) {
            OpenDisPduSender sender = new  OpenDisPduSender(Integer.parseInt(args[0]), args[1]);
            sender.run();
        } else {
            System.out.println("Usage:   OpenDisPduSender <port> <multicast group>");
            System.out.println("Default: OpenDisPduSender  " + PORT + "   " + MULTICAST_ADDRESS);
            OpenDisPduSender sender = new  OpenDisPduSender(PORT, MULTICAST_ADDRESS);
            sender.run();
        }
    }
}