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
好好享受吧!!