2017-07-21 21:59:18 +02:00
|
|
|
#!/usr/bin/env python2
|
|
|
|
|
|
|
|
import json
|
|
|
|
import socket
|
|
|
|
import sys
|
|
|
|
import urllib2
|
|
|
|
import xml.etree.ElementTree as ET
|
|
|
|
|
|
|
|
SSDP_ADDR = "239.255.255.250";
|
|
|
|
SSDP_PORT = 1900;
|
|
|
|
SSDP_MX = 1;
|
|
|
|
SSDP_ST = "urn:ses-com:device:SatIPServer:1";
|
|
|
|
|
|
|
|
ssdpRequest = "M-SEARCH * HTTP/1.1\r\n" + \
|
|
|
|
"HOST: %s:%d\r\n" % (SSDP_ADDR, SSDP_PORT) + \
|
|
|
|
"MAN: \"ssdp:discover\"\r\n" + \
|
|
|
|
"MX: %d\r\n" % (SSDP_MX, ) + \
|
|
|
|
"ST: %s\r\n" % (SSDP_ST, ) + "\r\n";
|
|
|
|
|
|
|
|
data = None
|
|
|
|
urls = list()
|
|
|
|
devices = list()
|
|
|
|
|
|
|
|
# find out available SAT>IP servers
|
|
|
|
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
|
|
|
sock.setblocking(0)
|
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
|
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
|
|
|
|
try:
|
|
|
|
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
sock.settimeout(1)
|
2017-07-31 09:15:13 +02:00
|
|
|
sock.bind(("0.0.0.0", SSDP_PORT))
|
2017-07-21 21:59:18 +02:00
|
|
|
sock.sendto(ssdpRequest, (SSDP_ADDR, SSDP_PORT))
|
|
|
|
try:
|
|
|
|
while 1:
|
|
|
|
data = sock.recv(1024)
|
|
|
|
if data:
|
|
|
|
# find out their capabilities
|
|
|
|
for row in data.split("\r\n"):
|
|
|
|
if "LOCATION:" in row:
|
|
|
|
url = row.replace("LOCATION:","").strip()
|
|
|
|
if url in urls:
|
|
|
|
continue
|
|
|
|
urls.append(url)
|
|
|
|
f = urllib2.urlopen(url, timeout=2)
|
|
|
|
xml = f.read()
|
|
|
|
if xml:
|
|
|
|
root = ET.fromstring(xml)
|
|
|
|
name = root.find(".//*/{urn:schemas-upnp-org:device-1-0}friendlyName")
|
|
|
|
satipcap = root.find(".//*/{urn:ses-com:satip}X_SATIPCAP")
|
|
|
|
caps = dict()
|
|
|
|
for systems in satipcap.text.split(","):
|
|
|
|
cap = systems.split("-")
|
|
|
|
if cap:
|
|
|
|
# prepare the output data
|
|
|
|
count = int(cap[1])
|
|
|
|
if cap[0] in caps:
|
|
|
|
count = count + caps[cap[0]]
|
|
|
|
caps[cap[0]] = count
|
|
|
|
devices.append({"name": name.text, "frontends": caps})
|
|
|
|
else:
|
|
|
|
break
|
|
|
|
except:
|
|
|
|
pass
|
|
|
|
sock.close()
|
|
|
|
|
|
|
|
# print out the output data
|
|
|
|
json.dump(devices, fp=sys.stdout, sort_keys=True, indent=2)
|