This commit is contained in:
parent
e822a4b35c
commit
91cadbb301
20 changed files with 342 additions and 130 deletions
|
|
@ -56,7 +56,8 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
System.out.println(LogUtil.getCalingClass());
|
||||
LogUtil.setGlobalLevel(Level.FINEST);
|
||||
SSDPClient ssdp = new SSDPClient();
|
||||
ssdp.requestService("upnp:rootdevice");
|
||||
//ssdp.requestService("upnp:rootdevice");
|
||||
ssdp.requestService("zap:discover");
|
||||
ssdp.start();
|
||||
|
||||
for(int i=0; true ;++i){
|
||||
|
|
@ -73,13 +74,13 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
* @throws IOException
|
||||
*/
|
||||
public SSDPClient() throws IOException{
|
||||
super( null );
|
||||
super.setThread( this );
|
||||
super(null);
|
||||
super.setThread(this);
|
||||
|
||||
services_st = new HashMap<String, LinkedList<SSDPServiceInfo>>();
|
||||
services_usn = new HashMap<String, SSDPServiceInfo>();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Sends an request for an service
|
||||
*
|
||||
|
|
@ -94,6 +95,9 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
*
|
||||
*/
|
||||
public void requestService(String st){
|
||||
requestService(st, null);
|
||||
}
|
||||
public void requestService(String st, HashMap<String,String> headers){
|
||||
try {
|
||||
services_st.put( st, new LinkedList<SSDPServiceInfo>() );
|
||||
|
||||
|
|
@ -106,9 +110,14 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
http.setHeader("ST", st );
|
||||
http.setHeader("Man", "\"ssdp:discover\"" );
|
||||
http.setHeader("MX", "3" );
|
||||
if(headers != null) {
|
||||
for (String key : headers.keySet()) {
|
||||
http.setHeader(key, headers.get(key));
|
||||
}
|
||||
}
|
||||
http.flush();
|
||||
|
||||
logger.log(Level.FINEST, "***** REQUEST: \n"+msg);
|
||||
logger.log(Level.FINEST, "Sending Multicast: \n"+msg);
|
||||
byte[] data = msg.toString().getBytes();
|
||||
DatagramPacket packet = new DatagramPacket(
|
||||
data, data.length,
|
||||
|
|
@ -120,7 +129,14 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set a listener that will be notified when new services are detected
|
||||
*/
|
||||
public void setListener(SSDPServiceListener listener){
|
||||
this.listener = listener;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list of received services by
|
||||
* the given search target.
|
||||
|
|
@ -176,7 +192,7 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
*/
|
||||
public void receivedPacket(DatagramPacket packet, ThreadedUDPNetwork network) {
|
||||
HttpHeaderParser header = new HttpHeaderParser( new String( packet.getData() ) );
|
||||
logger.log(Level.FINEST, "Recived: \n"+header);
|
||||
logger.log(Level.FINEST, "Recived(from: "+packet.getAddress()+"): \n" + header);
|
||||
|
||||
String usn = header.getHeader("USN");
|
||||
String st = header.getHeader("ST");
|
||||
|
|
@ -199,11 +215,13 @@ public class SSDPClient extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
service.setLocation( header.getHeader("LOCATION") );
|
||||
service.setST( st );
|
||||
service.setUSN( usn );
|
||||
service.setExpirationTime(
|
||||
System.currentTimeMillis() +
|
||||
1000 * getCacheTime(header.getHeader("Cache-Control")) );
|
||||
service.setInetAddress(packet.getAddress());
|
||||
if(header.getHeader("Cache-Control") != null) {
|
||||
service.setExpirationTime(
|
||||
System.currentTimeMillis() + 1000 * getCacheTime(header.getHeader("Cache-Control")));
|
||||
}
|
||||
service.setHeaders(header.getHeaders());
|
||||
|
||||
logger.log(Level.FINEST, "Recived:\n"+service);
|
||||
if(listener != null && newService)
|
||||
listener.newService(service);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,7 @@ package zutil.net.ssdp;
|
|||
import java.io.IOException;
|
||||
import java.net.DatagramPacket;
|
||||
import java.net.InetAddress;
|
||||
import java.net.MulticastSocket;
|
||||
import java.util.HashMap;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
|
@ -80,10 +81,14 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
|
||||
public static void main(String[] args) throws IOException{
|
||||
LogUtil.setGlobalLevel(Level.FINEST);
|
||||
SSDPServer ssdp = new SSDPServer();
|
||||
StandardSSDPInfo service = new StandardSSDPInfo();
|
||||
service.setLocation("nowhere");
|
||||
service.setST("upnp:rootdevice");
|
||||
service.setST("zep:discover");
|
||||
HashMap<String, String> headers = new HashMap<String, String>();
|
||||
headers.put("Alias", "Desktop");
|
||||
headers.put("PublicKey", "SuperDesktopKey");
|
||||
service.setHeaders(headers);
|
||||
SSDPServer ssdp = new SSDPServer();
|
||||
ssdp.addService(service);
|
||||
ssdp.start();
|
||||
MultiPrintStream.out.println("SSDP Server running");
|
||||
|
|
@ -178,31 +183,36 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
String msg = new String( packet.getData() );
|
||||
|
||||
HttpHeaderParser header = new HttpHeaderParser( msg );
|
||||
logger.log(Level.FINEST, "#### Received:\n"+header);
|
||||
|
||||
// ******* Respond
|
||||
// Check that the message is an ssdp discovery message
|
||||
if( header.getRequestType() != null && header.getRequestType().equalsIgnoreCase("M-SEARCH") ){
|
||||
String man = header.getHeader("Man").replace("\"", "");
|
||||
String man = header.getHeader("Man");
|
||||
if(man != null)
|
||||
man = man.replace("\"", "");
|
||||
String st = header.getHeader("ST");
|
||||
// Check that its the correct URL and that its an ssdp:discover message
|
||||
if( header.getRequestURL().equals("*") && man.equalsIgnoreCase("ssdp:discover") ){
|
||||
if( header.getRequestURL().equals("*") && "ssdp:discover".equalsIgnoreCase(man) ){
|
||||
// Check if the requested service exists
|
||||
if( services.containsKey( st ) ){
|
||||
logger.log(Level.FINEST, "Received Multicast(from: "+packet.getAddress()+"):\n"+header);
|
||||
|
||||
// Generate the SSDP response
|
||||
StringOutputStream response = new StringOutputStream();
|
||||
HttpPrintStream http = new HttpPrintStream( response );
|
||||
http.setStatusCode(200);
|
||||
http.setHeader("Location", services.get(st).getLocation() );
|
||||
http.setHeader("USN", services.get(st).getUSN() );
|
||||
http.setHeader("Server", SERVER_INFO );
|
||||
http.setHeader("ST", st );
|
||||
http.setHeader("Location", services.get(st).getLocation() );
|
||||
http.setHeader("EXT", "" );
|
||||
http.setHeader("Cache-Control", "max-age = "+cache_time );
|
||||
http.setHeader("USN", services.get(st).getUSN() );
|
||||
if(services.get(st) instanceof SSDPCustomInfo)
|
||||
((SSDPCustomInfo)services.get(st)).setHeaders(http);
|
||||
http.flush();
|
||||
|
||||
String strData = response.toString();
|
||||
logger.log(Level.FINEST, "#### Response:\n"+strData);
|
||||
logger.log(Level.FINEST, "Response:\n"+strData);
|
||||
byte[] data = strData.getBytes();
|
||||
packet = new DatagramPacket(
|
||||
data, data.length,
|
||||
|
|
@ -269,7 +279,7 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
http.setHeader("USN", services.get(searchTarget).getUSN() );
|
||||
|
||||
http.close();
|
||||
logger.log(Level.FINEST, "#### Notification:\n"+msg);
|
||||
logger.log(Level.FINEST, "Notification:\n" + msg);
|
||||
byte[] data = msg.toString().getBytes();
|
||||
DatagramPacket packet = new DatagramPacket(
|
||||
data, data.length,
|
||||
|
|
@ -318,7 +328,7 @@ public class SSDPServer extends ThreadedUDPNetwork implements ThreadedUDPNetwork
|
|||
http.setHeader("USN", services.get(searchTarget).getUSN() );
|
||||
|
||||
http.close();
|
||||
logger.log(Level.FINEST, "******** ByeBye:\n"+msg);
|
||||
logger.log(Level.FINEST, "ByeBye:\n" + msg);
|
||||
byte[] data = msg.toString().getBytes();
|
||||
DatagramPacket packet = new DatagramPacket(
|
||||
data, data.length,
|
||||
|
|
|
|||
|
|
@ -22,6 +22,8 @@
|
|||
|
||||
package zutil.net.ssdp;
|
||||
|
||||
import zutil.net.http.HttpPrintStream;
|
||||
|
||||
/**
|
||||
* This class contains information about a service from
|
||||
* or through the SSDP protocol
|
||||
|
|
|
|||
|
|
@ -22,7 +22,11 @@
|
|||
|
||||
package zutil.net.ssdp;
|
||||
|
||||
import zutil.net.http.HttpPrintStream;
|
||||
|
||||
import java.net.InetAddress;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
|
|
@ -31,12 +35,15 @@ import java.util.UUID;
|
|||
*
|
||||
* @author Ziver
|
||||
*/
|
||||
public class StandardSSDPInfo implements SSDPServiceInfo{
|
||||
public class StandardSSDPInfo implements SSDPServiceInfo, SSDPCustomInfo{
|
||||
private String location;
|
||||
private String st;
|
||||
private String usn;
|
||||
private long expiration_time;
|
||||
|
||||
// All header parameters
|
||||
private HashMap<String, String> headers;
|
||||
private InetAddress inetAddress;
|
||||
|
||||
/**
|
||||
* @param l is the value to set the Location variable
|
||||
*/
|
||||
|
|
@ -103,11 +110,10 @@ public class StandardSSDPInfo implements SSDPServiceInfo{
|
|||
usn = genUSN();
|
||||
return usn;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generates an unique USN for the service
|
||||
*
|
||||
* @param searchTarget is the service ST name
|
||||
* @return an unique string that corresponds to the service
|
||||
*/
|
||||
private String genUSN(){
|
||||
|
|
@ -117,4 +123,30 @@ public class StandardSSDPInfo implements SSDPServiceInfo{
|
|||
public String toString(){
|
||||
return "USN: "+usn+"\nLocation: "+location+"\nST: "+st+"\nExpiration-Time: "+new Date(expiration_time);
|
||||
}
|
||||
|
||||
public void setHeaders(HashMap<String, String> headers) {
|
||||
this.headers = headers;
|
||||
}
|
||||
|
||||
public String getHeader(String header){
|
||||
return headers.get(header.toUpperCase());
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void setHeaders(HttpPrintStream http) {
|
||||
if(headers != null) {
|
||||
for (String key : headers.keySet()) {
|
||||
http.setHeader(key, headers.get(key));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public InetAddress getInetAddress(){
|
||||
return inetAddress;
|
||||
}
|
||||
|
||||
public void setInetAddress(InetAddress inetAddress) {
|
||||
this.inetAddress = inetAddress;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue