2015-09-04 94 views
1

本主题已经涵盖了很多详细信息here,不幸的是,我仍遇到一些麻烦。使用Python订阅UDP组播

我试图订阅从我的网络上的Windows框中的运动捕捉数据流。 mo-cap服务器通过我的网络进行广播,我可以在我的OS X机器('目标')上使用wireshark获取数据。根据需要,我发现源自ip 204.102.224.2(windows)的消息通过UDP在239.255.42.99上广播,到端口1511正在外出。

我的Python代码如下:

PORT = 1511 
MULTICAST_ADDRESS = '239.255.42.99' 
SOCKET_BUFSIZE = 1024 

datasock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) 
datasock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) 
datasock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
datasock.bind((MULTICAST_ADDRESS, PORT)) 
mreq = struct.pack("=4sl", socket.inet_aton(MULTICAST_ADDRESS), socket.INADDR_ANY) 
datasock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32) 
datasock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_LOOP, 1) 
datasock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SOCKET_BUFSIZE) 
datasock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq) 

while 1: 
    data = datasock.recv(rx.MAX_PACKETSIZE) 
    packet = rx.unpack(data, version=version) 
    if type(packet) is rx.SenderData: 
     version = packet.natnet_version 
     #print("NatNet version received:", version) 
    if type(packet) in [rx.SenderData, rx.ModelDefs, rx.FrameOfData]: 
     packet_dict = packet._asdict() 
     all_bodies = packet_dict['rigid_bodies'] 
     for body in all_bodies: 
      contortion = body._asdict()['orientation'] 
      euler = Quat([elem for elem in contortion]).equatorial 

我觉得我现在的问题是安全的忽略一些在循环的代码,因为它的一些我使用一个辅助库派生(optirx)。请注意,我并没有从所有选项开始,但决定将所有选项都包括在内,以查看应该保留的内容以及可以执行的操作。我尝试了各种组合和排列。我在OS X 10.10.3

+0

那么你的问题是什么或你的问题在哪里?什么可行,什么不行? – jaybers

+0

它的要点是我可以在windows中看到我的Mac上的多播广播,但从来没有能够用这段代码抓住它。我已经尝试了很多以上选项的组合。 – RYS

回答

1

的问题是在这里:

datasock.bind((MULTICAST_ADDRESS, PORT)) 

你应该套接字无法绑定到多播地址。你应该将它绑定到'0.0.0.0'。与IP_ADD_MEMBERSHIP的呼叫setsockopt负责加入多播组。

+0

谢谢,当我再次进入实验室时,我会试试这个。将回报。 – RYS