-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathArtemisProxy.py
133 lines (83 loc) · 2.69 KB
/
ArtemisProxy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import sys
import time
import socket
from Artemis import Decoder
import select
import argparse
parser = argparse.ArgumentParser("ArtemisProxy : proxy between Artemis clients and server, forwards certain events to OSC server")
parser.add_argument("--serverip", type=str, help="Artemis server IP", required=True)
parser.add_argument("--listenip", type=str, help="ip to listen for clients on", required=True)
parser.add_argument("--oscserverip", type=str, help="OSC server IP", default="")
parser.add_argument("--sntfile", type=str, help="snt file of ship being used", required=True)
args = parser.parse_args()
serverip = args.serverip
ktCount = 0
selectionPacketSent = False
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
serversocket.bind((args.listenip, 2010))
serversocket.listen(1)
print "Waiting for connection from client on %s .." % (sys.argv[2])
serverSock = None
while True:
(toClientSock, addr) = serversocket.accept()
print "got connection from ", addr
break
#packet header string
splitStr = "\xef\xbe\xad\xde"
print "conecting to artemis server at", serverip
toServerSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
toServerSock.connect((serverip, 2010))
print "..connected"
#set up our decoder, check if OSC is being used first
oscSettings = []
if args.oscserverip != "":
addrParse = args.oscserverip.split(":")
addr = addrParse[0]
port = 12000
if len(addrParse) == 2:
port = addrParse[1]
oscSettings = [addr, int(port)]
print "using osc!"
print "setting up.."
d = Decoder(args.sntfile, oscSettings)
inputs = [toServerSock, toClientSock]
outputs = []
#data from artemis server to client
buff = ""
#data from artemis client to server
fromClientBuff = ""
#list of packets extracted from stream to client
packets = []
workingPacket = ""
print "..done! Here we go.."
while(True):
(read, write, fucked) = select.select(inputs, [], [])
for r in read:
if r is toServerSock:
#read the data from the server
buff = toServerSock.recv(256)
elif r is toClientSock:
#read the data from the client
fromClientBuff = toClientSock.recv(256)
#scan the buffer for the start string and length
packets = []
startPacket = -1
pktIndex = 0
while pktIndex < len(buff):
if buff[pktIndex : pktIndex + 4] == splitStr:
pktIndex += 4
if len(workingPacket) > 0:
packets.append(workingPacket)
workingPacket = ""
else:
workingPacket += buff[pktIndex]
pktIndex += 1
for p in packets:
d.processPacket(p)
#now we've processed it we can forward data in its respective directions
if len(buff) > 0:
toClientSock.send(buff)
buff = ""
if len(fromClientBuff) > 0:
toServerSock.send(fromClientBuff)
fromClientBuff = ""