现在的位置: 首页 > 综合 > 正文

在vs.net 2003中编译ns2(7):编译bluehoc

2013年09月17日 ⁄ 综合 ⁄ 共 7320字 ⁄ 字号 评论关闭
  BlueHoc是IBM开发的一个蓝牙仿真模块,它做为NS的一个扩展模块存在,有资料说它只能与ns2.18版本一起使用,但经研究发现,它其实也可以在ns2.29下编译运行,以下介绍其过程。(ns及其它模块的编译见前文)

1)      将BlueHoc整个目录复制到winns目录下。
2)      将BlueHoc/src目录下的所有文件添加到winns.dll工程中。
3)      将BlueHoc/src目录添加到头文件的搜索目录中。
4)      打开winns/common/packet.h,找到如下行:
#define HDR_LMS(p)     (hdr_lms::access(p))
在其后添加两行:
#define HDR_BT(p)     (hdr_bt::access(p))
#define HDR_L2CAP(p)   (hdr_l2cap::access(p))
4)打开winns/trace/trace.h,找到如下行:
#include "basetrace.h"
在其后添加两行:
#include "bt-core.h"
#include "globals.h"
在Trace这个类中找到如下行:
     int show_sctphdr_; // bool flags; backward compat
在其后添加如下行:
     // added for Bluetooth trace
     int btTrace_;
在trace.h文件的末尾添加如下类的定义:
 
class BTNodeTrace : public Trace {
public:
     BTNodeTrace() : Trace(0) {}
     ~BTNodeTrace();
     void recv(Packet* p, Handler* h);
     void changeNodeColor(state_type, state_type);
};
 
5)打开winns/trace/trace.cc,在Trace::Trace()构造函数中添加行:
     bind("namBTTrace_", &btTrace_);
添加如下代码实现BTNodeTrace这个类:
 
 static class BTNodeTraceClass : public TclClass {
 public:
     BTNodeTraceClass() : TclClass("Trace/BTNodeColor") { }
     TclObject* create(int , const char*const*) {
         return (new BTNodeTrace());
     }
 } btnodetrace_class;
 
 void
 BTNodeTrace::recv(Packet* p, Handler* h)
 {
     target_->recv(p,h);
 }
 
 void
 BTNodeTrace::changeNodeColor (state_type curr, state_type prev)
 {
     string s = StateName[curr];
     string s1 = StateName[prev];
     string c_new = ColorName[curr];
     string c_old = ColorName[prev];
     const char* name = s.c_str();
     const char* name1 = s1.c_str();
     const char* color_new = c_new.c_str();
     const char* color_old = c_old.c_str();
     if (pt_->nbuffer() != 0)
     {
         sprintf(pt_->nbuffer(),
              "%c -t "TIME_FORMAT" -s %d -S COLOR -c %s -o %s",
              'n',
              Scheduler::instance().clock(),
              src_,
              color_new,
              color_old);
         pt_->namdump();
         sprintf(pt_->nbuffer(),
              "%c -t "TIME_FORMAT" -s %d -S DLABEL -l %s -L %s",
              'n',
              Scheduler::instance().clock(),
              src_,
              name, name1);
         pt_->namdump();
     }
 }
 
 BTNodeTrace::~BTNodeTrace()
 {
 }
6)打开winns/trace/trace.cc,找到DequeTrace::recv函数中的如下代码:
         if (pt_->nbuffer() != 0) {
              sprintf(pt_->nbuffer(),
                   "%c -t "TIME_FORMAT" -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}",
                   'h',
                   Scheduler::instance().clock(),
                   src_,
                  dst_,
                   name,
                   th->size(),
                   iph->flowid(),
                   th->uid(),
                   iph->flowid(),
                   src_nodeaddr,
                   src_portaddr,
                   dst_nodeaddr,
                   dst_portaddr,
                   -1, flags, sname);
              pt_->namdump();
         }
         if (pt_->tagged() && pt_->buffer() != 0) {
              sprintf(pt_->buffer(),
                   "%c "TIME_FORMAT" -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}",
                   'h',
                   Scheduler::instance().clock(),
                   src_,
                  dst_,
                   name,
                   th->size(),
                   iph->flowid(),
                   th->uid(),
                   iph->flowid(),
                   src_nodeaddr,
                   src_portaddr,
                   dst_nodeaddr,
                   dst_portaddr,
                   -1, flags, sname);
              pt_->dump();
         }
 
         delete [] src_nodeaddr;
         delete [] src_portaddr;
         delete [] dst_nodeaddr;
         delete [] dst_portaddr;
将之修改为:
         if(!btTrace_)
         {
              if (pt_->nbuffer() != 0) {
                   sprintf(pt_->nbuffer(),
                       "%c -t "TIME_FORMAT" -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}",
                       'h',
                       Scheduler::instance().clock(),
                       src_,
                      dst_,
                       name,
                       th->size(),
                       iph->flowid(),
                       th->uid(),
                       iph->flowid(),
                       src_nodeaddr,
                       src_portaddr,
                       dst_nodeaddr,
                       dst_portaddr,
                       -1, flags, sname);
                   pt_->namdump();
              }
              if (pt_->tagged() && pt_->buffer() != 0) {
                   sprintf(pt_->buffer(),
                       "%c "TIME_FORMAT" -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}",
                       'h',
                       Scheduler::instance().clock(),
                       src_,
                       dst_,
                       name,
                       th->size(),
                       iph->flowid(),
                       th->uid(),
                       iph->flowid(),
                       src_nodeaddr,
                       src_portaddr,
                       dst_nodeaddr,
                       dst_portaddr,
                       -1, flags, sname);
                   pt_->dump();
              }
         }
         else
         {
              hdr_bt* bt = (struct hdr_bt*)(p)->access(hdr_bt::offset_);
              unsigned char print = 0;
              //string c = PacketColors[bt->type];
              int colorindex = bt->type;
              if (dst_ == 0 && !(bt->dir)) {
                   src_ = bt->sendId_;
                   print = 1;
                   //c = "red";
              }
              else if (dst_ && bt->dir) {
                   if (!(bt->am_addr) || bt->recvId_ == dst_) {
                       print = 1;
                       //c = "green";
                   }
              }   
              //const char* color = c.c_str();
              if (print && pt_->nbuffer()) {
                   sprintf(pt_->nbuffer(),
                       "%c -t "TIME_FORMAT" -s %d -d %d -p %s -e %d -c %d -i %d -a %d -x {%s.%s %s.%s %d %s %s}",
                       'h',
                       Scheduler::instance().clock(),
                       src_,
                       dst_,
                       name,
                       th->size(),
                       iph->flowid(),
                       th->uid(),
                       /*iph->flowid(),*/
                       colorindex,
                       src_nodeaddr,
                       src_portaddr,
                       dst_nodeaddr,
                       dst_portaddr,
                       -1, flags, sname);
                   pt_->namdump();
              }
         }
         delete [] src_nodeaddr;
         delete [] src_portaddr;
         delete [] dst_nodeaddr;
         delete [] dst_portaddr;
7)打开winns/mobile/god.h和god.cc,将其中的vector这个类名称替换为vector_ns。
8)打开winns/bluehoc/src/l2cap.cc,找到如下行:
                   cid_attr->rcid = rcid;
                   cid_attr->ch = connection_handle;
                   cid_attr->state = OPEN;
                   bthost = (BTHost*)uptarget_;
                   bthost->L2CA_ConnectCfm(cid_attr->lcid, connection_handle, cid_attr->psm);
将之修改为:
              if(cid_attr) // 避免空指针错误
              {
                   cid_attr->rcid = rcid;
                   cid_attr->ch = connection_handle;
                   cid_attr->state = OPEN;
                   bthost = (BTHost*)uptarget_;
                   bthost->L2CA_ConnectCfm(cid_attr->lcid, connection_handle, cid_attr->psm);
              }
9)编译生成winns.dll。
10)将winns/bluehoc/tcl/ns-btnode.tcl复制到winns/tcl/lib目录下。
11)打开winns/tcl/lib/ns-lib.tcl,找到如下行:
source ns-mobilenode.tcl
在其后添加一行:
source ns-btnode.tcl
12)打开windows命令行并切换到winns目录下,运行如下命令:
tclsh bin/tcl-expand.tcl tcl/lib/ns-lib.tcl | tcl2c et_ns_lib > ns_tcl.cc
生成ns_tcl.cc文件,将之添加到nssh工程中,替换原有文件。
13)编译运行nssh.exe。
14)将winns/bluehoc/examples下的文件复制到winns/bluehoc/tcl目录下,运行:
Source simxxx.tcl
好好享受吧!!

 

抱歉!评论已关闭.