在传感器网络的协议设计中,考虑到节能的需要,设计协议时通常需要不同的协议层进行交互,比如Agent层调用MAC层或者PHY层的函数,计算传输或者接收数据消耗的能量,这种设计思想称为cross-layer。理论上讲,我们常规上一般要求网络协议分层设计,以达到简化网络模型的目的。
这个例子从Wangbo网站上转载而来,很有启发意义。该例子是在Aodv的Agent中调用MAC层协议。
具体步骤:
1.修改aodv/Aodv.h文件
- #include <mac.h>
- class AODV: public Tap, public Agent {
- public:
- void tap(const Packet *p);
- ......
- protected:
- Mac *mac_;
- ......
- }
其要点是二,一个是让AODV继承Tap类,另外要在其中加入mac_变量,同时加入一个取得Tap的函数。
2.修改aodv/Aodv.cc文件
- int
- AODV::command(int argc, const char*const* argv) {
- ......
- else if(argc == 3) {
- ......
- else if (strcmp(argv[1], "install-tap") == 0) {
- mac_ = (Mac*)TclObject::lookup(argv[2]);
- if (mac_ == 0) return TCL_ERROR;
- mac_->installTap(this);
- return TCL_OK;
- }
- }
- return Agent::command(argc, argv);
- }
- void
- AODV::tap(const Packet *p) {
- // put your code here
- }
要点是在aodv::command中加入install-tap接口。
3. 修改 tcl/lib/ns-mobilenode.tcl
- Node/MobileNode instproc add-target { agent port } {
- $self instvar dmux_ imep_ toraDebug_ mac_
- ......
- # Special processing for AODV
- set aodvonly [string first "AODV" [$agent info class]]
- if {$aodvonly != -1 } {
- $agent if-queue [$self set ifq_(0)] ; # ifq between LL and MAC
- $agent install-tap $mac_(0)
- ......
- }
参考:
http://www.cse.msu.edu/~wangbo1/ns2/nshowto1.html
http://hi.baidu.com/aoxinguy/blog/item/2feb5bdfbad37454cdbf1a26.html