如何实施SSDP / UPnP?试图使用索尼的相机API

时间:2013-10-01 01:46:37

标签: python http httprequest upnp ssdp

我是HTTP请求的初学者,但我想编写一个使用Sony's API来控制其Wi-Fi摄像头的Python应用程序。就目前而言,我只是想和相机交谈,但我的请求仍然失败。我有所有的文档(UPnP文档,SSDP文档,用户手册等),但我想我错过了一些非常基本的东西。根据索尼的文档,我需要:

  1. 作为接入点连接到相机(即,像任何其他Wi-Fi路由器一样登录)
  2. 向某个网址和端口发送请求
  3. 有没有人知道这里可能出现什么问题?有关UPnP / SSDP入门的任何好资源?我从here获得了DISCOVERY_MSG字符串的格式。

    #!/usr/bin/python
    
    def main():
        import requests
    
        DISCOVERY_MSG = ('M-SEARCH * HTTP/1.1\r\n' +
                     'HOST: 239.255.255.250:1900\r\n' +
                     'MAN: "ssdp:discover"\r\n' +
                     'MX: 3\r\n' +
                     'ST: urn:schemas-sony-com:service:ScalarWebAPI:1\r\n' +
                     'USER-AGENT: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_5) AppleWebKit/536.30.1 (KHTML, like Gecko) Version/6.0.5 Safari/536.30.1\r\n\r\n')
    
        try:
            r = requests.get(DISCOVERY_MSG)
        except:
            print('Didn\'t work')
    
    
    if __name__ == '__main__':
      main()
    

2 个答案:

答案 0 :(得分:13)

import sys
import socket

SSDP_ADDR = "239.255.255.250";
SSDP_PORT = 1900;
SSDP_MX = 1;
SSDP_ST = "urn:schemas-sony-com:service:ScalarWebAPI: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";

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.sendto(ssdpRequest, (SSDP_ADDR, SSDP_PORT))
print sock.recv(1000)

https://github.com/crquan/work-on-sony-apis/blob/master/search-nex.py

答案 1 :(得分:3)

我认为这与UPnP几乎没有关系:索尼恰好使用SSDP进行发现,而事实上的SSDP规范恰好出现在UPnP架构文档中。

至于问题:requests.get()执行普通的HTTP GET(或者如果你提供了正确的参数),当你应该发送UDP多播消息并处理响应时。

如果您真的打算自己这样做,请准备好学习一些网络并理解SSDP协议(请参阅UPNP UDA part 1)。但我的建议是使用SSDP库或复制工作的开源代码 - 这样你就可以专注于实际提供新东西(比如sony协议的实现)。