- 浏览: 896640 次
- 性别:
- 来自: 太原
文章分类
- 全部博客 (198)
- Linux/Unix (38)
- TinyOS / NS-2 for『WSN』 (44)
- 思想的拼图 (5)
- 开源 OpenSource (2)
- Framework 开发框架 (0)
- Software Engineering 软件工程 (2)
- IT项目管理 (6)
- Networking 网络技术 (2)
- Java (6)
- C语言 ANSI C (22)
- .NET / C# (9)
- C++ (12)
- Web 语言 Html/Xml (5)
- Groovy on Grails (1)
- Algorithm 算法 (1)
- Database 数据库技术 (5)
- Tools (21)
- VM 虚拟机 (3)
- WSN (wireless sensor network) (2)
- Linux 命令专辑 (3)
- PHP (0)
- 办公软件 (3)
最新评论
-
cfczdws:
感谢楼主,查了半天终于发现居然是htmlentities()做 ...
htmlentities()函数把中文转成了乱码 -
decoxiaohan:
这本书的名字 有谁知道????~~~
OMNeT++中文用户手册(完全版) -
huonie:
怎么下载啊
OMNeT++中文用户手册(完全版) -
huonie:
没有内容啊
OMNeT++中文用户手册(完全版) -
kyx0413:
谢谢先 先看看
OMNeT++中文用户手册(完全版)
Add New Application and Agent
(Tested with ns-2.1b8a, ns-2.1b9a and ns-2.26)
建立一个运行在UDP连接上的多媒体应用, 它模拟了一个虚构的多媒体应用的行为, 这个应用实现了5种媒体缩放比率("five rate media scaling")为的是通过改变编码和传输策略(与比例参数的值有关)来回应网络拥挤。
在应用中假设当连接建立时, 发送者和接收者同意5种不同的编码和传输策略(encoding and transmission policy pairs), 并赋给他们5个标度值scale values (0-4)。 为了简化问题, 假设每个编码和传输策略是恒定的传输比率, 并且使用相同大小的数据包无论使用那种编码方案(encoding scheme)。
基本上, "five rate media scaling"做以下工作。 发送者起始于标度为0的传输比率, 并改变传输比率根据接收者提供(notifies)的标度值。 接收者负责监听网络拥挤和决定标度因素scale factor。 对于拥挤的监听, 使用一个简单的周期性的(for every RTT往返时间 second)数据包丢失监听, 而且甚至把一个数据包每个周期都丢失视为网络拥挤。 如果发现拥挤, 接收者减少标度参数到原来的一半并通知发送者这个值。 如果没有发现丢包现象, 接收者则增加一个值给标度参数并通知发送者。
在实现这个应用前, 先检查UDP的实现。 自从分配了UDP代理和发送网络数据包后, 所有的应用层通信的信息应该作为数据流被UDP代理处理。 然而, UDP分配的数据包只有header stack栈。 因此, 需要改变UDP的实现, 加入发送从应用程序中收到的数据的机制。 这个应用可能还被用于IP router queue management mechanisms。 因此, 我们需要区分这个类型的多媒体流和其他类型的数据流。 我们还需要修改UDP代理去记录数据类型到IP header的其中一项里。
The locations of C++ source files in NS version 2.1b9a are slightly changed from 2.1b8a. In ns-2.1b9a, C++ source files are categorized and placed in sub-directories under the main ns-2 directory. For example, "packet.h" to "common/packet.h", "agent.h" to "common/agent.h" and "app.h" is moved to "apps/app.h". However, the locations of OTcl files are same as before ("tcl/lib/ns-packet.tcl", "tcl/lib/ns-default.tcl" and etc.)
应用程序中, 我们使用到CBR的实现并修改它去具有"five level media scaling"功能。检阅C++ class等级结构,然后命名这个应用的类为"MmApp"并作为的"Application"子类去实现。 对应的OTcl等级结构中的名字是 "Application/MmApp"。 应用中发送者和接收者的行为一起在"MmApp"中实现。 把修改后且支持"MmApp"的UDP代理命名为"UdpMmAgent"并并作为的"UdpAgent"子类。 对应的OTcl等级结构中的名字是"Agent/UDP/UDPmm"
- MmApp Header: 对于应用层的通信, 在C++文件"hdr_mm"定义结构命名的一个报头(define a header of which the structure named in C++ "hdr_mm")。 无论何时应用程序传输信息, 它将提交到"UdpMmAgent"以"hdr_mm"的结构格式。 然后, "UdpMmAgent"分配一个或多个数据包(根据模拟的数据包大小而定)并给每个包的多媒体报头写入数据。 Figure 23 表示了报头的定义, 在这里面报头的结构和报头类的对象"MultimediaHeaderClass"(继承于"PacketHeaderCalss")被定义。 在定义这个类时, 可以看到报头的OTcl名 ("PacketHeader/Multimedia")和定义好的报头结构的大小。 bind_offset() 必须在类的构造函数中调用。
Figure 23. MM Header Structure & Class (in "udp-mm.h" & "udp-mm.cc")
Figure 24 (a). Add to the "packet.h" file (C++)
我们还计入几行代码到packet.h和ns-packet.tcl文件, 见Figure 24 (a)和(b)中加入我们的"Mulltimedia"报头 到header stack。 到这里, 报头的建立已经完成, "UdpMmAgent"可以访问新的报头通过调用hdr_mm::access()这个成员函数。 详见NS Manual中报头建立和访问方法。 其余的程序和对UDP代理修改的描述参考"mm-app.h", "mm-app.cc", "udp-mm.h" and "udp-mm.cc"文件。
Figure 24 (b). Add to the "ns-packet.tcl" file (Otcl)
- MmApp Sender: 发送者使用一个计时器来安排发送下一个程序数据包的时间。 定义"SendTimer" 类(继承于"TimerHandler"类), 并编写 它的成员函数"expire()"去调用"MmApp"对象的成员函数"send_mm_pkt()"。 然后, 引入这个"SendTimer" 对象的实例作为"MmApp"对象的私有成员并引用到"snd_timer_"。 Figure 25 "SendTimer" implementation。
在设置这个计时器timer前, "MmApp"使用当前标度值的传输比率和应用程序数据包的大小(模拟脚本中定义的或默认的大小)来重新计算下一个传输时间。 "MmApp" 发送者一旦接收到接收端发来的ACK application packet, 就去更新标度参数。
Figure 25. SendTimer Implementation.
- MmApp Receiver: 接收者使用名叫"ack_timer_"的计时器去安排下一个间隔时间等于平均RTT的application ACK packet的发送。 当从发送者那里收到一个数据包, 接收者计算收到的包的数量和丢包的数量通过数据包的序号sequence number。 当"ack_timer_"期满时, 调用"MmApp"的成员函数"send_ack_pkt", 它根据收到和丢失数据包的accounting信息来调整标度值,重置received和lost count 为0, 并发出一个含有调整后的标度值ACK packet。 这里要注意, 接收者没有任何建立和关闭连接的方法。 因此, 自从第一个数据包到达,接收者就周期性地发出ACK packets并重不停止(这是个BUG).
- UdpMmAgent: "UdpMmAgent"是由"UdpAgent"修改得来并具有以下附加功能: (1) 把从"MmApp"收到的信息写入发送数据包的MM报头(或从收到数据包的MM报头读取信息并提交给"MmApp"), (2) 分割(segmentation)和重组(re-assembly) ("UdpAgent"只实现了分割), 和 (3) 为"MmApp"数据包设置优先级位(priority bit) (IPv6) to 15 (max priority)。
- Modify "agent.h": 为了让新的程序和代理在NS中运行, 应该给"Agent"类加入2个公共方法。 在"MmApp"类的成员函数"command"中定义一个名为"attach-agent"的OTcl命令。 当从OTcl收到这个命令时, "MmApp"尝试把它自己附加到底层的代理(underlying agent )上。 在附加前, 它调用底层代理的成员函数"supportMM()"去检查是否底层代理支持多媒体传输multimedia transmission (i.e. 它是否能够携带数据从一个应用程序到另一个), 并且如果可以传输的话就调用"enableMM()"。 尽管在"UdpMmAgnet"类中定义了这2个成员函数, 而没有在它的基类"Agent"中定义, 并且是在常用的"Agent"类的这两个成员函数被调用到。Even though these two member functions are defined in the "UdpMmAgnet" class, it is not defined in its base ancestor "Agent" class, and the two member functions of the general "Agent" class are called. 因此, 当尝试去编译代码时,会收到报错信息。 把这两个方法method做为"Agent"类的公共的成员函数加入到"agent.h"去解决这个问题。
Figure 26 (a). Add two member functions to "Agent" class. - Modify "app.h": 添加一个成员函数"recv_msg(int nbytes, const char *msg)"到"Application"类, 见Figure 26 (b)。 在旧版本的NS(ns-2.1b4a)这个成员函数包含在"Application"类中,但在新版本中被移除(ns-2.1b8a)。 Our multimedia application was initially written for the ns-2.1.b4a, and therefore requires "Application::recv_msg()" member function for ns-2.1b8a or later versions.
Figure 26 (b). Add a member function to "Application" class. - Set default values for new parameter in the "ns-default.tcl": 在实现了应用程序和代理的所有部件后, 最后要做的就是为新加入的可配置参数设置默认值在"ns-default.tcl"文件中。 Figure 26 展示了为"MmApp"引入的可配置参数设置默认值的例子。
Figure 27. Default parameter value settings
在重新编译NS前先核对以下几项。
- 下载 "mm-app.h", "mm-app.cc", "udp-mm.h" and "udp-mm.cc"(打包在附件的source code.zip)到"ns-2"文件夹。
- 确定已经注册了新的application header通过修改"packet.h" and "ns-packet.tcl" 如同所示在Figure 24 (a)和(b)。
- 添加supportMM()和enableMM()方法到"Agent"类在"agent.h"中,见Figure 26 (a)。
- 添加recv_msg()方法到"Application"类在"app.h"中,见Figure 26 (b)。
- 为在"ns-default.tcl"文件中新加入的可配置参数设置默认值, 见Figure 27。 一定要完成最后一步, 否则所有的five-scale rates都初始化为零,除非在模拟脚本中指定(i.e. 后面给出的测试模拟的脚本没有传输任何frames).
完成以上内容后, 修改"Makefile"如果需要的话(把"mm-app.o"和"udp-mm.o"加入到object file list) 并重新编译NS。 在重新编译前一定要运行"make clean"和"make depend", 否则新的应用程序不能传输任何数据包。 良好的习惯做法是在改动"Makefile"后就运行"make depend",然后再去重新编译re-compile。
Figure 28 演示了用来测试"MmApp"的模拟拓扑和场景, 而Figure 29 是test simulation script (见附件ex-mm-app.zip).
Figure 28. Test Simulation Topology and Scenario
- source_code.zip (5 KB)
- 下载次数: 33
- ex-mm-app.zip (936 Bytes)
- 下载次数: 30
发表评论
-
几种用于WSN的仿真工具
2009-12-09 15:26 4241为评价无线传感器网络协议算法的性能,仅通过实验是无法实现的,特 ... -
OMNeT++中文用户手册(完全版)
2009-11-18 22:36 16647http://www.netforum.com.cn/view ... -
改变Telos 系列节点Serial baud rate
2009-08-21 18:50 2198如果节点与PC通信时出现非正常丢包或者serial不稳定当收包 ... -
TinyOS编译问题
2009-08-18 20:47 13241. 有时候编译提示找不到某个文件时, 可能是由于在linux ... -
改变节点transmission power, radio power level (tx_power)
2009-08-11 20:03 4317使用 CC2420Packet 中 setPower 来改变每 ... -
Tcl/tk 小记
2009-07-22 23:43 15331. 检查variable变量是否声明 在使用Tcl时候会经常 ... -
NS无线仿真中无法设置节点颜色的解决方案
2009-07-22 18:57 1935NS中提供了配置节点与 ... -
awk: malloc(): memory corruption 错误
2009-07-09 21:56 7250问题如下: *** glibc detected *** aw ... -
ns2 对无线网络模拟
2009-07-06 19:52 2663在模拟无线网络时需要对tcl模拟脚本文件的参数进行设置,比如P ... -
使用Gnuplot 绘制ns2模拟结果图
2009-06-25 17:48 8215Gnuplot(command-driven inter ... -
ns2模拟无线网络的NAM动画
2009-06-24 22:26 5010无线的各个参数 ####################### ... -
ns2 模拟WSN协议之手记
2009-06-23 23:55 2958ns2中模拟WSN,用Timestamp时间戳计算点对点Del ... -
ns2 中得到Agent的实例
2009-06-16 21:02 2914下面代码说明了如何访问其他节点的Agent,以AODV协议为例 ... -
TinyOS使用MIG时报错!
2009-04-06 01:30 1829在Makefile中加入启用MIG的选项后,编译出现一下错误: ... -
Tinyos 2.0 笔记小结(1)
2009-03-16 20:11 23661. configure组件注意事项 一般在confi ... -
Tinyos 2.0使用笔记
2009-03-06 19:48 27931.编译与安装程序到节点 引用 $ make mica2 ... -
Tinyos 中常用术语
2009-03-05 03:32 1095EOFF 关断能量损耗 用于 device off, stop ... -
什么是 nx_ type
2009-03-01 03:29 1515nx_ types 是在nesC 1.2,tinyos中用到的 ... -
TinyOS 下安装 JNI 的问题
2009-02-25 00:05 32261. "java not found, not i ... -
『TinyOS』学习笔记 #11?
2009-02-20 01:09 3811Lesson 11 TOSSIM Compiling ...
相关推荐
在本篇“NS by Example 笔记(12)Add New Queue”中,我们将探讨如何在计算机网络模拟软件NS-2(Network Simulator 2)中添加新的队列管理器。NS-2是一款广泛用于研究和教学的开源网络模拟工具,它允许用户模拟各种...
《NS by Example》是一本专为初学者设计的IT技术图书,主要聚焦于"NS"相关的编程概念和技术。"NS"通常指的是Objective-C中的“Foundation框架”中的“NS”(Namespace)前缀,它代表“Next Step”,是Apple macOS和...
《NS by Example》是针对网络仿真工具NS(Network Simulator)的一份详细教程,旨在帮助初学者快速掌握NS的使用方法和技巧。NS是一款强大的开源软件,广泛用于研究计算机网络、移动通信网络以及无线网络的性能分析和...
《NS2 by Example》是NS2(网络模拟器2)学习者的重要参考资料,尤其适合初学者。这本书通过实例教学的方式,让读者深入理解和掌握NS2的使用,即使对于英语不太熟练的学习者,也能通过实例的详细讲解和分析,逐步...
which simulates the behavior of an imaginary multimedia application that implements "five rate media scaling" that can respond to network congestion to some extent by changing encoding and ...
《ns by Example》是一个以实例为主的教程,旨在帮助读者深入理解和掌握ns的相关知识。"ns"通常指的是网络模拟器(Network Simulator),它是一个强大的工具,用于模拟和分析网络行为。在这个教程中,我们将通过一系列...
ns2 by example 经典的ns2学习资料
《Ns2 by Example》是一本非常适合初学者的网络模拟软件Ns2的学习指南。Ns2(Network Simulator 2)是一款广泛使用的开源网络模拟器,它允许研究人员和学生在虚拟环境中模拟和分析各种网络协议和拓扑结构。这本书...
### NS2基础知识与实践指南 ...通过上述介绍,我们不仅了解了NS2的基本结构和使用方法,还学会了如何利用《NS by Example》这一宝贵资源来提升自己的NS2技能。希望每位读者都能从中受益,快速成为NS2的专家级用户。
### ns2学习:从《ns by example》理解网络模拟器 #### 概览与基础知识 《ns by example》是一份详尽的指南,专为希望深入理解ns2(一种事件驱动的网络模拟器)的初学者设计。不同于繁杂的技术手册,这份资料以...
"There There_ns2_ns_by_example"这个压缩包,正如其名,提供了通过实例学习NS2的方法,旨在帮助新手快速上手。 NS2的核心在于它的事件驱动模型,这种模型使得模拟网络中的各种事件(如数据包发送、接收、路由等)...
总体而言,“ns-by-example”项目不仅是一份详尽的NS使用指南,更是一个宝贵的学习资源库,它通过实例教学的方式降低了NS的入门难度,使更多研究人员和学生能够迅速掌握这款强大的网络模拟工具,开展深入的网络科学...