Finally I add ErrorModel to wpan_demo2.tcl, and but the result I get
is quite different from the that of the paper "A Comprehensive
Performance Study of IEEE 802.15.4" which is written by the author of
wpan module.

Here is my result:

pps is 15.1
throughput is 1.6 KBps
packet delivery ratio is 98.7 %
pps is 4.8
throughput is 0.6 KBps
packet delivery ratio is 98.0 %
pps is 2.6
throughput is 0.4 KBps
packet delivery ratio is 97.0 %
pps is 1.4
throughput is 0.3 KBps
packet delivery ratio is 96.7 %

The paper says that as pps goes bigger, the packet delivery ratio
should go down.

I guess it's quite possible that I have made some mistakes, but I
cannot find out myself.
The attachments are my scripts:

run: just type ./run to run the simulation and you'll see the result
wpan_demo2.tcl: I made some changes to the original wpan_demo2.tcl
calc_wpan2.py: it's used by ./run to caculate pps and packet delivery ratio




Best regards,

Bruce Who
2006-04-03
import sys
import re

cols = [r"(?P<cmd>\w)",
        r"(?P<time>(\d|\.)+)",
        r"_(?P<nodeaddr>\d)_",
        r"\w+",
        r"(?P<why>[^\s]+)",  # ---
        r"\d+",
        r"(?P<pkttype>\w+)",
        r"(?P<pktsize>\d+)",
        r"\[\w+ (?P<dstaddr>\w+) (?P<srcaddr>\w+) \w+\]",
        r".*"
        ]

row_str = r'\s+'.join(cols)

pat = re.compile(row_str)

class NodeStatistic:
    def __init__(self):
        self.txTcpPktCount_ = 0
        self.txTcpPktBytes_ = 0
        self.txAckPktCount_ = 0
        self.txAckPktBytes_ = 0
        self.txBcnPktCount_ = 0
        self.txBcnPktBytes_ = 0
        self.txPktCount_ = 0
        self.txPktBytes_ = 0
        self.rxPktCount_ = 0
        self.rxPktBytes_ = 0
        self.dpPktCount_ = 0
        self.dpPktBytes_ = 0
        self.dpTcpPktCount_ = 0
        self.dpTcpPktBytes_ = 0
        self.errTcpPktCount_ = 0
        self.ackPktCount_ = 0
        self.ackPktBytes_ = 0


def main():
    if len(sys.argv) == 2:
        tracefilename = sys.argv[1]
        f = open(tracefilename, 'rb')
        result = {'s': 0, 'r': 0, 'D': 0, 'f': 0, 'dropped': 0, 'ack': 0}
        dictNodeStatistic = {}
        for x in f:
            m = pat.match(x)
            if m:
                cmd = m.group('cmd').lower()
                time = m.group('time')
                nodeaddr = m.group('nodeaddr')
                why = m.group('why').lower()
                pkttype = m.group('pkttype').lower()
                pktsize = int(m.group('pktsize'))
                dstaddr = m.group('dstaddr')
                srcaddr = m.group('srcaddr')
                if not dictNodeStatistic.has_key(nodeaddr):
                    dictNodeStatistic[nodeaddr] = NodeStatistic()
                ns = dictNodeStatistic[nodeaddr]
                if cmd == 's':
                    if pkttype == 'exp':
                        ns.txTcpPktCount_ += 1
                        ns.txTcpPktBytes_ += pktsize
                    elif pkttype == 'ack':
                        ns.txAckPktCount_ += 1
                        ns.txAckPktBytes_ += pktsize
                    elif pkttype == 'bcn':
                        ns.txBcnPktCount_ += 1
                        ns.txBcnPktBytes_ += pktsize
                    ns.txPktCount_ += 1
                    ns.txPktBytes_ += pktsize
                elif cmd == 'r':
                    ns.rxPktCount_ += 1
                    ns.rxPktBytes_ += pktsize # + 7 (???)
                elif cmd == 'd':
                    ns.dpPktCount_ += 1
                    ns.dpPktBytes_ += pktsize
                    if pkttype == 'exp':
                        ns.dpTcpPktCount_ += 1
                        ns.dpTcpPktBytes_ += pktsize
                        if why == 'err':
                            ns.errTcpPktCount_ += 1
        f.close()
        totalTcpPktCount = 0
        totalTcpPktBytes = 0
        totalPktCount = 0
        totalPktBytes = 0
        droppedPktBytes = 0
        droppedPktCount = 0
        droppedTcpPktBytes = 0
        droppedTcpPktCount = 0
        errTcpPktCount = 0
        for i, ns in dictNodeStatistic.iteritems():
            totalTcpPktCount += ns.txTcpPktCount_
            totalTcpPktBytes += ns.txTcpPktBytes_
            totalPktCount += ns.txPktCount_
            totalPktBytes += ns.txPktBytes_
            droppedPktBytes += ns.dpPktBytes_
            droppedPktCount += ns.dpPktCount_
            droppedTcpPktBytes += ns.dpTcpPktBytes_
            droppedTcpPktCount += ns.dpTcpPktCount_
            errTcpPktCount += ns.errTcpPktCount_
        throughput = float(totalPktBytes) / 93 /1024
        pps = float(totalTcpPktCount) / 93
        print 'pps is', round(pps, 1)
        print 'throughput is', round(throughput, 1), 'KBps'
        print 'packet delivery ratio is',\
                round(1 - float(droppedPktCount) / totalPktCount, 3) * 100, '%'

if __name__=="__main__":main()

Reply via email to