2015-02-09 34 views
4

我的网络上有一台Roku设备,我希望能够以编程方式发现它。所述official Roku documentation说:如何用Java发送M-SEARCH查询

有是用于本地网络通信的标准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地址,我想实现一个函数,发现它在网络上使用此SSDP。

如何使用java发送M-SEARCH查询?我完全没有理解如何做到这一点。它是否像一个get/post请求?如果有人能指出我正确的方向,我将非常感激!

回答

4

我发现了一个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(); 
    } 
} 
+1

是不是有必要在MSEARCH字符串的末尾添加第二个\ n吗?这是我的情况。 – 2015-09-29 19:32:42

+0

@ dr.doom哦,有趣的是,它没有第二个换行符对我很好,但很高兴知道,在某些情况下,它可能需要 – 2015-09-29 22:34:54

+0

,根据http规范,请求(第5节)和响应(第6)消息使用RFC 822 [9]的通用消息格式来传送实体(消息的有效载荷)。两种类型的消息都由一个起始行,零个或多个标题字段(也称为“标题”),一个空行(即,没有任何在CRLF之前的行)指示标题字段的结尾,邮件正文。因此,空行是强制性的,如果不存在正文,则表示邮件已结束... – 2015-09-29 22:43:37