用于发现的 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 上的多播而不是单播消息吗?
提前致谢!