【发布时间】:2019-05-19 16:18:51
【问题描述】:
回复:https://developer.sony.com/develop/audio-control-api/hardware-overview/discovery-process
你好。我有一个亚太地区索尼 STR-DN1080 AVR。我可以通过 API 控制所说的 AVR。我只是找不到使用 SSDP 支持的 Sony 设备。
AVR 似乎定期通过 UDP 向网络宣传自己,但它没有使用文档中描述的格式响应任何多播请求。
当我用ST: upnp:rootdevice 或ST: ssdp:all 替换“ST: ....”行时,Web API 服务甚至没有回复。我网络上的其他设备会回复,但 Web API 服务不会。但是,内置的 UPnP/DLNA 服务会做出响应。
这是我的包裹:
String msg = "M-SEARCH * HTTP/1.1\r\n" +
"HOST: 239.255.255.250:1900\r\n" +
"MAN: \"ssdp:discover\"\r\n" +
"MX: 1\r\n" +
"ST: urn:schemas-sony-com:service:ScalarWebAPI:1\r\n" +
"USER-AGENT: me\r\n" +
"\r\n" ;
我有什么遗漏吗?提前致谢。
【问题讨论】:
-
从这些信息中我看不出任何明显的错误。然后我使用 Python 做同样的事情:SSDP_BROADCAST_ADDR = '239.255.255.250' 。 SSDP_BROADCAST_PORT = 1900 。 SSDP_BROADCAST_PARAMS = [ 'M-SEARCH * HTTP/1.1', "HOST: {0}:{1}".format(SSDP_BROADCAST_ADDR, SSDP_BROADCAST_PORT), 'MAN: "ssdp:discover"', 'MX: 10', 'ST : ssdp:all', '', ''] 。 SSDP_BROADCAST_MSG = '\r\n'.join(SSDP_BROADCAST_PARAMS) .
-
谢谢。您使用的是亚太地区模型吗?
-
我应该将套接字超时设置多长时间才能让 AVR 有机会回复?我已将其设置为 10 秒。
-
只是为了澄清。我的理解是有两种发送多播数据包和接收单播回复的方法:一种是通过 DatagramSocket 发送到广播地址并在同一个套接字上侦听。另一个将通过 MulticastSocket 发送,离开组,关闭套接字,然后在同一端口 (1900) 上打开 DatagramSocket 进行侦听。第一种方法适用于我从其他设备获取响应。第二,如果没有套接字绑定错误,我就无法工作。
-
我用的是第一种方法。我不是 100% 确定,但我认为 MulticastSocket 是一个 Java 类,然后扩展了具有组功能的普通 DatagramSocket,所以对我来说听起来很奇怪你应该关闭那个套接字才能打开另一个。我已经测试了欧盟和美国型号(应该与亚太地区相同),然后它会在几秒钟内响应。该设备还可以对正确的消息格式非常敏感。如果您有可能尝试使用wireshark 嗅探网络以查看包的外观,并在可能的情况下找到一个有效的实现来嗅探。