m-searchでupnp機器検出してみる
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import traceback # m_search class m_search: # M_SEARCH_REQUEST M_SEARCH_REQUEST = "M-SEARCH * HTTP/1.1\r\n" + \ "MX: 3\r\n" + \ "HOST: 239.255.255.250:1900\r\n" + \ "MAN: \"ssdp:discover\"\r\n" + \ "ST: upnp:rootdevice\r\n\r\n" # BRODCAST_ADDRESS BRODCAST_ADDRESS = "239.255.255.250" # PORT PORT = 1900 def __init__(self): pass def getDevice(self): # getDevice s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.sendto(m_search.M_SEARCH_REQUEST, (m_search.BRODCAST_ADDRESS, m_search.PORT)) try: file = s.makefile() return self._parse(file) except: traceback.print_exc() finally: file.close() s.close() def _parse(self, file): # parse result = {} for line in file: if not line: break else: datas = line.split(":", 1) if datas[0] == "\r\n": break elif not len(datas) == 2: continue else: result[datas[0]] = datas[1].strip() return result if __name__ == "__main__": device = m_search().getDevice() for key in device.keys(): print key, " = ", device[key]
実行結果:
USN = uuid:00000000-0000-0001-0000-000d0b5b0c3c::upnp:rootdevice Server = XXXX/XXX Release 0023 UPnP/1.0 UPnP-Device-Host/1.0 EXT = Location = http://192.168.1.1:80/xxx.xml Cache-Control = max-age=60 ST = upnp:rootdevice
TODO: upnp機器が複数あったらダメじゃない?