【问题标题】:SSDP M-search does not work for unicast - single IPSSDP M-search 不适用于单播 - 单个 IP
【发布时间】:2019-08-30 10:22:37
【问题描述】:

SSDP M-search 发现请求适用于多播地址 239.255.255.250。但是,我需要将此请求发送到特定 IP。这是行不通的。支持UPnP architecture document单播发现消息,与组播消息略有不同

多播消息是 M-SEARCH * HTTP/1.1 HOST:239.255.255.250:1900 MAN:ssdp:discover ST:ssdp:all MX:1

单播消息类似 - 除了多播 IP 更改为特定 IP 并删除 MX:1(根据规范 - 未找到任何单播发现 m-search 的代码示例)

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:239.255.255.250:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\nMX:1\r\n\r\n'
s.sendto(msg.encode('utf-8'), ('239.255.255.250', 1900))
resp = s.recv(1024)
print (resp)

这很好用。但以下没有 - recv() 调用超时

sock_1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:<specific ip>:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\n\r\n'
sock_1.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)
sock_1.settimeout(30)
sock_1.sendto(msg.encode('utf-8'), ('<specific ip>', 1900))
resp = sock_1.recv(1024)

我尝试了更多的“setsockopt”变体,但都不起作用。 如果有任何可能的原因的线索,请分享 - 是否从设备端响应了 1900 上的多播而不是单播消息?

提前致谢!

【问题讨论】:

  • 端口可以不同:检查设备通知中是否有 SEARCHPORT.UPNP.ORG 标头字段
  • 设备对多播 M-Search 的响应中没有 SEARCHPORT 标头。这是否意味着设备正在使用默认端口 - 1900?
  • 尝试了端口 80 和 554。它没有帮助。

标签: python-3.x sockets ssdp


【解决方案1】:
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:<specific ip>:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\n'

最后你错过了最后一个\r\n(它是用于标头结尾的空行信号:没有它,接收者将继续等待更多)。

【讨论】:

  • 感谢您的回复。但是添加 \r\n 并没有帮助。
  • 在我的情况下,这与我添加 \r\n 时完全相反。
【解决方案2】:

与单播 m-search 的唯一区别是 HOST,就像你有的那样。

你在绑定套接字吗?它应该绑定到端口 0。下面是为 ssdp 设置套接字的示例:https://github.com/lbryio/aioupnp/blob/master/aioupnp/protocols/multicast.py#L64

除了 Jussi 指出的最后一个\r\n,你可能会发现你需要尝试不同的 M-SEARCH 格式排列,有些网关非常挑剔。对于某些MAN 的值必须用引号引起来,而对于另一些则不能。其他怪癖是MANMXST 的顺序以及HOST/HostMAN/Man 的大写。您可能还需要尝试各种搜索目标。

【讨论】:

  • 创建“客户端”套接字是否需要套接字绑定?我相信绑定是用于服务器端的。多播发现在没有绑定的情况下工作正常。
  • 尝试了一些删除引号的组合,并使用小写 MAN/ST/HOST。它没有帮助。我们可以通过任何方式了解特定设备的细节吗?
猜你喜欢
  • 1970-01-01
  • 2015-05-06
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 2012-05-07
相关资源
最近更新 更多