1

在问这个问题之前,我想告诉你我已经搜索了一个多月。我会说我知道 ns2,但我肯定能够理解您所说的任何内容 [希望]

我想在 NS2 的无线移动节点拓扑中实现广度优先搜索 (BFS) 并创建 BFS 树。[让我们先为静态系统做。]

我的挑战:向节点的所有邻居多播消息。

现在我在我的想象中认为

  1. 节点将设置在那里的位置。[可行]
  2. 每个节点都能够找到它的邻居。[可行吗?] 或者我必须自己创建“组”并进行“加入组”以形成这些邻居。
  3. 向邻居多播消息。[可以使用“组”],但我希望节点知道我可以连接什么并自行完成。

其中有哪些可能?

4

1 回答 1

3

好的,所以在完成我的项目后,我想分享一下我是如何做到的。我还在学习,但是是的,我是这样做的。

场景是无线的。

在 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.

} //关闭开关

}

通过这种方式,我知道谁是我的邻居。

可以添加更多类型的消息和更多功能。

于 2013-04-24T23:07:47.400 回答