网络模拟器的 Matlab 事件监听器

Matlab event listener for network simulator

我正在尝试使用面向对象的 MatLab 构建网络模拟器。网络模拟器旨在用于事先不知道网络拓扑结构的临时网络。因此,Network 中的每个 NodeField 中都有一个位置(注意斜体的使用表示 类 或实例)和传输半径。

我的问题来自消息的发送和接收。我想到了以下方法:每当 Node 发送 Message 时,它会通知 Network 'MsgSent' 事件。为了处理这些事件,Network 为每个 Node 注册了一个 MsgListener。收到 'MsgSent' 事件后,应触发 handleMsgSent() 方法。在此方法中,Network 找出发送方范围内的 Node(s) 并为每个节点调用 receive()。

接下来我将展示我的 类 的一些片段来说明这一点:

classdef Network
    properties
        Nodes       % A list of the Nodes
        Field       % The field associated to the network
    end
    properties (Transient)
         MsgListeners     % List of MsgListeners (1 per node)
    end

    methods
        function net = Network(nnodes, field)
             % Deploys nnodes in the field
             % ....
             for i=1:nnodes
                 net.Nodes = [net.Nodes Node(i, randpos(i,:))];
                 net.MsgListener = [net.MsgListener addlistener(net.Nodes(i), 'MsgSent', @handleMsgSent)];
             end
             % ....
        end

        function handleMsgSent(this, src, msg)
             % Find out the neighbours in range of src and send them the msg
             % ...
             for i=NeighInRange
                 NeighInRange(i).receive(msg)
             end
             % ...
        end
        % ...
    end
end


classdef Node < handle
    properties 
        id              % Node identifier
        pos             % Geographic position [x, y]
        radius  = 0.2   % Transmission radius (default 0.2)
    end

    events
        MsgSent         % Indicates the node has sent a message
    end

    %...
    function send(this, dest, data)
         notify(this, 'MsgSent', Message(this.id, dest, data));
    end        

    function data = receive(this, msg)
         %Check if msg is addressed to this node and do whatever...
    end
    %...
end

这里的重点是我似乎没有在 Network 对象上接收到 'MsgSent' 事件,我不确定我的方法是否正确或应该我以不同的方式解决这个发送和接收。

非常感谢任何建议:)

因为handleMsgSent是一个class方法,所以需要指定在哪个对象上调用:

 addlistener(net.Nodes(i), 'MsgSent', @net.handleMsgSent)

这也记录在 MATLAB documentation 中。

以下对我有用:

Network.m

    classdef Network
    properties
        Nodes
    end
    properties (Transient)
         MsgListeners
    end

    methods
        function net = Network(nnodes)
             for i=1:nnodes
                 net.Nodes = [net.Nodes Node(i)];
             end
             for i=1:nnodes 
                net.MsgListeners = [net.MsgListeners addlistener(net.Nodes(i), 'MsgSent', @net.handleMsgSent)];
             end
        end

        function handleMsgSent(this, src, msg)
             for i=1:size(this.Nodes,2)
                 if(this.Nodes(i).id == msg.receiver)
                    this.Nodes(i).receive(msg);
                 end
             end
        end
    end
end

Node.m

classdef Node < handle
    properties
        id
    end

    events
        MsgSent
    end
    methods
        function this = Node(i)
            this.id = i;
        end
        function send(this, dest, data)
            notify(this, 'MsgSent', Message(this.id, dest, data));
        end

        function data = receive(this, msg)
            disp(msg);
        end
    end
end

Message.m

classdef (ConstructOnLoad) Message < event.EventData
    properties
        sender
        receiver
        data  
    end

    methods
       function msg = Message(s, r, d)
             msg.sender = s;
             msg.receiver = r;
             msg.data = d;
        end

    end
end