Java UPnP ContentDirectory浏览返回null
我一直在玩UPnP,以了解它是如何工作的,在我尝试使用任何API之前,或者做任何更重要的事情之前。我一直在阅读UPnP文档,并使用这些信息格式化我发送的消息。我现在只是从命令行开始工作,并且已经获得了可以正常工作的发现消息。现在,我尝试从ContentDirectory Browse()请求返回内容(我还尝试了TransportAV GetMediaInfo(),因为它只需要一个参数)。然而,无论我尝试什么,我都会从MediaServer得到一个空响应Java UPnP ContentDirectory浏览返回null,java,upnp,Java,Upnp,我一直在玩UPnP,以了解它是如何工作的,在我尝试使用任何API之前,或者做任何更重要的事情之前。我一直在阅读UPnP文档,并使用这些信息格式化我发送的消息。我现在只是从命令行开始工作,并且已经获得了可以正常工作的发现消息。现在,我尝试从ContentDirectory Browse()请求返回内容(我还尝试了TransportAV GetMediaInfo(),因为它只需要一个参数)。然而,无论我尝试什么,我都会从MediaServer得到一个空响应 public class SOAPSock
public class SOAPSocket2 {
public static void main(String[] args) {
try {
String xmldata = "<?xml version=\"1.0\"?>" +
"<s:Envelope " +
"xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/ \"" +
"s:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" +
"<s:Body>" +
"<u:GetMediaInfo xmlns:u=\"urn:schemas-upnp-org:service:AVTransport:1\">" +
"<InstanceID>0</InstanceID>" +
"</u:GetMediaInfo>" +
"</s:Body>" +
"</s:Envelope>";
//Create socket
String hostname = args[0];
int port = Integer.parseInt(args[1]);
Socket sock = new Socket(hostname, port);
//Send header
String path = args[2];
BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream(),"UTF-8"));
// You can use "UTF8" for compatibility with the Microsoft virtual machine.
wr.write("POST " + path + " HTTP/1.1\r\n");
wr.write("HOST: " + hostname + ":" + port +"\r\n");
wr.write("CONTENT-TYPE: text/xml; charset=\"utf-8\"\r\n");
wr.write("SOAPACTION: \"urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo\"");
wr.write("\r\n");
//Send data
wr.write(xmldata);
wr.flush();
// Response
BufferedReader rd = new BufferedReader(new InputStreamReader(sock.getInputStream()));
String line;
line = rd.readLine();
System.out.println(line);
while((line = rd.readLine()) != null)
System.out.println(line);
} catch (Exception e) {
e.printStackTrace();
}
}
}
公共类SOAPSocket2{
公共静态void main(字符串[]args){
试一试{
字符串xmldata=”“+
"" +
"" +
"" +
"0" +
"" +
"" +
"";
//创建套接字
字符串hostname=args[0];
int port=Integer.parseInt(args[1]);
Socket sock=新套接字(主机名、端口);
//发送头
字符串路径=args[2];
BufferedWriter wr=新的BufferedWriter(新的OutputStreamWriter(sock.getOutputStream(),“UTF-8”);
//您可以使用“UTF8”与Microsoft虚拟机兼容。
write(“POST”+path+“HTTP/1.1\r\n”);
write(“主机:“+hostname+”:“+port+”\r\n”);
write(“内容类型:text/xml;字符集=\“utf-8\”\r\n”);
write(“SOAPACTION:\”urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo\”);
wr.write(“\r\n”);
//发送数据
wr.write(xmldata);
wr.flush();
//回应
BufferedReader rd=新的BufferedReader(新的InputStreamReader(sock.getInputStream());
弦线;
line=rd.readLine();
系统输出打印项次(行);
而((line=rd.readLine())!=null)
系统输出打印项次(行);
}捕获(例外e){
e、 printStackTrace();
}
}
}
我知道这不是最合适的代码,但我从这里借用了它:。我想,如果我真的能在响应中获得某种数据,那么我就可以正确地构建它。我对其进行了修改,以便从命令行传递媒体服务器的IP地址和端口,以及控制URL的路径。但是,我从媒体服务器上得到的只是“null”。有没有想过我做错了什么?谢谢
我从MediaServer收到一个空响应
这是来自MediaServer的响应吗?我想这只是BufferedReader告诉你没有什么可以回报的
这里有两件事可以调试(发送和接收),但是相同的工具应该对这两件事都有帮助。使用wireshark或其他网络流量捕获工具查看通过网络的实际数据。Wireshark将告诉您是否发送了响应(但您未能正确接收),或者是否从未收到响应(暗示您的消息不正确)。它也会显示你的信息,因为它是在电线上,使它更容易注意到错误
执行上述操作(如果您无法理解,请将消息粘贴到此处)是继续调试的最佳方式,但我已经看到代码中存在一些问题:
- SOAPACTION行结尾缺少“\r\n”
- 没有内容长度标题(正常情况下需要)
这些甚至都不是UPnP问题,实际上,消息不是正确的HTTP。尽管如此,本文档仍将有助于解决此类问题。谢谢您的意见。我确实注意到\r\n丢失了,自启动此项目以来,我一直在查看设备体系结构。我也广泛使用Wireshark,但在这里发布之前找不到问题的根源。然而,我最终得到了第二台设备,可以用作控制点,并监控它们之间的流量。我注意到包含SOAP的数据包被标识为HTTP,但我的数据包没有。从BufferedWriter更改为PrintWriter最终解决了这个问题。再次感谢您的反馈。还有内容长度行。我忽略了这一点