2014-02-12 170 views
1

我在MATLAB中编写了一个应用程序来打开一个UDP套接字并侦听传入的数据报。基本上,这样的事情:收听多播UDP地址

u = udp(rHost, rPort, 'LocalHost', lHost, 'LocalPort', lPort); 
u.DatagramAvailableFcn = @(o,e) operateOnData(o,e); 
fopen(u); 

当我以单播方式听东西的时候,这很有用。但我现在想能够监听多播流量。显然,this isn't possible in MATLAB

的解决方法是,按照上面的链接,

的解决方法是连接到一个UDP多播,您可以执行以下操作:

  1. 使用Java多播套接字进行访问直接来自MATLAB。有关更多信息,请参阅Sun的“核心java.net”类的javadoc或教程,特别是“java.net.MulticastSocket”。这可以在这里找到:

http://java.sun.com/j2se/1.4.2/docs/api/java/net/MulticastSocket.html

我已经在Java中没有背景,所以这是对我的斗争。我只能够运行下面的实例化一个对象MulticastSocket

>> ms = javaObject('java.net.MulticastSocket'); 

我环顾四周,发现我还需要一个java.net.Datagram对象实际上包含的输入流。

如何在MATLAB的上下文中使用MulticastSocketDatagram对象?我试图复制u.DatagramAvailableFcn的功能,即一旦我收到数据报,就会触发一个回调操作数据报的内容。

编辑:看起来像this is how I want to go about this在Java方面,但现在它越来越这回MATLAB的土地......

回答

0

我成功认购,并从多播流接收的数据包,通过如下:

socket = java.net.MultiSocket(streamPort); 
socket.joinGroup(java.net.InetAddress.getByName(streamIP)); 
socket.setReuseAddress(1); 

packet = java.net.DatagramPacket(zeros(1, intmax('uint16'), 'int8'), intmax('uint16')); 

socket.receive(packet); 

socket.leaveGroup(InetAddress.getByName(streamIP)); 
socket.close; 

msg = packet.getData; 
msg = msg(1:packet.getLength); 

这基本上从judp availble的解除了MathWorks的文件交换。

我仍在寻找一种方法来获得DatagramReceivedFcn的一些等价物 - 现在它看起来像socket.receive呼叫被阻塞,直到超时。我可以使用timer对象定期触发“回调”,但这当然与具有DatagramReceivedFcn不同。