Streaming data to Python via unicast and multicast
Posted: Mon Nov 09, 2015 8:05 am
I'm attempting to read streaming data from Motive Tracker. I'm trying to read the data using a Python application running on a second computer. I've adapted the example in PacketClient.cpp, and managed to get a version working to connect via Multicast. A simpler program that tries to connect via Unicast doesn't work. Comments on both short programs are below. Can anyone provide any insight as to what's going on?
I'm using Motive Tracker v1.5.0, NatNet Streaming Module v2.5.0.0. Both computers are running Windows 7 with firewall disabled.
Version #1, connect via unicast.
Version #2, connect via multicast.
I'm using Motive Tracker v1.5.0, NatNet Streaming Module v2.5.0.0. Both computers are running Windows 7 with firewall disabled.
Version #1, connect via unicast.
Code: Select all
## This version doesn't work. Why not??
## It connects to the correct server address and
## data port via socket.connect().
## Motive Tracker is set to broadcast via Unicast.
import socket as socket
import struct as struct
SOCKET_BUFSIZE = 0x100000
client_address = '172.22.193.58'
server_address = '172.22.193.57' ## Motive Tracker set to Unicast
command_port = 1510
data_port = 1511
## Connect to server address
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sock.connect((server_address, data_port)) ## <--- Using the server address
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SOCKET_BUFSIZE)
## Set to non-blocking
sock.setblocking(0)
## The socket connects without error, but never reads any data
while True:
try:
## This never reads any data
msg, address = sock.recvfrom(SOCKET_BUFSIZE)
except:
pass
else:
print(msg, "\n")
Code: Select all
## Connect via Multicast. This version works.
import socket as socket
import struct as struct
SOCKET_BUFSIZE = 0x100000
client_address = '172.22.193.58'
server_address = '172.22.193.57' ## Motive Tracker set to Multicast
multicast_address = '239.255.42.99'
command_port = 1510
data_port = 1511
# Bind client address at data port
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
sock.bind((client_address, data_port))
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, SOCKET_BUFSIZE)
# Add the client IP address to the multicast group
mreq = struct.pack("=4s4s",
socket.inet_aton(multicast_address),
socket.inet_aton(client_address))
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
# Set to non-blocking
sock.setblocking(0)
while True:
try:
msg, address = sock.recvfrom(SOCKET_BUFSIZE)
except:
pass
else:
print(msg, "\n")