Skip to content
Snippets Groups Projects
Commit 25b2e856 authored by Kens's avatar Kens
Browse files

Merge origin/master

parents 3302450c 849275ca
No related branches found
No related tags found
No related merge requests found
Showing
with 327 additions and 674 deletions
......@@ -15,4 +15,5 @@ and [Video of Cloning a Git Repository Using NetBeans IDE](https://netbeans.org/
* [Savage Developers Guide](https://savage.nps.edu/Savage/developers.html) resources for [DIS](https://savage.nps.edu/Savage/developers.html#DIS)
* UML [Sequence diagram](https://en.wikipedia.org/wiki/Sequence_diagram) on Wikipedia
* [WireShark](https://wireshark.org) and [WireShark Tutorial for Beginners](https://www.youtube.com/watch?v=TkCSr30UojM) video by Anson Alexander
* [X3D-Edit](https://savage.nps.edu/X3D-Edit/#Downloads) as Netbeans Plugin
* [X3D-Edit](https://savage.nps.edu/X3D-Edit/#Downloads) as Netbeans Plugin including [DIS PDU Player/Recorder](https://savage.nps.edu/X3D-Edit/images/DisPlayerRecorderPanel.png) and [ESPDU Generator](https://savage.nps.edu/X3D-Edit/images/DisEspduTestPanelDemo.png)
* [X3D for Web Authors](http://x3dgraphics.com) book, examples and slidesets including [X3D Distributed Interactive Simulation (DIS)](http://x3dgraphics.com/slidesets/X3dForAdvancedModeling/DistributedInteractiveSimulation.pdf)
//package PositionClient;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
/**
*
* @author AJSNELL
*/
public class ConardSnellPositionReceiver {
/**
* @param args the command line arguments
* @throws java.io.IOException
*/
public static void main(String[] args) throws IOException {
String hostName = args[0];
try (Socket clientSocket = new Socket(hostName, 8005);
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in))) {
String userInput;
out.println("unit id: 1\nunit pos: 11S MS 4859 9849");
while ((userInput = stdIn.readLine()) != null) {
out.println(userInput);
System.out.println("from client: " + in.readLine());
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " + hostName);
System.exit(1);
}
}
}
\ No newline at end of file
//package positionserver;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.PrintWriter;
public class ConardSnellPositionSender {
/**
* @param args the command line arguments
* @throws java.io.IOException
*/
public static void main(String[] args) throws IOException {
try (ServerSocket serverSocket = new ServerSocket(8005);
Socket clientSocket = serverSocket.accept();
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));) {
System.out.println("Client connected on port 8005");
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println("Received message: " + inputLine + " from " + clientSocket.toString());
out.println(inputLine);
}
} catch (IOException e) {
System.out.println("Exception when trying to listen on port 8005");
}
}
}
\ No newline at end of file
## Final Course Projects 2018March
Create a dedicated subdirectory for each individual or team project.
Example: `SmithJones`
See the course syllabus for details on how to document your project.
//package tcpclient;
import java.io.*;
import java.net.*;
/**
* Before, we always used telnet to connect to the server. We
* are now writing our own program to do the connection.
*
* As you will see, when we run this after we start the server
* we will see the same string telnet printed, sent by the server.
* The output at the server will show different socket pairs for
* each time we ran it.
*
* @author mcgredo
*/
public class ConardTcpClient {
public static void main(String[] args)
{
try
{
System.out.println("creating socket");
// We request an IP to connect to ("localhost") and
// port number at that IP (2317). This establishes
// a connection to that IP in the form of the Socket
// object; the server uses a ServerSocket to wait for
// connections.
Socket socket = new Socket("localhost", 2317);
// Read the single line written by the server. We'd
// do things a bit differently if many lines to be read
// from the server, instead of one only.
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String serverMessage = br.readLine();
System.out.println("What is your location? " + serverMessage);
}
catch(Exception e)
{
System.out.println(e);
System.out.println("Problem with client");
}
}
}
//package tcpserver;
import java.io.*;
import java.net.*;
/**
* Very slightly more complex than example1. A complete copy of
* example 2. The only thing this does
* differently is introduce a loop into the response, so you don't
* have to restart the program after one response. Also, it prints
* out the socket pair the server sees. Run the program via telnet
* several times and compare the socket pairs.
*
* telnet localhost 2317
*
* If you're sophisticated you can contact the instructor's computer
* while running this program.
*
* telnet <ipOfServersLaptop> 2317
*
* And have him display the socket pairs he got.
* @author mcgredo
*/
public class ConardTcpServer
{
public static void main(String[] args)
{
try
{
// ServerSocket waits for a connection from a client.
// Notice that it is outside the loop; ServerSocket
// needs to be made only once.
ServerSocket serverSocket = new ServerSocket(2317);
// System.out.println("socketCreated");
// Loop, infinitely, waiting for client connections.
// Stop the program somewhere else.
while(true)
{
Socket clientConnection = serverSocket.accept();
OutputStream os = clientConnection.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("My location is 1,2,5");
// Print some information locally about the Socket
// connection. This includes the port and IP numbers
// on both sides (the socket pair.)
InetAddress localAddress = clientConnection.getLocalAddress();
InetAddress remoteAddress = clientConnection.getInetAddress();
int localPort = clientConnection.getLocalPort();
int remotePort = clientConnection.getPort();
// My socket pair connection looks like this, to localhost:
// Socket pair: (( /0:0:0:0:0:0:0:1, 2317 ), ( /0:0:0:0:0:0:0:1, 54876 ))
// Socket pair: (( /0:0:0:0:0:0:0:1, 2317 ), ( /0:0:0:0:0:0:0:1, 54881 ))
//
// Why is the first IP/port the same, while the second set has
// different ports?
System.out.println("Socket pair: (( " + localAddress.toString() + ", " + localPort + " ), ( " +
remoteAddress.toString() + ", " + remotePort + " ))");
// Notice the use of flush() and close(). Without
// the close() to Socket object may stay open for
// a while after the client has stopped needing this
// connection. Close() explicitly ends the connection.
ps.flush();
clientConnection.close();
}
}
catch(Exception e)
{
System.out.println("problem with networking");
}
}
}
\ No newline at end of file
MV3500 - Internetwork Communications and Simulation
Prof. Dr. Don Brutzman
Landas, Enrico
Tacket, Cody
Yamashita de Moura, Douglas
Final Project
Adapt a Unity or Other Program to Emit PDUs Using Open-DIS C# Binding
Two C# scripts, Sender.cs and Receiver.cs, were created to send and receive
PDUs, respectively. The following data is included:
Sender.cs
- IP Address: 239.1.2.3
- Port: 3000
- EntityID.Entity: 1
Receiver.cs
- IP Address: 239.1.2.3
- Port: 3000
- EntityID.Entity to be processed: anyone different from 1
For the project purpose, the scripts were implemented in such a way that all
multicast information is enclosed on the scripts and only selected information
is processed and printed on the screen. Each computer will print the data
from the entity that is different from the one it is sending.
Unity Project
- The Unity package can be downloaded from:
- https://owncloud.nps.edu/owncloud/index.php/s/mewLa2BUEWhucPa
Video
- A video showing two applications working can be found at the Video folder
of the Unity package
TO-DO List
- Create an Unity interface to receive input data: IP address, port, etc
- Transform the object location to real world location (using latitude,
longitude and altitude)
- Replace the 'InvokeRepeating' method using a thread (when creating a sender
and a client on the same computer, this method may not work properly, i.e.,
the interval between the calls could be different from the expected)
- Implement creation of the received object on the Receiver.cs (or other
interface to be created)
- Implement control of the object (NavySeal guy) using keyboard/mouse
\ No newline at end of file
using System;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using OpenDis.Core;
using OpenDis.Dis1998;
using OpenDis.Enumerations;
using UnityEngine.UI;
public class Receiver : MonoBehaviour {
UdpClient client;
IPEndPoint localEp;
EntityStatePdu newEntityStatePDU;
IPAddress multicastaddress;
PduProcessor pduProcessor;
int PDU_TYPE_POSITION = 2;
public GameObject locationText;
Vector3Double location;
EntityID entityID;
EntityType entityType;
// Use this for initialization
public void onClick () {
Debug.Log("Start receiving...");
// Create UDP Client to receive data
client = new UdpClient();
client.ExclusiveAddressUse = false;
localEp = new IPEndPoint(IPAddress.Any, 3000);
client.Client.SetSocketOption(SocketOptionLevel.Socket,
SocketOptionName.ReuseAddress, true);
client.ExclusiveAddressUse = false;
client.Client.Bind(localEp);
multicastaddress = IPAddress.Parse("239.1.2.3");
client.JoinMulticastGroup(multicastaddress);
locationText = GameObject.FindGameObjectWithTag("ReceiverLocationText");
// Broadcast IP - Client
InvokeRepeating("BroadcastClientIP", 0, 1f);
}
// Receive data
void BroadcastClientIP()
{
try
{
if(client.Available > 0)
{
// Blocks until a message returns on this socket from a remote host.
Byte[] receivedBytes = client.Receive(ref localEp);
if(receivedBytes != null && receivedBytes.Length > 0)
{
try
{
PduType pduType = (PduType)receivedBytes[PDU_TYPE_POSITION];
Pdu pdu = PduProcessor.UnmarshalRawPdu(pduType, receivedBytes, Endian.Big);
switch ((PduType)pdu.PduType)
{
case PduType.EntityState:
ProcessEntityStatePdu((EntityStatePdu)pdu);
SetLocationText();
break;
default:
break;
}
} catch (Exception e)
{
Debug.LogError(e.ToString());
}
}
}
}
catch (Exception e)
{
Debug.LogError(e.ToString());
}
}
// Process Entity State PDU
void ProcessEntityStatePdu(EntityStatePdu espdu)
{
entityID = espdu.EntityID;
entityType = espdu.EntityType;
location = espdu.EntityLocation;
}
// Print NavySeal info on screen
void SetLocationText()
{
if (entityID.Entity != 1)
{
locationText.GetComponent<Text>().text = String.Format("NAVY SEAL RECEIVER\nID: {0}\nCountry: {1}\nCategory: {2}\nLocation: ({3}, {4}, {5})", entityID.Entity.ToString(), entityType.Country.ToString(), entityType.Category.ToString(), location.X.ToString("F2"), location.Y.ToString("F2"), location.Z.ToString("F2"));
Debug.Log(String.Format("NAVY SEAL RECEIVER\nID: {0}\nCountry: {1}\nCategory: {2}\nLocation: ({3}, {4}, {5})", entityID.Entity.ToString(), entityType.Country.ToString(), entityType.Category.ToString(), location.X.ToString("F2"), location.Y.ToString("F2"), location.Z.ToString("F2")));
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
using System.Text;
using OpenDis.Dis1998;
using OpenDis.Core;
using System.IO;
using System.Threading;
using UnityEngine.UI;
public class Sender : MonoBehaviour {
UdpClient sender;
string serverIP;
int broadcastPort = 3000;
IPEndPoint remoteEP;
string data = "";
public GameObject locationText;
EntityStatePdu espdu;
EntityID entityID;
EntityType entityType;
//NavySeal object and position
public GameObject NavySeal;
private double x;
private double y;
private double z;
void Start() {
// Get Navy Seal object
NavySeal = GameObject.FindGameObjectWithTag("NavySealPrefab");
// Create new entity state and set exercise
espdu = new EntityStatePdu();
espdu.ExerciseID = 1;
// Create and set entity marking
Marking myMarking = new Marking();
myMarking.CharacterSet = 1;
String markingTest = "Test";
myMarking.Characters = Encoding.UTF8.GetBytes(markingTest);
espdu.Marking = myMarking;
// Get time stamp
espdu.Timestamp = (uint)DateTimeOffset.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
// Set entity ID parameters
entityID = espdu.EntityID;
entityID.Site = 1;
entityID.Application = 1;
entityID.Entity = 1;
// Set entity type parameters
entityType = espdu.EntityType;
entityType.EntityKind = 1;
entityType.Country = 225;
entityType.Domain = 1;
entityType.Category = 1;
entityType.Subcategory = 20;
entityType.Specific = 3;
locationText = GameObject.FindGameObjectWithTag("SenderLocationText");
}
// Use this for initialization
public void onClick () {
Debug.Log("Starting multicasting...");
//Create UDP Client for broadcasting the server
sender = new UdpClient();
IPAddress groupIP = IPAddress.Parse("239.1.2.3");
sender.JoinMulticastGroup(groupIP);
remoteEP = new IPEndPoint(groupIP, broadcastPort);
//Broadcast IP - Server
InvokeRepeating("BroadcastServerIP", 0, 1f);
}
// Prepare and send data
void BroadcastServerIP()
{
// Get and print entity position
x = NavySeal.transform.position.x;
y = NavySeal.transform.position.y;
z = NavySeal.transform.position.z;
//Debug.Log(NavySeal.transform.position);
// Set entity location
Vector3Double location = espdu.EntityLocation;
location.X = x;
location.Y = y;
location.Z = z;
// Get time stamp
espdu.Timestamp = (uint)DateTimeOffset.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
//Prepare output
DataOutputStream dos = new DataOutputStream(Endian.Big);
espdu.MarshalAutoLengthSet(dos);
// Transmit messages
byte[] buffer = dos.ConvertToBytes();
sender.Send(buffer, buffer.Length, remoteEP);
//Debug.Log(Time.realtimeSinceStartup + ": Sent broadcast data: " + espdu);
SetLocationText();
}
// Print NavySeal info on screen
void SetLocationText()
{
locationText.GetComponent<Text>().text = String.Format("NAVY SEAL SENDER\nID: {0}\nCountry: {1}\nCategory: {2}\nLocation: ({3}, {4}, {5})", entityID.Entity.ToString(), entityType.Country.ToString(), entityType.Category.ToString(), x.ToString("F2"), y.ToString("F2"), z.ToString("F2"));
Debug.Log(String.Format("NAVY SEAL SENDER\nID: {0}\nCountry: {1}\nCategory: {2}\nLocation: ({3}, {4}, {5})", entityID.Entity.ToString(), entityType.Country.ToString(), entityType.Category.ToString(), x.ToString("F2"), y.ToString("F2"), z.ToString("F2")));
}
}
## Final Course Projects
## Final Course Project Landas and Tackett
Create a dedicated subdirectory for each individual or team project.
......
//package tcpclient;
import java.io.*;
import java.net.*;
/**
* Before, we always used telnet to connect to the server. We
* are now writing our own program to do the connection.
*
* As you will see, when we run this after we start the server
* we will see the same string telnet printed, sent by the server.
* The output at the server will show different socket pairs for
* each time we ran it.
*
* @author mcgredo
*/
public class ConardTcpClient {
public static void main(String[] args)
{
try
{
System.out.println("creating socket");
// We request an IP to connect to ("localhost") and
// port number at that IP (2317). This establishes
// a connection to that IP in the form of the Socket
// object; the server uses a ServerSocket to wait for
// connections.
Socket socket = new Socket("localhost", 2317);
// Read the single line written by the server. We'd
// do things a bit differently if many lines to be read
// from the server, instead of one only.
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String serverMessage = br.readLine();
System.out.println("What is your location? " + serverMessage);
}
catch(Exception e)
{
System.out.println(e);
System.out.println("Problem with client");
}
}
}
//package tcpserver;
import java.io.*;
import java.net.*;
/**
* Very slightly more complex than example1. A complete copy of
* example 2. The only thing this does
* differently is introduce a loop into the response, so you don't
* have to restart the program after one response. Also, it prints
* out the socket pair the server sees. Run the program via telnet
* several times and compare the socket pairs.
*
* telnet localhost 2317
*
* If you're sophisticated you can contact the instructor's computer
* while running this program.
*
* telnet <ipOfServersLaptop> 2317
*
* And have him display the socket pairs he got.
* @author mcgredo
*/
public class ConardTcpServer
{
public static void main(String[] args)
{
try
{
// ServerSocket waits for a connection from a client.
// Notice that it is outside the loop; ServerSocket
// needs to be made only once.
ServerSocket serverSocket = new ServerSocket(2317);
// System.out.println("socketCreated");
// Loop, infinitely, waiting for client connections.
// Stop the program somewhere else.
while(true)
{
Socket clientConnection = serverSocket.accept();
OutputStream os = clientConnection.getOutputStream();
PrintStream ps = new PrintStream(os);
ps.println("My location is 1,2,5");
// Print some information locally about the Socket
// connection. This includes the port and IP numbers
// on both sides (the socket pair.)
InetAddress localAddress = clientConnection.getLocalAddress();
InetAddress remoteAddress = clientConnection.getInetAddress();
int localPort = clientConnection.getLocalPort();
int remotePort = clientConnection.getPort();
// My socket pair connection looks like this, to localhost:
// Socket pair: (( /0:0:0:0:0:0:0:1, 2317 ), ( /0:0:0:0:0:0:0:1, 54876 ))
// Socket pair: (( /0:0:0:0:0:0:0:1, 2317 ), ( /0:0:0:0:0:0:0:1, 54881 ))
//
// Why is the first IP/port the same, while the second set has
// different ports?
System.out.println("Socket pair: (( " + localAddress.toString() + ", " + localPort + " ), ( " +
remoteAddress.toString() + ", " + remotePort + " ))");
// Notice the use of flush() and close(). Without
// the close() to Socket object may stay open for
// a while after the client has stopped needing this
// connection. Close() explicitly ends the connection.
ps.flush();
clientConnection.close();
}
}
catch(Exception e)
{
System.out.println("problem with networking");
}
}
}
\ No newline at end of file
......@@ -12,7 +12,7 @@ import java.net.*;
public class TackettMulticastSender {
public static final String MULTICAST_ADDRESS = "239.1.2.15";
public static final String MULTICAST_ADDRESS = "172.20.144.145";
public static final int DESTINATION_PORT = 1717;
/** How many routers can be crossed */
public static final int TTL = 10;
......
package edu.nps.moves.examples;
import java.io.*;
import java.net.*;
import java.util.*;
import edu.nps.moves.dis.*;
import edu.nps.moves.disutil.CoordinateConversions;
import edu.nps.moves.disutil.DisTime;
/**
* Creates and sends ESPDUs in IEEE binary format.
*
* @author DMcG
*/
public class EspduSender
{
public static final int NUMBER_TO_SEND = 5000;
public enum NetworkMode{UNICAST, MULTICAST, BROADCAST};
/** default multicast group we send on */
public static final String DEFAULT_MULTICAST_GROUP="239.1.2.3";
/** Port we send on */
public static final int DIS_DESTINATION_PORT = 3000;
/** Possible system properties, passed in via -Dattr=val
* networkMode: unicast, broadcast, multicast
* destinationIp: where to send the packet. If in multicast mode, this can be mcast.
* To determine bcast destination IP, use an online bcast address
* caclulator, for example http://www.remotemonitoringsystems.ca/broadcast.php
* If in mcast mode, a join() will be done on the mcast address.
* port: port used for both source and destination.
* @param args
*/
public static void main(String args[])
{
/** an entity state pdu */
EntityStatePdu espdu = new EntityStatePdu();
MulticastSocket socket = null;
DisTime disTime = DisTime.getInstance();
int alternator = -1;
// ICBM coordinates for my office
double lat = 36.595517;
double lon = -121.877000;
// Default settings. These are used if no system properties are set.
// If system properties are passed in, these are over ridden.
int port = DIS_DESTINATION_PORT;
NetworkMode mode = NetworkMode.BROADCAST;
InetAddress destinationIp = null;
try
{
destinationIp = InetAddress.getByName(DEFAULT_MULTICAST_GROUP);
}
catch(Exception e)
{
System.out.println(e + " Cannot create multicast address");
System.exit(0);
}
// All system properties, passed in on the command line via -Dattribute=value
Properties systemProperties = System.getProperties();
// IP address we send to
String destinationIpString = systemProperties.getProperty("destinationIp");
// Port we send to, and local port we open the socket on
String portString = systemProperties.getProperty("port");
// Network mode: unicast, multicast, broadcast
String networkModeString = systemProperties.getProperty("networkMode"); // unicast or multicast or broadcast
// Set up a socket to send information
try
{
// Port we send to
if(portString != null)
port = Integer.parseInt(portString);
socket = new MulticastSocket(port);
// Where we send packets to, the destination IP address
if(destinationIpString != null)
{
destinationIp = InetAddress.getByName(destinationIpString);
}
// Type of transport: unicast, broadcast, or multicast
if(networkModeString != null)
{
if(networkModeString.equalsIgnoreCase("unicast"))
mode = NetworkMode.UNICAST;
else if(networkModeString.equalsIgnoreCase("broadcast"))
mode = NetworkMode.BROADCAST;
else if(networkModeString.equalsIgnoreCase("multicast"))
{
mode = NetworkMode.MULTICAST;
if(!destinationIp.isMulticastAddress())
{
throw new RuntimeException("Sending to multicast address, but destination address " + destinationIp.toString() + "is not multicast");
}
socket.joinGroup(destinationIp);
}
} // end networkModeString
}
catch(Exception e)
{
System.out.println("Unable to initialize networking. Exiting.");
System.out.println(e);
System.exit(-1);
}
// Initialize values in the Entity State PDU object. The exercise ID is
// a way to differentiate between different virtual worlds on one network.
// Note that some values (such as the PDU type and PDU family) are set
// automatically when you create the ESPDU.
espdu.setExerciseID((short)1);
// The EID is the unique identifier for objects in the world. This
// EID should match up with the ID for the object specified in the
// VMRL/x3d/virtual world.
EntityID eid = espdu.getEntityID();
eid.setSite(1); // 0 is apparently not a valid site number, per the spec
eid.setApplication(1);
eid.setEntity(2);
// Set the entity type. SISO has a big list of enumerations, so that by
// specifying various numbers we can say this is an M1A2 American tank,
// the USS Enterprise, and so on. We'll make this a tank. There is a
// separate project elsehwhere in this project that implements DIS
// enumerations in C++ and Java, but to keep things simple we just use
// numbers here.
EntityType entityType = espdu.getEntityType();
entityType.setEntityKind((short)1); // Platform (vs lifeform, munition, sensor, etc.)
entityType.setCountry(225); // USA
entityType.setDomain((short)1); // Land (vs air, surface, subsurface, space)
entityType.setCategory((short)1); // Tank
entityType.setSubcategory((short)1); // M1 Abrams
entityType.setSpec((short)3); // M1A2 Abrams
Set<InetAddress> bcastAddresses = getBroadcastAddresses();
// Loop through sending N ESPDUs
try
{
System.out.println("Sending " + NUMBER_TO_SEND + " ESPDU packets to " + destinationIp.toString());
for(int idx = 0; idx < NUMBER_TO_SEND; idx++)
{
// DIS time is a pain in the ass. DIS time units are 2^31-1 units per
// hour, and time is set to DIS time units from the top of the hour.
// This means that if you start sending just before the top of the hour
// the time units can roll over to zero as you are sending. The receivers
// (escpecially homegrown ones) are often not able to detect rollover
// and may start discarding packets as dupes or out of order. We use
// an NPS timestamp here, hundredths of a second since the start of the
// year. The DIS standard for time is often ignored in the wild; I've seen
// people use Unix time (seconds since 1970) and more. Or you can
// just stuff idx into the timestamp field to get something that is monotonically
// increasing.
// Note that timestamp is used to detect duplicate and out of order packets.
// That means if you DON'T change the timestamp, many implementations will simply
// discard subsequent packets that have an identical timestamp. Also, if they
// receive a PDU with an timestamp lower than the last one they received, they
// may discard it as an earlier, out-of-order PDU. So it is a good idea to
// update the timestamp on ALL packets sent.
// An alterative approach: actually follow the standard. It's a crazy concept,
// but it might just work.
int ts = disTime.getDisAbsoluteTimestamp();
espdu.setTimestamp(ts);
// Set the position of the entity in the world. DIS uses a cartesian
// coordinate system with the origin at the center of the earth, the x
// axis out at the equator and prime meridian, y out at the equator and
// 90 deg east, and z up and out the north pole. To place an object on
// the earth's surface you also need a model for the shape of the earth
// (it's not a sphere.) All the fancy math necessary to do this is in
// the SEDRIS SRM package. There are also some one-off formulas for
// doing conversions from, for example, lat/lon/altitude to DIS coordinates.
// Here we use those one-off formulas.
// Modify the position of the object. This will send the object a little
// due east by adding some to the longitude every iteration. Since we
// are on the Pacific coast, this sends the object east. Assume we are
// at zero altitude. In other worlds you'd use DTED to determine the
// local ground altitude at that lat/lon, or you'd just use ground clamping.
// The x and y values will change, but the z value should not.
//lon = lon + (double)((double)idx / 100000.0);
//System.out.println("lla=" + lat + "," + lon + ", 0.0");
double direction = Math.pow((double)(-1.0), (double)(idx));
lon = lon + (direction * 0.00006);
System.out.println(lon);
double disCoordinates[] = CoordinateConversions.getXYZfromLatLonDegrees(lat, lon, 1.0);
Vector3Double location = espdu.getEntityLocation();
location.setX(disCoordinates[0]);
location.setY(disCoordinates[1]);
location.setZ(disCoordinates[2]);
System.out.println("lat, lon:" + lat + ", " + lon);
System.out.println("DIS coord:" + disCoordinates[0] + ", " + disCoordinates[1] + ", " + disCoordinates[2]);
// Optionally, we can do some rotation of the entity
/*
Orientation orientation = espdu.getEntityOrientation();
float psi = orientation.getPsi();
psi = psi + idx;
orientation.setPsi(psi);
orientation.setTheta((float)(orientation.getTheta() + idx /2.0));
*/
// You can set other ESPDU values here, such as the velocity, acceleration,
// and so on.
// Marshal out the espdu object to a byte array, then send a datagram
// packet with that data in it.
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
espdu.marshal(dos);
FirePdu fire = new FirePdu();
byte[] fireArray = fire.marshal();
// The byte array here is the packet in DIS format. We put that into a
// datagram and send it.
byte[] data = baos.toByteArray();
bcastAddresses = getBroadcastAddresses();
Iterator it = bcastAddresses.iterator();
while(it.hasNext())
{
InetAddress bcast = (InetAddress)it.next();
System.out.println("Sending bcast to " + bcast);
DatagramPacket packet = new DatagramPacket(data, data.length, bcast, 3000);
socket.send(packet);
packet = new DatagramPacket(fireArray, fireArray.length, bcast, 3000);
//socket.send(packet);
}
// Send every 1 sec. Otherwise this will be all over in a fraction of a second.
Thread.sleep(3000);
location = espdu.getEntityLocation();
System.out.println("Espdu #" + idx + " EID=[" + eid.getSite() + "," + eid.getApplication() + "," + eid.getEntity() + "]");
System.out.println(" DIS coordinates location=[" + location.getX() + "," + location.getY() + "," + location.getZ() + "]");
double c[] = {location.getX(), location.getY(), location.getZ()};
double lla[] = CoordinateConversions.xyzToLatLonDegrees(c);
// System.out.println(" Location (lat/lon/alt): [" + lla[0] + ", " + lla[1] + ", " + lla[2] + "]");
}
}
catch(Exception e)
{
System.out.println(e);
}
}
/**
* A number of sites get all snippy about using 255.255.255.255 for a bcast
* address; it trips their security software and they kick you off their
* network. (Comcast, NPS.) This determines the bcast address for all
* connected interfaces, based on the IP and subnet mask. If you have
* a dual-homed host it will return a bcast address for both. If you have
* some VMs running on your host this will pick up the addresses for those
* as well--eg running VMWare on your laptop with a local IP this will
* also pick up a 192.168 address assigned to the VM by the host OS.
*
* @return set of all bcast addresses
*/
public static Set<InetAddress> getBroadcastAddresses()
{
Set<InetAddress> bcastAddresses = new HashSet<InetAddress>();
Enumeration interfaces;
try
{
interfaces = NetworkInterface.getNetworkInterfaces();
while(interfaces.hasMoreElements())
{
NetworkInterface anInterface = (NetworkInterface)interfaces.nextElement();
if(anInterface.isUp())
{
Iterator it = anInterface.getInterfaceAddresses().iterator();
while(it.hasNext())
{
InterfaceAddress anAddress = (InterfaceAddress)it.next();
if((anAddress == null || anAddress.getAddress().isLinkLocalAddress()))
continue;
//System.out.println("Getting bcast address for " + anAddress);
InetAddress abcast = anAddress.getBroadcast();
if(abcast != null)
bcastAddresses.add(abcast);
}
}
}
}
catch(Exception e)
{
e.printStackTrace();
System.out.println(e);
}
return bcastAddresses;
}
}
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Tackett_Assignment3_README</title>
<style type="text/css">/*...*/</style>
</head>
<body>
<h2>Homework Assignment 3 Checklist</h2>
<ol>
<li><p>[x] Add X3D-Edit as Netbeans Plugin from https://savage.nps.edu/X3D-Edit/#Downloads</p></li>
<li><p>[x] Optional: checkout Open-DIS-Java library source from https://github.com/open-dis/open-dis-java</p></li>
<li><p>[x] Otherwise just inspect files of interest from <a href="https://github.com/open-dis/open-dis-java/tree/master/src/main/java/edu/nps/moves/examples">edu.nps.moves.examples</a></p></li>
<li><p>[x] Copy README.md and create YournameREADME.md documentation file...</p></li>
<li><p>[x] Plan a track of interest, described in YournameREADME.md documentation file...</p>
<pre><code>Track of interest is a sample from a run route I did recently.
</code></pre></li>
<li><p>[x] Copy, then Refactor/Rename example file OpenDisEspduSender.java or OpenDisPduSender.java as YourNameSomething.java</p></li>
<li><p>[x] Modify your example file to produce track PDUs (and be cool)</p></li>
<li><p>[x] Generate PDUs...</p></li>
<li><p>[x] Test PDU reading using Wireshark...</p>
<pre><code>IP address for my machine is 172.20.148.166
</code></pre></li>
<li><p>[x] Record PDU file using X3D-Edit...</p></li>
<li><p>[x] Playback PDU file using X3D-Edit...</p></li>
</ol>
</body>
</html>
\ No newline at end of file
## Homework Assignment 3 Checklist
1. [x] Add X3D-Edit as Netbeans Plugin from https://savage.nps.edu/X3D-Edit/#Downloads
1. [x] Optional: checkout Open-DIS-Java library source from https://github.com/open-dis/open-dis-java
1. [x] Otherwise just inspect files of interest from
[edu.nps.moves.examples](https://github.com/open-dis/open-dis-java/tree/master/src/main/java/edu/nps/moves/examples)
1. [x] Copy README.md and create YournameREADME.md documentation file...
1. [x] Plan a track of interest, described in YournameREADME.md documentation file...
Track of interest is a sample from a run route I did recently.
1. [x] Copy, then Refactor/Rename example file OpenDisEspduSender.java or OpenDisPduSender.java as YourNameSomething.java
1. [x] Modify your example file to produce track PDUs (and be cool)
1. [x] Generate PDUs...
1. [x] Test PDU reading using Wireshark...
IP address for my machine is 172.20.148.166
1. [x] Record PDU file using X3D-Edit...
1. [x] Playback PDU file using X3D-Edit...
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment