package DisExamples; 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> 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) // using enumeration values from edu.nps.moves.disenum.* { case ENTITY_STATE: aPdu = new 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 ClassNameComparator()); // 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 < 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, 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(); } } }