Something went wrong on our end
-
Brutzman, Don authoredBrutzman, Don authored
EspduReceiver.java 5.40 KiB
package OpenDis7Examples;
import java.io.*;
import java.net.*;
import java.util.*;
import edu.nps.moves.dis7.pdus.*;
import edu.nps.moves.dis7.utilities.*;
/**
* Receives PDUs from the network in IEEE DIS format.
* Adapted from OpenDIS library example package edu.nps.moves.examples
*
* @author DMcG
* @version $Id:$
*/
public class EspduReceiver
{
/** Max size of a PDU in binary format that we can receive. This is actually
* somewhat outdated--PDUs can be larger--but this is a reasonable starting point.
*/
private static final int MAX_PDU_SIZE = 8192;
/** Default multicast group address we send on.
* @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 = EspduSender.DEFAULT_MULTICAST_ADDRESS;
/** Default multicast port used, matches Wireshark DIS capture default
* @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 = EspduSender.DEFAULT_MULTICAST_PORT;
/** Output prefix to identify this class */
private final static String TRACE_PREFIX = "[" + EspduReceiver.class.getName() + "] ";
/**
* Program invocation, execution starts here
* @param args command-line arguments
*/
public static void main(String args[])
{
MulticastSocket multicastSocket;
InetAddress multicastInetAddress;
DatagramPacket packet;
PduFactory pduFactory = new PduFactory();
int pduCount = 0;
System.out.println(TRACE_PREFIX + "started...");
try {
// Specify the socket to receive data
multicastSocket = new MulticastSocket(DEFAULT_MULTICAST_PORT);
// socket.setBroadcast(true);
multicastInetAddress = InetAddress.getByName(DEFAULT_MULTICAST_ADDRESS);
// socket.joinGroup(address); // deprecated
// =======================================================================
// new approach using interface
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(multicastInetAddress);
SocketAddress localMulticastSocketAddress = new InetSocketAddress(multicastInetAddress, DEFAULT_MULTICAST_PORT);
multicastSocket.joinGroup(localMulticastSocketAddress, networkInterface);
// =======================================================================
System.out.println(TRACE_PREFIX + "listening for PDU packets on " + multicastInetAddress.getHostAddress() + " port " + DEFAULT_MULTICAST_PORT);
System.out.println("To quit: stop or kill this process");
System.out.println("===============");
while (true) // Loop infinitely, receiving datagrams
{
byte buffer[] = new byte[MAX_PDU_SIZE];
packet = new DatagramPacket(buffer, buffer.length); // reset packet each time
multicastSocket.receive(packet); // process blocks here until receipt of network packet with PDU
List<Pdu> pduBundle = pduFactory.getPdusFromBundle(packet.getData(),packet.getLength());
if (pduBundle.size() > 1)
System.out.println("Received PDU bundle size is " + pduBundle.size());
for (Pdu nextPdu : pduBundle) // iterator loop through PDU bundle
{
pduCount++;
String receiptMessage = String.format("%3s", pduCount) // right justify, 3 characters
+ ". received PDU type " + nextPdu.getPduType().getValue() + "=" + nextPdu.getPduType().name() + " " + nextPdu.getClass().getName();
if (nextPdu instanceof EntityStatePdu)
{
System.out.println(receiptMessage);
EntityID entityID = ((EntityStatePdu)nextPdu).getEntityID();
Vector3Double position = ((EntityStatePdu)nextPdu).getEntityLocation();
System.out.println(" entityID triplet: [" + entityID.getSiteID()+ ", " + entityID.getApplicationID()+ ", " + entityID.getEntityID()+ "] ");
System.out.println(" Location in DIS coordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
}
else if (nextPdu instanceof FirePdu)
{
System.out.println(receiptMessage);
Vector3Double position = ((FirePdu)nextPdu).getLocationInWorldCoordinates();
System.out.println(" FirePdu locationInWorldCoordinates: [" + position.getX() + ", " + position.getY() + ", " + position.getZ() + "]");
System.out.println("===============");
}
else
{
System.out.println(receiptMessage);
}
} // end of bundle loop
} // end of while loop
} // end try block
catch (IOException ioe)
{
System.out.println(TRACE_PREFIX + "Problem with input/output, see exception trace:");
System.out.println(ioe);
}
System.out.println(TRACE_PREFIX + "complete.");
} // end main
} // end class