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機器が複数あったらダメじゃない?