网络模拟器的 Matlab 事件监听器
Matlab event listener for network simulator
我正在尝试使用面向对象的 MatLab 构建网络模拟器。网络模拟器旨在用于事先不知道网络拓扑结构的临时网络。因此,Network 中的每个 Node 在 Field 中都有一个位置(注意斜体的使用表示 类 或实例)和传输半径。
我的问题来自消息的发送和接收。我想到了以下方法:每当 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
我正在尝试使用面向对象的 MatLab 构建网络模拟器。网络模拟器旨在用于事先不知道网络拓扑结构的临时网络。因此,Network 中的每个 Node 在 Field 中都有一个位置(注意斜体的使用表示 类 或实例)和传输半径。
我的问题来自消息的发送和接收。我想到了以下方法:每当 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