SSDP M搜索发现请求非常适合多播地址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年的多播,而不是单播消息?
提前致谢!
最佳答案
msg = 'M-SEARCH * HTTP/1.1\r\nHOST:<specific ip>:1900\r\nMAN:\"ssdp:discover\"\r\nST:ssdp:all\r\n'
您最后缺少最后一个
\r\n
(用于 header 结尾的空行:没有它,接收方将继续等待更多)。
关于python-3.x - SSDP M-search不适用于单播-单个IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57724950/