本文介绍如何在仿真开始之前,节点就有一些消息。即写脚本生成符合The ONE格式的消息事件,而后导入The ONE仿真器。
1. 创建消息事件
事件的格式举例如下:
#time C message from to size 285.7 C M1 163 509 550704 558.6 C M2 752 241 100161
每行代表一个事件,仿真运行时,会产生一个消息。尽管The ONE/toolkit
,有个Perl脚本文本createCreates.pl
可以创建消息,但并不适合该场景。自己写一个也不难,我用的是Python,核心源代码如下:
### create a message event ### i = 0 while i < nrofMessages : src_host = random.randint(minHostAddr, maxHostAddr) dst_host = random.randint(minHostAddr, maxHostAddr) while (dst_host == src_host) : dst_host = random.randint(minHostAddr, maxHostAddr) size = random.randint(minMsgSize, maxMsgSize) message = msgPrefix + str(nextMsgID) print startTime, "\t", "C", "\t", message, "\t", src_host, "\t", dst_host, "\t", size nextMsgID += 1 i += 1
值得注意的是random.randint(min, max)
产生的随机数既包括上限也包括下限。参数如下:
#! /usr/bin/env python import random import sys msgPrefix = "M" minHostAddr = 0 maxHostAddr = 49 startTime = 0.0 endTime = 0 # nrofMessages = 100 nrofMessages = int(sys.argv[1]) minMsgSize = 1000 maxMsgSize = 2000 nextMsgID = 1
2. 导入The ONE
将上述的事件保存在一个文件中,导入The ONE很简单,只需要在设置文件进行相应的设置,如下:
Events.nrof = 1 Events1.class = ExternalEventsQueue nrofMsgs = [500; 500; 500; 2000; 2000; 2000; 5000; 5000; 5000; 10000; 10000; 10000] Events1.filePath = [nc/traces/initMsgs/n50_m500.txt; nc/traces/initMsgs/n50_m500.txt; nc/traces/initMsgs/n50_m500.txt; nc/traces/initMsgs/n50_m2000.txt; nc/traces/initMsgs/n50_m2000.txt; nc/traces/initMsgs/n50_m2000.txt; nc/traces/initMsgs/n50_m5000.txt; nc/traces/initMsgs/n50_m5000.txt; nc/traces/initMsgs/n50_m5000.txt; nc/traces/initMsgs/n50_m10000.txt; nc/traces/initMsgs/n50_m10000.txt; nc/traces/initMsgs/n50_m10000.txt]
3. 交流讨论
我想测试不同路由协议,传输相同数量的数据包,哪个快(最后一个数据包被接收的时间)。刚测了下,结果并不理想。这种在仿真之前,把消息固定好,也许并不是一个好的方法。如果您有更好的方法,期待您与我分享。
4. 一个疑问
我分别创建了500,2000,5000, 10000个消息,查看MessageStatsReport
的Created
是500, 1997, 4991, 9981。最开始以为是nrofPreload
设置得不够大,但设置大到可以容纳所有消息,情况依然存在。求指点。
2016/01/21更新:这事实上是一个BUG,详情见《The ONE使用笔记:读取外部事件存在BUG》。
赞赏微信赞赏
支付宝赞赏
Pingback: The ONE使用笔记:目录 | Spark & Shine