【问题标题】:Listening to a multicast UDP address侦听多播 UDP 地址
【发布时间】:2016-03-01 22:39:11
【问题描述】:

我在 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

解决方法是,根据上面的链接,

作为连接到 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 的功能,即,一旦我收到数据报,就会触发回调以操作数据报的内容。

编辑:在 Java 方面看起来像 this is how I want to go about this,但现在它又回到了 MATLAB 领域...

【问题讨论】:

    标签: java matlab udp multicast


    【解决方案1】:

    我通过以下方式成功订阅并接收了来自多播流的数据包:

    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);
    

    这基本上是从 MathWorks 文件交换上的 judp 中提取的。

    我仍在寻找一种方法来获得与DatagramReceivedFcn 等效的方法 - 现在看起来socket.receive 调用在超时之前一直处于阻塞状态。我可以使用timer 对象定期触发“回调”,但这当然与拥有DatagramReceivedFcn 不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多