Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
rolandoislas
GitHub Repository: rolandoislas/drc-sim
Path: blob/master/drc-info.py
128 views
1
import codecs
2
import json
3
import select
4
import socket
5
import sys
6
import time
7
from threading import Thread
8
9
from src.server.data.struct import input, command
10
11
PORT_WII_MSG = 50010
12
PORT_WII_VID = 50020
13
PORT_WII_AUD = 50021
14
PORT_WII_HID = 50022
15
PORT_WII_CMD = 50023
16
17
sock_cmd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
18
sock_cmd.bind(("192.168.1.10", PORT_WII_CMD))
19
sock_msg = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
20
sock_msg.bind(("192.168.1.10", PORT_WII_MSG))
21
sock_hid = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
22
sock_hid.bind(("192.168.1.10", PORT_WII_HID))
23
sock_vid = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
24
sock_vid.bind(("192.168.1.10", PORT_WII_VID))
25
sock_aud = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
26
sock_aud.bind(("192.168.1.10", PORT_WII_AUD))
27
28
json_dump = {}
29
30
31
def print_packet(sock, name):
32
data = sock.recv(2048)
33
print("%s: %s" % (name, codecs.encode(data, "hex").decode()))
34
35
36
def print_packet_cmd(sock):
37
data = sock.recv(2048)
38
print("cmd: %s" % codecs.encode(data, "hex").decode())
39
header = command.header.parse(data)
40
if header.packet_type != 2: # Only accept response packets
41
return
42
size = 8 # header size
43
if header.cmd_id == 1:
44
data_string = codecs.encode(data[size:], "hex").decode()
45
print("cmd 1: %s" % data_string)
46
json_dump["1"] = data_string
47
elif header.cmd_id == 0:
48
data_string = codecs.encode(data[size + command.header_cmd0.sizeof():], "hex").decode()
49
print("cmd 0 %d %d: %s" % (header.id_primary, header.id_secondary, data_string))
50
if "0" not in json_dump:
51
json_dump["0"] = {}
52
if str(header.id_primary) not in json_dump["0"]:
53
json_dump["0"][str(header.id_primary)] = {}
54
json_dump["0"][str(header.id_primary)][str(header.id_secondary)] = data_string
55
56
57
def send_cmd(data):
58
sock_cmd.sendto(data, ("192.168.1.11", PORT_WII_CMD + 100))
59
60
61
def send_command_from_string(command_string, sid):
62
send_data = command.header.parse(codecs.decode(command_string, "hex"))
63
send_data.seq_id = sid
64
if send_data.cmd_id == 1:
65
send_data.mic_enabled = 0 # floods logs with audio data if enabled
66
send_data = command.header.build(send_data)
67
send_cmd(send_data)
68
sid += 1
69
sid %= 65535
70
time.sleep(1)
71
return sid
72
73
74
def cmd_request():
75
sid = 0
76
while True:
77
data = {
78
0: {0: {0: "000000000c0005087e0115880040000000000000", # TODO construct these
79
10: "000000000d0005007e0101780040000a0000000100"},
80
4: {4: "000000000c0005007e0109780040040400000000",
81
10: "000000000d0005117e012fc80040040a0000000100",
82
11: "000000000c0005017e0107180040040b00000000"},
83
5: {6: "000000000c0005007e0101a80040050600000000",
84
12: "00000000110005007e0102f80040050c000000050e0300870f",
85
16: "0000010030000580010000000000000000000000803e0000000100029e0000000000000070000000404003002d0000"
86
"018000400000000000", # FIXME 0 5 16 is a CMD 1 broadcast - missing actual request
87
24: "00000000160005007e0101c8004005180000000a54313936333030303030"}
88
},
89
1: "000001003000051a010000000000000000000000803e000000010002000000000000000070000000404003002d00000"
90
"10000000000000000"
91
}
92
for cmd in data.keys():
93
if isinstance(data[cmd], str):
94
print("Sending command %d" % cmd)
95
sid = send_command_from_string(data[cmd], sid)
96
else:
97
for primary_id in data[cmd].keys():
98
for secondary_id in data[cmd][primary_id].keys():
99
print("Sending command %d %d %d" % (cmd, primary_id, secondary_id))
100
sid = send_command_from_string(data[cmd][primary_id][secondary_id], sid)
101
102
103
def print_hid(sock):
104
data = sock.recv(2048)
105
input_parsed = input.input_data.parse(data)
106
print(input_parsed)
107
108
109
if __name__ == '__main__':
110
hid = len(sys.argv) > 1 and sys.argv[1] == "--hid"
111
112
if not hid:
113
send_thread = Thread(target=cmd_request)
114
send_thread.daemon = True
115
send_thread.start()
116
117
while True:
118
try:
119
rlist, wlist, xlist = select.select((sock_cmd, sock_msg, sock_hid, sock_vid, sock_aud), (), (), 1)
120
if rlist:
121
for s in rlist:
122
if s == sock_hid and hid:
123
print_hid(s)
124
if hid:
125
continue
126
if s == sock_aud:
127
print_packet(s, "aud")
128
elif s == sock_vid:
129
print_packet(s, "vid")
130
elif s == sock_cmd:
131
print_packet_cmd(s)
132
elif s == sock_msg:
133
print_packet(s, "msg")
134
except KeyboardInterrupt:
135
if not hid:
136
dump = open("region_dump.json", "w")
137
dump.write(json.dumps(json_dump, indent=4))
138
dump.close()
139
print("Wrote dump to region_dump.json")
140
sys.exit(0)
141
142