好的,所以在完成我的项目后,我想分享一下我是如何做到的。我还在学习,但是是的,我是这样做的。
场景是无线的。
在 NS 中生成节点很简单:
设置节点(0)[$ns 节点]
设置节点(1)[$ns 节点]
其中节点是一个数组。
设置节点位置:
$nodes(0) 设置 X_ 20.0
$nodes(0) 设置 Y_ 100.0
您可以使用某种数学方程来生成节点的拓扑。即他们的定位。查看 ns2-directory/tcl/ex/wireless-flooding.tcl。
为每个节点生成一个代理并将其附加到该节点。
设置代理(0)[新代理/MyAgent]
$nodes(0) 附加代理 $agents(0) $MESSAGE_PORT
由于我们对协议的所有逻辑工作都是在 Agents 中完成的,因此我们创建了一个 MyAgent 的 cpp 类。还将它添加到 Makefile 中。
类MyAgent:公共代理{
// 重写 recv() 函数。
// 为这个类添加命令函数,每当要求这个类的对象在 tcl 文件中做一些工作时调用它。
// 用于存储我从 PING 和 PING_REPLY 获得的邻居地址 std::vector myNeighbors;
}
然后每个代理广播 PING 消息并用 PING_REPLY 消息回复发送者。
这可以通过使用参数 addr_ = -1 发送地址 ns_addr_t 来完成
ns_addr_t naddr;
naddr.addr_ = -1
这些消息是不同类型的数据包,并在 cpp 类中再次创建,例如
枚举类型 {PING, PING_REPLY};
类 HdrPing {
类型类型;
// getter 和 setter 函数以及偏移量等其他变量。
}
为了编写接收任何消息的逻辑,这与我们的分布式协议的制作方式完全相同,我们重写了 Agent 的 recv()
void MyAgent :: recv(Packet*p, Handle*h) {
开关(HdrPing::访问(p)->类型){
case PING:
// send PING_REPLY back to sender and add the source of the packet p
// to my neighbor list.
// we can get it from ipHdr->saddr(), which is source address in the
// IP header of the packet.
break;
case PING_REPLY:
// add the sender of messge to my neighbor list.
break;
// other types of messages are also programmed here.
} //关闭开关
}
通过这种方式,我知道谁是我的邻居。
可以添加更多类型的消息和更多功能。