Skip to content
Snippets Groups Projects
AllPduReceiver.java 4.95 KiB
package MV3500Cohort2020JulySeptember.homework4.White;

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

import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.enumerations.*;
import edu.nps.moves.dis7.utilities.PduFactory;
import java.util.ArrayList;

public class AllPduReceiver
{
  public static final String  DEFAULT_MULTICAST_ADDRESS = AllPduSender.DEFAULT_MULTICAST_ADDRESS;
  public static final int     DEFAULT_MULTICAST_PORT    = AllPduSender.DEFAULT_MULTICAST_PORT;
  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("OpenDis7Examples.AllPduReceiver started...");
      if (args.length == 2) {
        address = InetAddress.getByName(args[0]);
        socket  = new MulticastSocket(Integer.parseInt(args[1]));
      }
      else {
        System.out.println("Usage:   AllPduReceiver <multicast group> <port>");
        System.out.println("Default: AllPduReceiver     " + DEFAULT_MULTICAST_ADDRESS + "      " + DEFAULT_MULTICAST_PORT);
        socket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
        address = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
      }
      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()); // packet.getData() returns byte[] array data buffer
        if (pdu != null)
        {
            DISPDUType currentPduType = pdu.getPduType(); //short  currentPduType = pdu.getPduType();
            String currentPduTypeName = pdu.getClass().getName();
            DISProtocolFamily currentProtocolFamilyID = pdu.getProtocolFamily(); //short  currentProtocolFamilyID = pdu.getProtocolFamily();
            String currentPduFamilyName = pdu.getClass().getSuperclass().getSimpleName();

            StringBuilder message = new StringBuilder();
            message.append(DisTime.timeStampToString(pdu.getTimestamp()) + " ");
            message.append("received DIS PDU ");
            String currentPduTypePadded     = String.format("%-34s", currentPduType);     // - indicates right padding of whitespace
            message.append(" " ).append(currentPduTypePadded);
            if (currentPduType.getValue() < 10)
              message.append(" "); // column spacing
//            String currentPduTypeNamePadded = String.format("%-49s", currentPduTypeName); // - indicates right padding of whitespace
//            message.append(" of type ").append(currentPduTypeNamePadded); // package.class name
            message.append(" (").append(currentProtocolFamilyID);
//          message.append(" ").append(currentPduFamilyName); // class name is also available
            message.append(")");
            System.out.println(message.toString());
            if (currentPduType == DISPDUType.FIRE){
                FirePdu firePdu = new FirePdu();
                firePdu = (FirePdu) pdu;
                if(firePdu.getFiringEntityID().getEntityID()!= 0){
                    System.out.println("Entity#" + firePdu.getFiringEntityID().getEntityID() + " is firing Muition [" + 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());
                }
            }

            switch (currentPduType) // using enumeration values from edu.​nps.​moves.​dis7.​enumerations.​DISPDUType
            {
                case COMMENT:
                    CommentPdu commentPdu = (CommentPdu)pdu; // cast to precise type
                    ArrayList<VariableDatum> payloadList = (ArrayList)commentPdu.getVariableDatums();
                    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
          System.out.println("received packet but pdu is null, packet.getData().length=" + packet.getData().length + ", error...");
      }
    }
    catch (IOException e) {
      System.out.println("Problem with OpenDis7Examples.AllPduReceiver, see exception trace:");
      System.out.println(e);
    }
    finally {
      System.out.println("OpenDis7Examples.AllPduReceiver complete.");
    }
  }
}