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



我是HTTP请求的初学者,但我想编写一个使用索尼API来控制其Wi-Fi摄像头的Python应用程序。目前,我只是想与相机交谈,但我的 get 请求一直失败。我有所有的文档(UPnP 文档、SSDP 文档、用户手册等),但我认为我错过了一些真正基本的东西。根据索尼的文档,我需要:

  1. 将相机作为接入点连接(即像任何其他Wi-Fi路由器一样登录)
  2. 向某个 URL 和端口发送请求

有谁知道这里可能出了什么问题?关于开始使用UPnP/SSDP的任何好资源?我从这里获得了DISCOVERY_MSG字符串的格式。

#!/usr/bin/python
def main():
    import requests
    DISCOVERY_MSG = ('M-SEARCH * HTTP/1.1rn' +
                 'HOST: 239.255.255.250:1900rn' +
                 'MAN: "ssdp:discover"rn' +
                 'MX: 3rn' +
                 'ST: urn:schemas-sony-com:service:ScalarWebAPI:1rn' +
                 '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.1rnrn')
    try:
        r = requests.get(DISCOVERY_MSG)
    except:
        print('Didn't work')

if __name__ == '__main__':
  main()
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.1rn" + 
                "HOST: %s:%drn" % (SSDP_ADDR, SSDP_PORT) + 
                "MAN: "ssdp:discover"rn" + 
                "MX: %drn" % (SSDP_MX, ) + 
                "ST: %srn" % (SSDP_ST, ) + "rn";
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

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

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

如果您真的打算自己执行此操作,请准备好学习一些网络并了解 SSDP 协议(有关此内容,请参阅 UPNP UDA 第 1 部分)。但我的建议是使用SSDP库或复制有效的开源代码 - 这样你就可以专注于实际提供新的东西(比如索尼协议的实现)。

相关内容

  • 没有找到相关文章

最新更新