Package org.hxzon.netprotocol.ui.statistics

Source Code of org.hxzon.netprotocol.ui.statistics.StatisticsListener

package org.hxzon.netprotocol.ui.statistics;

import org.hxzon.netprotocol.packet.GoosePacket;
import org.hxzon.netprotocol.packet.SvPacket;
import org.hxzon.netprotocol.parse.PacketUtils;
import org.hxzon.pcap.PcapFile;
import org.hxzon.pcap.PcapHandlerListener;
import org.hxzon.pcap.PcapPacket;
import org.hxzon.util.Daytime;
import org.hxzon.util.DebugUtil;
import org.hxzon.util.IntList;

public class StatisticsListener implements PcapHandlerListener {
    private Daytime startTime;
    private Daytime endTime;
    private IntList goosePacketNum = new IntList(6000);
    private IntList mmsPacketNum = new IntList(6000);
    private IntList smvPacketNum = new IntList(6000);
    private IntList otherPacketNum = new IntList(6000);
    private IntList allPacketNum = new IntList(6000);
    private IntList gooseBitNum = new IntList(6000);
    private IntList mmsBitNum = new IntList(6000);
    private IntList smvBitNum = new IntList(6000);
    private IntList otherBitNum = new IntList(6000);
    private IntList allBitNum = new IntList(6000);
    private StatisticsPaintPanel paintPanel;
    private StatisticsControlPanel controlPanel;
    private PcapPacket lastPcapPacket;
    private int packetNum;

    public StatisticsListener(StatisticsPaintPanel paintPanel, StatisticsControlPanel controlPanel) {
        this.paintPanel = paintPanel;
        this.controlPanel = controlPanel;
    }

    public void startPcapFile(PcapFile pcapFile) {

    }

    public void endPcapFile(PcapFile pcapFile) {

    }

    public void endAll() {
        DebugUtil.debug("packet num:" + packetNum);
        StatisticsPaintModel model = new StatisticsPaintModel();
        model.setStartTime(startTime);
        if (endTime == null) {
            endTime = new Daytime(lastPcapPacket.getSeconds(), (int) lastPcapPacket.getMicroSeconds());
        }
        model.setEndTime(endTime);
        //packet num
        model.getGooseData().setPacketNumOrig(getGoosePacketNum());
        model.getMmsData().setPacketNumOrig(getMmsPacketNum());
        model.getSmvData().setPacketNumOrig(getSmvPacketNum());
        model.getOtherData().setPacketNumOrig(getOtherPacketNum());
        model.getAllData().setPacketNumOrig(getAllPacketNum());
        //bit num
        model.getGooseData().setBitNumOrig(getGooseBitNum());
        model.getMmsData().setBitNumOrig(getMmsBitNum());
        model.getSmvData().setBitNumOrig(getSmvBitNum());
        model.getOtherData().setBitNumOrig(getOtherBitNum());
        model.getAllData().setBitNumOrig(getAllBitNum());
        model.prepareData();
        paintPanel.setModel(model);
        controlPanel.initButton();
    }

    @Override
    public void addPcapPacket(PcapPacket pcapPacket, PcapFile ownerFile) {
        packetNum++;
        lastPcapPacket = pcapPacket;
        if (startTime == null) {
            startTime = new Daytime(pcapPacket.getSeconds(), (int) pcapPacket.getMicroSeconds());
//          startTime = new Daytime(pcapPacket.getSeconds(), 0);
        }
        int index = computeTimespan(pcapPacket.getSeconds(), pcapPacket.getMicroSeconds());
        if (index == -1) {
            return;
        }
//      TimespendDebug.start("detect type " + num);
        int type = detectType(pcapPacket);
//      TimespendDebug.end("detect type " + num);
//      TimespendDebug.start("add num");
        if (type == Type_Goose) {
            goosePacketNum.increaseSafe(index);
            gooseBitNum.addSafe(index, (int) pcapPacket.getPacketLen() * 8);
        } else if (type == Type_Smv) {
            smvPacketNum.increaseSafe(index);
            smvBitNum.addSafe(index, (int) pcapPacket.getPacketLen() * 8);
        } else if (type == Type_Mms) {
            mmsPacketNum.increaseSafe(index);
            mmsBitNum.addSafe(index, (int) pcapPacket.getPacketLen() * 8);
        } else {
            otherPacketNum.increaseSafe(index);
            otherBitNum.addSafe(index, (int) pcapPacket.getPacketLen() * 8);
        }
//      TimespendDebug.end("add num");
        allPacketNum.increaseSafe(index);
        allBitNum.addSafe(index, (int) pcapPacket.getPacketLen() * 8);
    }

    private int computeTimespan(long sec, long usec) {
        if (endTime != null) {
            if (sec > endTime.origsec || (sec == endTime.origsec && usec > endTime.usec)) {
                return -1;
            }
        }
        if (sec < startTime.origsec || (sec == startTime.origsec && usec < startTime.usec)) {
            return -1;
        }
        if (usec < startTime.usec) {
            usec += 1000000;
            sec -= 1;
        }
        int result = (int) ((sec - startTime.origsec) * 10 + (usec - startTime.usec) / 100000);
        return result;
    }

    public int[] getGoosePacketNum() {
        return goosePacketNum.getArray();
    }

    public int[] getMmsPacketNum() {
        return mmsPacketNum.getArray();
    }

    public int[] getSmvPacketNum() {
        return smvPacketNum.getArray();
    }

    public int[] getOtherPacketNum() {
        return otherPacketNum.getArray();
    }

    public int[] getAllPacketNum() {
        return allPacketNum.getArray();
    }

    public int[] getGooseBitNum() {
        return gooseBitNum.getArray();
    }

    public int[] getMmsBitNum() {
        return mmsBitNum.getArray();
    }

    public int[] getSmvBitNum() {
        return smvBitNum.getArray();
    }

    public int[] getOtherBitNum() {
        return otherBitNum.getArray();
    }

    public int[] getAllBitNum() {
        return allBitNum.getArray();
    }

    public Daytime getStartTime() {
        return startTime;
    }

    public void setStartTime(Daytime startTime) {
        this.startTime = startTime;
    }

    public Daytime getEndTime() {
        return endTime;
    }

    public void setEndTime(Daytime endTime) {
        this.endTime = endTime;
    }

    private static int Type_Goose = 1;
    private static int Type_Mms = 2;
    private static int Type_Smv = 3;
    private static int Type_Other = 4;

    private static int detectType(PcapPacket pcapPacket) {
        byte[] data = pcapPacket.getPacketData();
        try {
            int ethernetType = PacketUtils.ethernetType(data);
            if (GoosePacket.EthernetType_Goose == ethernetType) {
                return Type_Goose;
            } else if (SvPacket.EthernetType_Sv == ethernetType) {
                return Type_Smv;
            } else if (PacketUtils.isTpktPacket(data)) {
                return Type_Mms;
            }
            return Type_Other;
        } catch (IndexOutOfBoundsException e) {
            return Type_Other;
        }
    }
}
TOP

Related Classes of org.hxzon.netprotocol.ui.statistics.StatisticsListener

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.