我正在构建基于范围的无线传感器网络本地化(WSN)的模拟。基于范围的WSN由测量距离的传感器组成。在这个阶段,传感器的技术细节并不重要。
传感器有两种状态:本地化和未本地化。
我需要实现一个观察者模式,原因如下:
传感器具有邻居,即其范围内的其他传感器。每当它被本地化时,它必须向邻居广播它的位置。 请注意,这是一个递归操作。 如果它的任何邻居都是本地化的,它也会广播它的位置。
当且仅当传感器可以使用距离三个局部邻居的距离来确定其位置时,才能对传感器进行本地化。
我有两个问题:
1)我应该将Sensor
类实现为
public class Sensor extends Observable implements Observer
2)如果是这样,我该如何模拟boradcast()
函数?
到目前为止,我已经尝试过:
void broadcastPosition()
{
for(Sensor s : neighbors)
s.neighborLocalized(this);
}
void neighborLocalized(Sensor s)
{
if(!neighborList.contains(s))
throw new IllegalArgumentException("This is not a neighbor");
localizedNeighbors.add(s);
if(localizeSelf()) \\ returns true if the sensor is able to localize itself
broadcastPosition();
}
然而,这种方法失败了,因为它进入了一个无限循环。
也许我应该使用wait()
和notify()
。
我发送了Aspnes等人的论文中提供的算法的屏幕截图。 2008
答案 0 :(得分:1)
我能想到两件事:
1-为所有传感器提供ID并将其放入boroadcast消息中。当您收到消息时,请检查发件人ID,如果是您自己的ID,请忽略该消息。
或
2-将传感器类中的成员保留为bool mAlreadyLocalized。您第一次本地化时将其设置为true并进行广播。下次收到消息时,检查您是否已在本地化时进行广播,如果已进行广播,请不要再次广播。
if(localizeSelf() && !mAlreadyLocalized)
broadcastPosition();