【问题标题】:How to implement SSDP / UPnP? Trying to use Sony's camera API如何实现 SSDP/UPnP?尝试使用索尼的相机 API
【发布时间】:2013-10-01 01:46:36
【问题描述】:

我是 HTTP 请求的初学者,但我想编写一个 Python 应用程序,使用 Sony's API 来控制其 Wi-Fi 摄像头。现在,我只是想与相机交谈,但我的获取请求一直失败。我拥有所有文档(UPnP 文档、SSDP 文档、用户手册等),但我认为我缺少一些真正基础的东西。根据索尼的文档,我需要:

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

有人知道这里可能出了什么问题吗?关于 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()

【问题讨论】:

    标签: python http httprequest upnp ssdp


    【解决方案1】:
    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

    【讨论】:

    • 这太完美了!非常感谢,我不知道为什么这个答案没有更普遍/被接受,因为我一直在寻找几个小时,而其他解决方案对于发送 M-SEARCH 和接收响应都没有那么容易理解或有用。
    • 嗯,所以 http GET 和 POST 请求方法只是作为 tcp 套接字连接的消息发送,就像这里的 M-SEARCH 方法作为 udp 消息发送一样。
    【解决方案2】:

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

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

    如果您真的打算自己做这件事,请准备好学习一点网络知识并了解 SSDP 协议(​​参见UPNP UDA part 1)。但我的建议是使用 SSDP 库或复制可用的开源代码——这样您就可以专注于实际提供新的东西(如索尼协议的实现)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多