我的网络上有一个Roku设备,我希望能够以编程方式发现它。 official Roku documentation说:
有一个标准的SSDP组播地址和端口
(239.255.255.250:1900)用于本地网络通信。
Roku在此IP地址和端口上响应M-SEARCH查询。
为了查询roku ip地址,您的程序可以发送
以下请求使用http协议访问239.255.255.250端口
1900年:
他们提供了一个使用netcat的示例,并说可以使用Wireshark查找结果。他们还说:
外部控制协议使Roku可以通过以下方式进行控制
网络。可通过SSDP发现外部控制服务
(简单服务发现协议)。该服务是一个简单的RESTful
几乎任何编程中的程序都可以访问的API
环境。
我有一个Java程序,可以通过给定Roku的IP地址来控制我的Roku,并且我想实现一个使用此SSDP在网络上发现它的功能。
如何使用Java发送M-SEARCH查询?我完全不知道如何执行此操作。就像获取/发布请求一样吗?如果有人能指出正确的方向,我将不胜感激!
最佳答案
我找到了一个Java解决方案:
/* multicast SSDP M-SEARCH example for
* finding the IP Address of a Roku
* device. For more info go to:
* http://sdkdocs.roku.com/display/sdkdoc/External+Control+Guide
*/
import java.io.*;
import java.net.*;
class msearchSSDPRequest {
public static void main(String args[]) throws Exception {
/* create byte arrays to hold our send and response data */
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
/* our M-SEARCH data as a byte array */
String MSEARCH = "M-SEARCH * HTTP/1.1\nHost: 239.255.255.250:1900\nMan: \"ssdp:discover\"\nST: roku:ecp\n";
sendData = MSEARCH.getBytes();
/* create a packet from our data destined for 239.255.255.250:1900 */
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, InetAddress.getByName("239.255.255.250"), 1900);
/* send packet to the socket we're creating */
DatagramSocket clientSocket = new DatagramSocket();
clientSocket.send(sendPacket);
/* recieve response and store in our receivePacket */
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
/* get the response as a string */
String response = new String(receivePacket.getData());
/* print the response */
System.out.println(response);
/* close the socket */
clientSocket.close();
}
}