【发布时间】: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