我在 MATLAB 中编写了一个应用程序来打开 UDP 套接字并监听传入的数据报。基本上是这样的:
u = udp(rHost, rPort, 'LocalHost', lHost, 'LocalPort', lPort);
u.DatagramAvailableFcn = @(o,e) operateOnData(o,e);
fopen(u);
当我以单播方式收听某些内容时,这非常有效。但我现在希望能够监听多播流量。显然,this isn't possible in MATLAB .
解决方法是,根据上面的链接,
block 引用>As a workaround to connect to a UDP multicast, you can do the following:
- Use a Java multicast socket to access it directly from MATLAB. For more information, see javadoc or tutorials for the "core java.net" classes from Sun, specifically "java.net.MulticastSocket". This could be found at:
http://java.sun.com/j2se/1.4.2/docs/api/java/net/MulticastSocket.html
我没有 Java 背景,所以这对我来说是一场斗争。我只能运行以下命令来实例化
MulticastSocket
对象:>> ms = javaObject('java.net.MulticastSocket');
我环顾四周,发现我还需要一个
java.net.Datagram
对象实际包含传入流。如何使用
MulticastSocket
和Datagram
MATLAB 上下文中的对象?我正在尝试复制u.DatagramAvailableFcn
的功能,即一旦收到数据报,就触发回调以对数据报的内容进行操作。编辑:看起来像this is how I want to go about this就 Java 而言,但现在它又回到了 MATLAB 领域......
最佳答案
我通过以下方式成功订阅并接收了来自多播流的数据包:
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
中提升的。可在 MathWorks 文件交换中使用。
我仍在寻找一种方法来获得与 DatagramReceivedFcn
相当的东西 - 现在看起来 socket.receive
调用正在阻塞,直到超时。我可以使用 timer
对象定期触发“回调”,但这当然与使用 DatagramReceivedFcn
不同。
关于java - 监听多播UDP地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21734856/