Something went wrong on our end
-
Brutzman, Don authoredBrutzman, Don authored
AllPduReceiver.java 7.10 KiB
package OpenDis7Examples;
import edu.nps.moves.dis7.enumerations.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.utilities.DisTime;
import edu.nps.moves.dis7.utilities.PduFactory;
import java.io.*;
import java.net.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/** Listen to all kinds of PDUs and report them */
public class AllPduReceiver
{
/** default multicast address
* @see <a href="https://en.wikipedia.org/wiki/Multicast_address">https://en.wikipedia.org/wiki/Multicast_address</a> */
public static final String DEFAULT_MULTICAST_ADDRESS = AllPduSender.DEFAULT_MULTICAST_ADDRESS;
/** default multicast port
* @see <a href="https://en.wikipedia.org/wiki/Port_(computer_networking)">https://en.wikipedia.org/wiki/Port_(computer_networking)</a> */
public static final int DEFAULT_MULTICAST_PORT = AllPduSender.DEFAULT_MULTICAST_PORT;
/** TODO whether to use Fast ESPDU */
public static final boolean USE_FAST_ESPDU = false;
/** Output prefix to identify this class */
private final static String TRACE_PREFIX = "[" + AllPduReceiver.class.getName() + "] ";
/**
* Program invocation, execution starts here
* @param args command-line arguments
*/
public static void main(String args[])
{
MulticastSocket multicastSocket;
InetAddress multicastInetAddress;
PduFactory pduFactory = new PduFactory();
DisTime.TimestampStyle timestampStyle = DisTime.TimestampStyle.IEEE_ABSOLUTE;
DisTime.setTimestampStyle(timestampStyle);
System.out.println(TRACE_PREFIX + "started...");
try {
if (args.length == 2)
{
multicastInetAddress = InetAddress.getByName(args[0]);
multicastSocket = 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);
multicastSocket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
multicastInetAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
}
System.out.println("To quit: stop or kill this process");
// multicastSocket.joinGroup(multicastInetAddress); // deprecated
// =======================================================================
// new approach using interface
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(multicastInetAddress);
SocketAddress localMulticastSocketAddress = new InetSocketAddress(multicastInetAddress, DEFAULT_MULTICAST_PORT);
multicastSocket.joinGroup(localMulticastSocketAddress, networkInterface);
// =======================================================================
byte buffer[] = new byte[1500]; // typical MTU size in bytes
while (true) // Loop indefinitely, receiving datagrams
{
Arrays.fill(buffer, (byte)0);
DatagramPacket datagramPacket = new DatagramPacket(buffer, buffer.length); // reset packet each time
multicastSocket.receive(datagramPacket); // process blocks here until receipt of network packet with PDU
// datagramPacket.setLength(buffer.length);
// Pdu pdu = pduFactory.createPdu(packet.getData()); // packet.getData() returns byte[] array data buffer
List<Pdu> pduBundle = pduFactory.getPdusFromBundle(datagramPacket.getData(),datagramPacket.getLength());
if (pduBundle.isEmpty())
System.out.println("Received PDU bundle is empty, packet.getData().length=" + datagramPacket.getData().length + ", error...");
// else if (pduBundle.size() == 1)// common case, typically unremarkable
// System.out.println("Received PDU bundle size is " + pduBundle.size());
else if (pduBundle.size() > 1)
System.out.println("Received PDU bundle size is " + pduBundle.size());
for (Pdu nextPdu : pduBundle) // iterator loop through PDU bundle
{
DisPduType currentPduType = nextPdu.getPduType(); //short currentPduType = nextPdu.getPduType();
String currentPduTypeName = nextPdu.getClass().getSimpleName();
String currentPduFamilyName = nextPdu.getClass().getSuperclass().getSimpleName();
DISProtocolFamily currentProtocolFamilyID = nextPdu.getProtocolFamily(); //short currentProtocolFamilyID = nextPdu.getProtocolFamily();
StringBuilder message = new StringBuilder();
message.append(DisTime.convertToString(nextPdu.getTimestamp())).append(" ");
message.append("received new DIS PDU ");
String currentPduTypePadded = String.format("%-48s", currentPduType); // - indicates right padding of whitespace
message.append(currentPduTypePadded);
// optional, verbose
// 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()); // diagnostic information helps
// additional message information of interest, if any
switch (currentPduType) // using enumeration values from edu.nps.moves.dis7.enumerations.DisPduType
{
case COMMENT:
CommentPdu commentPdu = (CommentPdu)nextPdu; // cast to precise type
ArrayList<VariableDatum> payloadList = (ArrayList<VariableDatum>)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();
}
}
pduBundle.clear();
}
}
catch (IOException e) {
System.out.println("Problem with OpenDis7Examples.AllPduReceiver, see exception trace:");
System.out.println(e);
}
finally {
System.out.println("OpenDis7Examples.AllPduReceiver complete.");
}
}
}