diff --git a/src/edu/nps/moves/dis7/utilities/DisNetworking.java b/src/edu/nps/moves/dis7/utilities/DisNetworking.java index fd01d7609338b951cb230e44cbf73c4989383f18..d99daef5fd257a686678e0d9ac5f818df2ffef07 100644 --- a/src/edu/nps/moves/dis7/utilities/DisNetworking.java +++ b/src/edu/nps/moves/dis7/utilities/DisNetworking.java @@ -48,7 +48,7 @@ public class DisNetworking public DisNetworking() { - this(DisThreadedNetIF.DEFAULT_DIS_PORT, DisThreadedNetIF.DEFAULT_MCAST_GROUP); + this(DisThreadedNetIF.DEFAULT_DIS_PORT, DisThreadedNetIF.DEFAULT_MULTICAST_ADDRESS); } public DisNetworking(int port, String mcastgroup) diff --git a/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java b/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java index e71139f9d56c9bca0d27daf75a95847b938f80d3..70f5c5f7b75357e984a31122cb1f6d5a50e9dbe5 100644 --- a/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java +++ b/src/edu/nps/moves/dis7/utilities/DisThreadedNetIF.java @@ -60,7 +60,7 @@ public class DisThreadedNetIF /************ Begin class ***************/ public static int DEFAULT_DIS_PORT = 3000; - public static String DEFAULT_MCAST_GROUP = "225.4.5.6"; + public static String DEFAULT_MULTICAST_ADDRESS = "225.4.5.6"; /** 8192: This has actually been superseded by a larger buffer size, but good enough for now */ public static final int MAX_DIS_PDU_SIZE = 8192; @@ -82,7 +82,7 @@ public class DisThreadedNetIF */ public DisThreadedNetIF() { - this(DEFAULT_DIS_PORT, DEFAULT_MCAST_GROUP); + this(DEFAULT_DIS_PORT, DEFAULT_MULTICAST_ADDRESS); } /** @@ -237,17 +237,20 @@ public class DisThreadedNetIF pdu = pduFactory.createPdu(buffer); - if (pdu != null) { + if (pdu != null) + { counter++; // TODO experimental, add to generator as a commented-out diagnostic; consider adding diagnostic mode System.err.println(counter + ". received " + pdu.getPduType().name()); toListeners(pdu); } buffer.clear(); } - } catch (IOException ex) { + } + catch (IOException ex) { System.err.println("Exception in DisThreadedNetIF receive thread: " + ex.getLocalizedMessage()); System.err.println("Retrying new socket in 1 second"); - } finally { + } + finally { if (socket != null && !socket.isClosed()) { try { ((MulticastSocket)socket).leaveGroup(group, ni); diff --git a/src/edu/nps/moves/dis7/utilities/PduFactory.java b/src/edu/nps/moves/dis7/utilities/PduFactory.java index 6fb183a25ad8e98bf7ae416d67a8f62837658c93..106f2ae81f51cccf528d037dffd5d3200a973f86 100644 --- a/src/edu/nps/moves/dis7/utilities/PduFactory.java +++ b/src/edu/nps/moves/dis7/utilities/PduFactory.java @@ -1462,13 +1462,13 @@ public class PduFactory * PDU builder. Pass in a data buffer, get the correct type of pdu back * based on the PDU type field contained in the underlying array. * - * @param buff the buffer containing PDU data to input + * @param byteBuffer the buffer containing PDU data to input * @return A PDU of the appropriate concrete subclass of PDU or null if there was an error */ - public Pdu createPdu(ByteBuffer buff) + public Pdu createPdu(ByteBuffer byteBuffer) { - DISPDUType type = getTypeFromByteArray(buff.array()); - return createPdu(type, buff); + DISPDUType pduType = getTypeFromByteArray(byteBuffer.array()); + return createPdu(pduType, byteBuffer); } /** @@ -1493,7 +1493,7 @@ public class PduFactory return createPdu(pduType, null); } - private Pdu createPdu(DISPDUType pduType, ByteBuffer buff) + private Pdu createPdu(DISPDUType pduType, ByteBuffer byteBuffer) { Pdu aPdu = null; switch (pduType) { @@ -1797,15 +1797,14 @@ public class PduFactory } // end switch if (aPdu != null) { - if (buff != null) { + if (byteBuffer != null) { try { - aPdu.unmarshal(buff); + aPdu.unmarshal(byteBuffer); } catch (Exception ex) { Logger.getLogger(PduFactory.class.getName()).log(Level.SEVERE, null, ex); } } } - return aPdu; } diff --git a/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java index 6ad38e2df057c379494edf1528ad02e8d84a5b36..511ef1de9edfe28edb899bb242c928216ea7d418 100644 --- a/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java +++ b/src/edu/nps/moves/dis7/utilities/stream/PduRecorder.java @@ -30,8 +30,8 @@ public class PduRecorder implements PduReceiver { public static final String COMMENT_MARKER = "#"; - static String DEFAULT_OUTDIR = "./pduLog"; - static String DEFAULT_FILEPREFIX = "Pdusave"; // TODO better name + static String outputDirectoryPath = "./pduLog"; + static String DEFAULT_FILE_PREFIX = "PduCaptureLog"; static String DISLOG_FILE_EXTENSION = ".dislog"; static final String START_COMMENT_MARKER = COMMENT_MARKER + " Start, "; @@ -42,72 +42,72 @@ public class PduRecorder implements PduReceiver static final String ENCODING_XML = "ENCODING_XML"; // TODO, repeat Open-DIS version 4 effort static final String ENCODING_EXI = "ENCODING_EXI"; // TODO, use Exificient or Nagasena libraries static final String ENCODING_JSON = "ENCODING_JSON"; // TODO, repeat Open-DIS version 4 effort - static final String ENCODING_MAK_DATA_LOGGER = "ENCODING_MAK_DATA_LOGGER"; // verbose pretty-print. perhaps output only (MAK format itself is binary) + static final String ENCODING_MAK_DATA_LOGGER = "ENCODING_MAK_DATA_LOGGER"; // verbose pretty-print. perhaps output only (MAK format itself is binary) static final String ENCODING_WIRESHARK_DATA_LOGGER = "ENCODING_WIRESHARK_DATA_LOGGER"; // static final String ENCODING_CDIS = "ENCODING_CDIS"; // future work based on new SISO standard private static String pduLogEncoding = ENCODING_PLAINTEXT; // TODO use Java enumerations, generalize/share across library - private Writer writer; + private Writer logFileWriter; private File logFile; - private DisThreadedNetIF disThreadedNetIF; - private DisThreadedNetIF.RawPduListener lis; + private DisThreadedNetIF disThreadedNetIF; + private DisThreadedNetIF.RawPduListener disRawPduListener; - Long startNanoTime = null; - StringBuilder sb = new StringBuilder(); - Base64.Encoder base64Encoder = Base64.getEncoder(); - int pduCount = 0; - boolean headerWritten = false; - boolean doSave = true; + private Long startNanoTime = null; + private final StringBuilder sb = new StringBuilder(); + private final Base64.Encoder base64Encoder = Base64.getEncoder(); + private static int port = DisThreadedNetIF.DEFAULT_DIS_PORT; // self-test via port 1 when main() invoked + private final int pduCount = 0; // debug + private boolean headerWritten = false; + private boolean running = true; // starts recording by default /** - * Default constructor that uses default values for output directory, multicast - * address and port. + * Default constructor that uses default values for output directory, multicast address and port. * * @throws IOException if something goes wrong during instantiation */ public PduRecorder() throws IOException { - this(DEFAULT_OUTDIR, DisThreadedNetIF.DEFAULT_MCAST_GROUP, DisThreadedNetIF.DEFAULT_DIS_PORT); + this(outputDirectoryPath, DisThreadedNetIF.DEFAULT_MULTICAST_ADDRESS, port); } /** * Constructor to let the use specify an output directory. Uses default values * for multicast address and port. * - * @param dir the directory to write log files to - * + * @param directoryPath the directory to write log files to * @throws IOException if something goes wrong during instantiation */ - public PduRecorder(String dir) throws IOException + public PduRecorder(String directoryPath) throws IOException { - this(dir, DisThreadedNetIF.DEFAULT_MCAST_GROUP, DisThreadedNetIF.DEFAULT_DIS_PORT); + this(directoryPath, DisThreadedNetIF.DEFAULT_MULTICAST_ADDRESS, DisThreadedNetIF.DEFAULT_DIS_PORT); } /** Constructor to let the user specify all required parameters * - * @param outputDir the directory to write log files to - * @param mcastaddr the multicast group address to receive data from + * @param outputPath local path to the directory to write log files to + * @param multicastAddress the multicast group address to receive data from (TODO allow unicast UDP) * @param port the port to receive data through * @throws IOException if something goes wrong during instantiation */ - public PduRecorder(String outputDir, String mcastaddr, int port) throws IOException + @SuppressWarnings("Convert2Lambda") + public PduRecorder(String outputPath, String multicastAddress, int port) throws IOException { - DEFAULT_OUTDIR = outputDir; - logFile = makeFile(new File(outputDir).toPath(), DEFAULT_FILEPREFIX+DISLOG_FILE_EXTENSION ); - writer = new PrintWriter(new BufferedWriter(new FileWriter(logFile))); + outputDirectoryPath = outputPath; + logFile = createUniquePduLogFile(new File(outputPath).toPath(), DEFAULT_FILE_PREFIX + DISLOG_FILE_EXTENSION ); + logFileWriter = new PrintWriter(new BufferedWriter(new FileWriter(logFile))); - disThreadedNetIF = new DisThreadedNetIF(port, mcastaddr); + disThreadedNetIF = new DisThreadedNetIF(port, multicastAddress); - lis = new DisThreadedNetIF.RawPduListener() { + disRawPduListener = new DisThreadedNetIF.RawPduListener() { @Override public void incomingPdu(DisThreadedNetIF.BuffAndLength bAndL) { receivePdu(bAndL.buff, bAndL.length); } }; - disThreadedNetIF.addRawListener(lis); - System.out.println(getClass() + " listening to IP address " + mcastaddr + " on port: " + port); + disThreadedNetIF.addRawListener(disRawPduListener); + System.out.println(getClass() + " listening to IP address " + multicastAddress + " on port " + port); } /** @@ -115,48 +115,54 @@ public class PduRecorder implements PduReceiver * * @return the pduLogEncoding */ - public static String getEncoding() { + public static String getPduLogEncoding() + { return pduLogEncoding; } /** - * @param aEncoding the pduLogEncoding to set + * @param newPduLogEncoding the pduLogEncoding to set */ - public static void setEncoding(String aEncoding) { - pduLogEncoding = aEncoding; + public static void setPduLogEncoding(String newPduLogEncoding) { + pduLogEncoding = newPduLogEncoding; } public void startResume() { - doSave = true; + running = true; } public void stopPause() { - doSave = false; + running = false; } public File end() { - doSave = false; - disThreadedNetIF.removeRawListener(lis); + running = false; + disThreadedNetIF.removeRawListener(disRawPduListener); disThreadedNetIF.kill(); writeFooter(); try { - writer.close(); // a flush occurs first during a close - } catch (IOException ex) { + System.out.println(); + System.out.println("Closing recorder log file: " + logFile.getCanonicalPath()); + logFileWriter.close(); // a flush occurs first during a close + } + catch (IOException ex) { Logger.getLogger(PduRecorder.class.getName()).log(Level.SEVERE, null, ex); } - System.out.println(); - System.out.println("Recorder log file closed: " + logFile.getPath()); return logFile; } + byte[] oldBuffer; @Override - public void receivePdu(byte[] buff, int len) + public void receivePdu(byte[] newBuffer, int newLength) { - if(!doSave) + if (java.util.Arrays.equals(newBuffer, oldBuffer)) + System.err.println ("PduRecorder warning: PDU newBuffer equals PDU oldBuffer"); // debug + + if(!isRunning()) return; long packetRcvNanoTime = System.nanoTime(); @@ -166,8 +172,8 @@ public class PduRecorder implements PduReceiver byte[] timeByteArray = Longs.toByteArray(packetRcvNanoTime - startNanoTime); //System.out.println("wrote time "+(packetRcvNanoTime - startNanoTime)); - byte[] buffsized = Arrays.copyOf(buff, len); - DISPDUType type; + byte[] buffsized = Arrays.copyOf(newBuffer, newLength); + DISPDUType pduType; switch (pduLogEncoding) { @@ -183,8 +189,8 @@ public class PduRecorder implements PduReceiver sb.append(','); sb.append(Arrays.toString(buffsized).replace(" ", "")); sb.append(" # "); - type = DISPDUType.getEnumForValue(Byte.toUnsignedInt(buffsized[2])); // 3rd byte - sb.append(type); + pduType = DISPDUType.getEnumForValue(Byte.toUnsignedInt(buffsized[2])); // 3rd byte + sb.append(pduType); break; default: @@ -195,8 +201,8 @@ public class PduRecorder implements PduReceiver headerWritten = true; } try { - writer.write(sb.toString()); - ((PrintWriter)writer).println(); + logFileWriter.write(sb.toString()); + ((PrintWriter)logFileWriter).println(); } catch (IOException ex) { throw new RuntimeException("Fatal exception writing DIS log file in PduRecorder thread: " + ex); @@ -210,7 +216,7 @@ public class PduRecorder implements PduReceiver * * @return the path to the log file */ - public String getLogFile() + public String getLogFilePath() { return logFile.getAbsolutePath(); } @@ -224,24 +230,30 @@ public class PduRecorder implements PduReceiver private void writeHeader() { - String timeStamp = getTimeStamp(); - - try { - writer.write(START_COMMENT_MARKER + pduLogEncoding + ", " + timeStamp + ", DIS capture file, " + logFile.getPath()); - ((PrintWriter)writer).println(); - } catch (IOException ex) { + String timeStamp = getTimeStamp(); + + try + { + logFileWriter.write(START_COMMENT_MARKER + pduLogEncoding + ", " + timeStamp + ", DIS capture file, " + logFile.getPath()); + ((PrintWriter) logFileWriter).println(); + } + catch (IOException ex) + { Logger.getLogger(PduRecorder.class.getName()).log(Level.SEVERE, null, ex); } } private void writeFooter() { - String timeStamp = getTimeStamp(); - - try { - writer.write(FINISH_COMMENT_MARKER + pduLogEncoding + ", " + timeStamp + ", DIS capture file, " + logFile.getPath()); - ((PrintWriter)writer).println(); - } catch (IOException ex) { + String timeStamp = getTimeStamp(); + + try + { + logFileWriter.write(FINISH_COMMENT_MARKER + pduLogEncoding + ", " + timeStamp + ", DIS capture file, " + logFile.getPath()); + ((PrintWriter) logFileWriter).println(); + } + catch (IOException ex) + { Logger.getLogger(PduRecorder.class.getName()).log(Level.SEVERE, null, ex); } } @@ -259,30 +271,44 @@ public class PduRecorder implements PduReceiver * @return a File reference to the log file * @throws IOException if something goes awry */ - private File makeFile(Path outputDir, String filename) throws IOException + private File createUniquePduLogFile(Path outputDir, String filename) throws IOException { - String bname = FilenameUtils.getBaseName(filename); - String ext = FilenameUtils.getExtension(filename); + String baseName = FilenameUtils.getBaseName(filename); + String extension = FilenameUtils.getExtension(filename); - Integer count = null; - File f; + Integer fileCounter = null; + File newFile; boolean fileExists; outputDir.toFile().mkdirs(); do { - String fn = bname + (count == null ? "" : count) + "." + ext; - f = new File(outputDir.toFile(), fn); - fileExists = f.exists(); - if (count == null) - count = 1; + String nextFileName = baseName + (fileCounter == null ? "" : fileCounter) + "." + extension; + newFile = new File(outputDir.toFile(), nextFileName); + fileExists = newFile.exists(); + if (fileCounter == null) + fileCounter = 1; else - count++; + fileCounter++; } while (fileExists); - if (!f.createNewFile()) { - System.out.println("Cannot create dis log file at " + f.getAbsolutePath()); + + if (newFile.createNewFile()) + { + System.out.println("Recorder log file open: " + newFile.getCanonicalPath()); + } + else + { + System.out.println("Cannot create dis log file at " + newFile.getAbsolutePath()); throw new RuntimeException("File creation error"); } - return f; + return newFile; } + + /** + * @return the pduRecorderRunning + */ + public boolean isRunning() + { + return running; + } /** Entry point invocation. Saves a PDU output log to ./pduLog. Invoking the * edu.nps.moves.dis7.examples.PduReaderPlayer will playback all logs written @@ -292,29 +318,36 @@ public class PduRecorder implements PduReceiver */ public static void main(String[] args) { + System.out.println("dis7.utilities.stream.PduRecorder main() performs self-test by sending full set of PDUs via port " + port); + port = 1; // avoid listening to other PDU streams during self test + PduFactory factory = new PduFactory(); //default appid, country, etc. - PduRecorder recorder; + PduRecorder pduRecorder; try { - recorder = new PduRecorder(); // default addr, port, output dir + pduRecorder = new PduRecorder(); // default address, port, output directory path } catch(IOException ex) { - System.err.println("Exception creating recorder: "+ex.getLocalizedMessage()); + System.err.println("Exception creating recorder: " + ex.getLocalizedMessage()); return; } + System.out.println("dis7.utilities.stream.PduRecorder pduRecorder created... isRunning()=" + pduRecorder.isRunning()); - DISPDUType all[] = DISPDUType.values(); - Arrays.stream(all).forEach(typ-> { - if(typ != DISPDUType.OTHER) { + DISPDUType allPDUTypesArray[] = DISPDUType.values(); + System.out.println("dis7.utilities.stream.PduRecorder allPDUTypesArray created, length=" + allPDUTypesArray.length + " ..."); + Arrays.stream(allPDUTypesArray).forEach(pduTypeValue-> { + if(pduTypeValue != DISPDUType.OTHER) + { try { - recorder.getDisThreadedNetIF().send(factory.createPdu(typ)); + pduRecorder.getDisThreadedNetIF().send(factory.createPdu(pduTypeValue)); } catch(Exception ex) { System.err.println("Exception sending Pdu: "+ex.getLocalizedMessage()); } } }); - - recorder.end(); + System.err.flush(); // ensure all output sent + pduRecorder.end(); + System.out.println("dis7.utilities.stream.PduRecorder pduRecorder complete... isRunning()=" + pduRecorder.isRunning()); } } diff --git a/src/edu/nps/moves/dis7/utilities/stream/PduRecorderSelfTest.dislog b/src/edu/nps/moves/dis7/utilities/stream/PduRecorderSelfTest.dislog new file mode 100644 index 0000000000000000000000000000000000000000..59b8786848f71751fafbc61b609bc4bbd4232509 --- /dev/null +++ b/src/edu/nps/moves/dis7/utilities/stream/PduRecorderSelfTest.dislog @@ -0,0 +1,74 @@ +# Start, ENCODING_PLAINTEXT, 20200825_215401, DIS capture file, .\pduLog\PduCaptureLog1.dislog +[0,0,0,0,0,0,0,0],[7,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 1 ENTITY_STATE +[0,0,0,0,3,20,-29,20],[7,0,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 2 FIRE +[0,0,0,0,3,124,30,8],[7,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 3 DETONATION +[0,0,0,0,3,-92,-124,56],[7,0,4,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 4 COLLISION +[0,0,0,0,3,-85,58,-8],[7,0,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 5 SERVICE_REQUEST +[0,0,0,0,3,-80,-88,-48],[7,0,6,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 6 RESUPPLY_OFFER +[0,0,0,0,3,-75,-52,112],[7,0,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 7 RESUPPLY_RECEIVED +[0,0,0,0,3,-70,122,124],[7,0,8,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 8 RESUPPLY_CANCEL +[0,0,0,0,3,-64,-6,-116],[7,0,9,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 9 REPAIR_COMPLETE +[0,0,0,0,3,-49,-81,100],[7,0,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 10 REPAIR_RESPONSE +[0,0,0,0,3,-45,-18,28],[7,0,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 11 CREATE_ENTITY +[0,0,0,0,3,-38,92,-4],[7,0,12,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 12 REMOVE_ENTITY +[0,0,0,0,3,-34,67,108],[7,0,13,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 13 START_RESUME +[0,0,0,0,3,-30,29,92],[7,0,14,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 14 STOP_FREEZE +[0,0,0,0,3,-24,36,84],[7,0,15,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0] # DISPDUType: 15 ACKNOWLEDGE +[0,0,0,0,3,-2,38,80],[7,0,16,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 16 ACTION_REQUEST +[0,0,0,0,4,49,89,88],[7,0,17,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 17 ACTION_RESPONSE +[0,0,0,0,4,53,-25,92],[7,0,18,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 18 DATA_QUERY +[0,0,0,0,4,57,29,-96],[7,0,19,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 19 SET_DATA +[0,0,0,0,4,61,36,-32],[7,0,20,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 20 DATA +[0,0,0,0,4,70,55,-20],[7,0,21,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 21 EVENT_REPORT +[0,0,0,0,4,82,121,-48],[7,0,22,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 22 COMMENT +[0,0,0,0,4,-105,-6,100],[7,0,23,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 23 ELECTROMAGNETIC_EMISSION +[0,0,0,0,5,6,-91,64],[7,0,24,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 24 DESIGNATOR +[0,0,0,0,6,-3,-90,-56],[7,0,25,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 25 TRANSMITTER +[0,0,0,0,7,119,96,28],[7,0,26,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0] # DISPDUType: 26 SIGNAL +[0,0,0,0,7,-89,35,116],[7,0,27,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 27 RECEIVER +[0,0,0,0,8,46,-67,32],[7,0,28,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 28 IDENTIFICATION_FRIEND_OR_FOE +[0,0,0,0,8,99,121,-24],[7,0,29,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 29 UNDERWATER_ACOUSTIC +[0,0,0,0,8,105,12,20],[7,0,30,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 30 SUPPLEMENTAL_EMISSION_ENTITY_STATE +[0,0,0,0,8,-121,106,-80],[7,0,31,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0] # DISPDUType: 31 INTERCOM_SIGNAL +[0,0,0,0,8,-13,-78,-100],[7,0,32,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 32 INTERCOM_CONTROL +[0,0,0,0,9,-44,-16,84],[7,0,33,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 33 AGGREGATE_STATE +[0,0,0,0,9,-10,115,60],[7,0,34,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 34 ISGROUPOF +[0,0,0,0,10,65,-109,-88],[7,0,35,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 35 TRANSFER_OWNERSHIP +[0,0,0,0,10,-23,95,-124],[7,0,36,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 36 ISPARTOF +[0,0,0,0,11,-48,82,-112],[7,0,37,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 37 MINEFIELD_STATE +[0,0,0,0,11,-6,95,-52],[7,0,38,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 38 MINEFIELD_QUERY +[0,0,0,0,12,16,86,16],[7,0,39,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 39 MINEFIELD_DATA +[0,0,0,0,12,24,114,-96],[7,0,40,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 40 MINEFIELD_RESPONSE_NACK +[0,0,0,0,12,-115,-26,-4],[7,0,41,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 41 ENVIRONMENTAL_PROCESS +[0,0,0,0,13,1,49,-44],[7,0,42,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 42 GRIDDED_DATA +[0,0,0,0,14,96,-120,4],[7,0,43,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 43 POINT_OBJECT_STATE +[0,0,0,0,14,-77,-45,16],[7,0,44,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 44 LINEAR_OBJECT_STATE +[0,0,0,0,15,54,-28,-108],[7,0,45,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 45 AREAL_OBJECT_STATE +[0,0,0,0,16,73,-40,120],[7,0,46,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 46 TIME_SPACE_POSITION_INFORMATION +[0,0,0,0,17,42,-36,96],[7,0,47,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 47 APPEARANCE +[0,0,0,0,17,54,2,72],[7,0,48,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 48 ARTICULATED_PARTS +[0,0,0,0,17,99,115,-32],[7,0,49,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 49 LIVE_ENTITY_FIRE +[0,0,0,0,17,-72,1,48],[7,0,50,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 50 LIVE_ENTITY_DETONATION +[0,0,0,0,17,-60,104,-108],[7,0,51,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 51 CREATE_ENTITY_RELIABLE +[0,0,0,0,17,-3,31,84],[7,0,52,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 52 REMOVE_ENTITY_RELIABLE +[0,0,0,0,18,37,-2,56],[7,0,53,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 53 START_RESUME_RELIABLE +[0,0,0,0,18,64,19,-12],[7,0,54,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 54 STOP_FREEZE_RELIABLE +[0,0,0,0,18,67,-27,-80],[7,0,55,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0] # DISPDUType: 55 ACKNOWLEDGE_RELIABLE +[0,0,0,0,18,-111,-21,32],[7,0,56,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 56 ACTION_REQUEST_RELIABLE +[0,0,0,0,18,-103,99,60],[7,0,57,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 57 ACTION_RESPONSE_RELIABLE +[0,0,0,0,18,-90,2,-32],[7,0,58,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 58 DATA_QUERY_RELIABLE +[0,0,0,0,18,-69,43,72],[7,0,59,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 59 SET_DATA_RELIABLE +[0,0,0,0,18,-45,-102,-64],[7,0,60,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 60 DATA_RELIABLE +[0,0,0,0,18,-16,-107,-128],[7,0,61,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 61 EVENT_REPORT_RELIABLE +[0,0,0,0,19,18,-47,-112],[7,0,62,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 62 COMMENT_RELIABLE +[0,0,0,0,19,57,45,-32],[7,0,63,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 63 RECORD_RELIABLE +[0,0,0,0,19,62,-29,-104],[7,0,64,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 64 SET_RECORD_RELIABLE +[0,0,0,0,19,102,112,-4],[7,0,65,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 65 RECORD_QUERY_RELIABLE +[0,0,0,0,19,106,-66,-116],[7,0,66,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 66 COLLISION_ELASTIC +[0,0,0,0,19,121,19,-80],[7,0,67,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 67 ENTITY_STATE_UPDATE +[0,0,0,0,19,-7,-77,-48],[7,0,68,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 68 DIRECTED_ENERGY_FIRE +[0,0,0,0,20,5,-24,8],[7,0,69,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 69 ENTITY_DAMAGE_STATUS +[0,0,0,0,20,-12,108,48],[7,0,70,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 70 INFORMATION_OPERATIONS_ACTION +[0,0,0,0,21,25,-88,-100],[7,0,71,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] # DISPDUType: 71 INFORMATION_OPERATIONS_REPORT +[0,0,0,0,25,39,-94,24],[7,0,72,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0] # DISPDUType: 72 ATTRIBUTE +# Finish, ENCODING_PLAINTEXT, 20200825_215401, DIS capture file, .\pduLog\PduCaptureLog1.dislog