Skip to content

Commit 9973bcc

Browse files
committed
Add debug script
1 parent 987f90e commit 9973bcc

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

debug/ssdp_client.py

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""
2+
SSDP Debug Tool which listens for SSDP packets on the network.
3+
Prints the details of the SSDP packets received.
4+
5+
"""
6+
7+
import socket
8+
import threading
9+
import time
10+
import struct
11+
import select
12+
13+
class SSDPClient:
14+
def __init__(self, multicast_group='239.255.255.250', multicast_port=1900, interface_ip='0.0.0.0'):
15+
self.multicast_group = multicast_group
16+
self.multicast_port = multicast_port
17+
self.interface_ip = interface_ip
18+
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
19+
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
20+
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) # Allow multiple bindings
21+
self.sock.bind((self.interface_ip, self.multicast_port))
22+
23+
# Join the multicast group
24+
mreq = struct.pack("4sl", socket.inet_aton(self.multicast_group), socket.INADDR_ANY)
25+
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
26+
27+
self.sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
28+
self.running = True
29+
self.thread = threading.Thread(target=self.listen)
30+
self.thread.start()
31+
32+
def listen(self):
33+
while self.running:
34+
try:
35+
data, addr = self.sock.recvfrom(1024)
36+
self.handle_ssdp_packet(data, addr)
37+
except Exception as e:
38+
print(f"Error receiving SSDP packet: {e}")
39+
40+
def handle_ssdp_packet(self, data, addr):
41+
print(f"Received SSDP packet from {addr}: {data}")
42+
43+
def stop(self):
44+
self.running = False
45+
self.sock.close()
46+
self.thread.join()
47+
48+
def main():
49+
ssdp_client = SSDPClient()
50+
try:
51+
print("Listening for SSDP packets...")
52+
while True:
53+
time.sleep(1)
54+
except KeyboardInterrupt:
55+
print("Stopping SSDP client...")
56+
ssdp_client.stop()
57+
58+
if __name__ == "__main__":
59+
main()
60+
else:
61+
print("This script is intended to be run directly, not imported as a module.")
62+
print("Run it using: python ssdp_client.py")
63+
exit(1)

0 commit comments

Comments
 (0)