用于基于范围的无线传感器网络 (WSN) 定位的 Java 观察者模式

标签 java algorithm design-patterns

我正在构建基于范围的无线传感器网络定位 (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

enter image description here

最佳答案

我能想到两件事:

1- 为所有传感器提供一个 ID,并将其放入广播消息中。当您收到一条消息时,请检查发件人 ID,如果是您自己的 ID,则忽略该消息。

2- 在传感器类中保留一个成员,例如 bool mAlreadyLocalized。第一次本地化时将其设置为真并广播。下次您收到消息时,请检查您在本地化时是否已经广播,如果已经广播,则不要再次广播。

if(localizeSelf() && !mAlreadyLocalized) 
        broadcastPosition();

关于用于基于范围的无线传感器网络 (WSN) 定位的 Java 观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27212307/

相关文章:

java - 如何使用属性文件通过 struts2 更改 jquerytheme

javascript:私有(private)成员和只读属性

c++ 回调 - 虚函数的编译时替代方案

algorithm - 使用另一种算法修复 Perlin 噪声产生的方向性伪影

java - 在多项式时间内使用 DFS 的最小命中集算法

java - 查看数组是否包含给定范围内的数字

c# - 在运行时将类型传递给 FirstOrDefault

Java swing mousemove 只触发一次

java - 使用 Undertow 基于文本的处理程序配置格式的示例

java - Android 中的内存管理