1

用于发现的 SSDP M-search 请求非常适用于多播地址 239.255.255.250。但是,我需要将此请求发送到特定 IP。这没用。根据UPnP 架构文档,支持单播发现消息,与多播消息略有不同

多播消息是 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 上的多播而不是单播消息吗?

提前致谢!

4

2 回答 2

0

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

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

除了\r\nJussi 指出的 final,您可能会发现您需要尝试 M-SEARCH 格式的不同排列,有些网关非常挑剔。对于某些值,MAN必须用引号引起来,而对于另一些则不能。额外的怪癖是 , 的顺序MANMX/和/的ST大写。您可能还需要尝试各种搜索目标。HOSTHostMANMan

于 2019-08-30T18:18:06.193 回答
0
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:<specific ip>:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\n'

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

于 2019-08-30T17:50:19.593 回答