我正在开发一种基于能量的路由协议,其中节点必须知道其可用的邻居,以便它可以获取邻居节点的能量详细信息并决定其下一跳。
a) 如何找到节点的可用邻居?
b) 在 和 的使用中PDU
,RemoteGetParamReq
哪种方法更适合检索邻居节点的能量?
我正在开发一种基于能量的路由协议,其中节点必须知道其可用的邻居,以便它可以获取邻居节点的能量详细信息并决定其下一跳。
a) 如何找到节点的可用邻居?
b) 在 和 的使用中PDU
,RemoteGetParamReq
哪种方法更适合检索邻居节点的能量?
a) 如果您正在编写自己的代理,您可以发送一个广播帧来查询邻居,并让邻居上的代理以随机退避响应该帧(以避免 MAC 冲突)。另一种黑客可能是使用RouteDisoveryReq
(参见https://unetstack.net/svc-31-rdp.html)将to
地址设置为不存在的节点。这将导致所有 1-hop 邻居重新广播您的路由发现请求,并且您将获得RouteDiscoveryNtf
每个邻居。
演示hack ( )的示例脚本rdpdemo.groovy
:
// settings
attempts = 1 // try only a single attempt at discovery
phantom = 132 // non-existent node address
timeout = 10000 // 10 second timeout
println 'Starting discovery...'
n = [] // collect list of neighbors
rdp << new RouteDiscoveryReq(to: phantom, count: attempts)
while (ntf = receive(RouteDiscoveryNtf, timeout)) {
println(" Discovered neighbor: ${ntf.nextHop}")
n << ntf.nextHop // add neighbor to list
}
n = n.unique() // remove duplicates
println("Neighbors: ${n}")
示例运行(samples/rt/3-node-network.groovy
节点 3 上的模拟):
> rdpdemo
Starting discovery...
Discovered neighbor: 1
Discovered neighbor: 2
Neighbors: [1, 2]
>
b) 这个问题的答案取决于你如何暴露你的能量信息。如果将其作为参数公开,则可以使用RemoteGetParamReq
来获取它。但是如果你已经在你的代理中实现了一些协议,那么有一个特定的 PDU 来传达信息就很容易了。