我正在构建基于范围的无线传感器网络定位 (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
最佳答案
我能想到两件事:
1- 为所有传感器提供一个 ID,并将其放入广播消息中。当您收到一条消息时,请检查发件人 ID,如果是您自己的 ID,则忽略该消息。
或
2- 在传感器类中保留一个成员,例如 bool mAlreadyLocalized。第一次本地化时将其设置为真并广播。下次您收到消息时,请检查您在本地化时是否已经广播,如果已经广播,则不要再次广播。
if(localizeSelf() && !mAlreadyLocalized)
broadcastPosition();
关于用于基于范围的无线传感器网络 (WSN) 定位的 Java 观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212307/