/*
* Copyright (C) 2010 Teleal GmbH, Switzerland
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.teleal.cling;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.teleal.cling.controlpoint.ActionCallback;
import org.teleal.cling.model.action.ActionArgumentValue;
import org.teleal.cling.model.action.ActionInvocation;
import org.teleal.cling.model.message.header.STAllHeader;
import org.teleal.cling.model.meta.Action;
import org.teleal.cling.model.meta.LocalDevice;
import org.teleal.cling.model.meta.RemoteDevice;
import org.teleal.cling.model.meta.Service;
import org.teleal.cling.model.types.UDAServiceId;
import org.teleal.cling.registry.Registry;
import org.teleal.cling.registry.RegistryListener;
/**
* Runs a simple UPnP discovery procedure.
* <p>
* Call this class from the command-line to quickly evaluate Cling, it will
* search for all UPnP devices on your LAN and print out any discovered, added,
* and removed devices while it is running.
* </p>
*
* @author Christian Bauer
*/
public class MyMain {
public static void main(String[] args) throws Exception {
System.out.println("Starting Cling...");
UpnpService upnpService = new UpnpServiceImpl(
new RegistryListener() {
public void remoteDeviceDiscoveryStarted(Registry registry, RemoteDevice device) {
System.out.println("Discovery started: " + device.getDisplayString());
}
public void remoteDeviceDiscoveryFailed(Registry registry, RemoteDevice device, Exception ex) {
System.out.println("Discovery failed: " + device.getDisplayString() + " => " + ex);
}
public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
System.out.println("Remote device added: " + device.getDisplayString());
}
public void remoteDeviceUpdated(Registry registry, RemoteDevice device) {
System.out.println("Remote device updated: " + device.getDisplayString());
}
public void remoteDeviceRemoved(Registry registry, RemoteDevice device) {
System.out.println("Remote device removed: " + device.getDisplayString());
}
public void localDeviceAdded(Registry registry, LocalDevice device) {
System.out.println("Local device added: " + device.getDisplayString());
}
public void localDeviceRemoved(Registry registry, LocalDevice device) {
System.out.println("Local device removed: " + device.getDisplayString());
}
public void beforeShutdown(Registry registry) {
System.out.println("Before shutdown, the registry has devices: " + registry.getDevices().size());
}
public void afterShutdown() {
System.out.println("Shutdown of registry complete!");
}
}
);
upnpService.getControlPoint().search(new STAllHeader()); // Search for all devices and services
Thread.sleep(10000); //暂停5秒 查找设备
Collection<RemoteDevice> dss = upnpService.getRegistry().getRemoteDevices();
MyMain mian = new MyMain();
for(RemoteDevice device:dss){
Map<String,Object> inputs = new HashMap<String,Object>();
inputs.put("ObjectID","200/516/517");
inputs.put("BrowseFlag","BrowseDirectChildren");
inputs.put("Filter","*");
inputs.put("StartingIndex","0");
inputs.put("RequestedCount","0");
inputs.put("SortCriteria","");
Map outputs = new HashMap();
outputs = mian.action(upnpService, device, "ContentDirectory", "Browse", inputs);
Set<String> keys = outputs.keySet();
for(String key:keys){
System.out.println("key:"+key+" values:"+outputs.get(key));
}
/*Service service = device.findService(new UDAServiceId("ContentDirectory"));
Action getStatusAction = service.getAction("Browse");
ActionInvocation getStatusInvocation = new ActionInvocation(getStatusAction);*/
/* //取第一个目录数据
getStatusInvocation.setInput("ObjectID", "200/516");
getStatusInvocation.setInput("BrowseFlag", "BrowseDirectChildren");
getStatusInvocation.setInput("Filter", "*");
getStatusInvocation.setInput("StartingIndex", "0");
getStatusInvocation.setInput("RequestedCount", "0");
getStatusInvocation.setInput("SortCriteria", "+dc:creator"); //按照 创建时间排序
*/ /* //取根目录数据
getStatusInvocation.setInput("ObjectID", "0");
getStatusInvocation.setInput("BrowseFlag", "BrowseDirectChildren");
getStatusInvocation.setInput("Filter", "*");
getStatusInvocation.setInput("StartingIndex", "0");
getStatusInvocation.setInput("RequestedCount", "3");
getStatusInvocation.setInput("SortCriteria", "");*/
//根目录元数据
/*getStatusInvocation.setInput("ObjectID", "0");
//getStatusInvocation.setInput("BrowseFlag", "BrowseDirectChildren");
getStatusInvocation.setInput("BrowseFlag", "BrowseMetadata");
getStatusInvocation.setInput("Filter", "*");
getStatusInvocation.setInput("StartingIndex", "0");
getStatusInvocation.setInput("RequestedCount", "0");
getStatusInvocation.setInput("SortCriteria", "");*/
//同步action 但是也没有发现怎么同步了 ,之前需要sleep
/*new ActionCallback.Default(getStatusInvocation, upnpService.getControlPoint()).run();
Map map = getStatusInvocation.getOutputMap();
ActionArgumentValue ss = getStatusInvocation.getOutput("Result");
System.out.println(ss.getValue());*/
//异步action
/* Service service = device.findService(new UDAServiceId("ContentDirectory"));
Action getStatusAction = service.getAction("GetSearchCapabilities");
ActionInvocation getStatusInvocation = new ActionInvocation(getStatusAction);
//getStatusInvocation.setInput("SourceURI", "");
//getStatusInvocation.setInput("DestinationURI", "");
ActionCallback getStatusCallback = new ActionCallback(getStatusInvocation) {
public void success(ActionInvocation invocation) {
ActionArgumentValue status = invocation.getOutput("SearchCaps");
System.out.println(status.getValue());
//assertEquals((Boolean) status.getValue(), Boolean.valueOf(false));
}
@Override
public void failure(ActionInvocation invocation, UpnpResponse res) {
System.err.println(
createDefaultFailureMessage(invocation, res)
);
}
@Override
public void failure(ActionInvocation invocation,
UpnpResponse operation, String defaultMsg) {
System.err.println(
createDefaultFailureMessage(invocation, operation)
);
}
};
upnpService.getControlPoint().execute(getStatusCallback);*/
}
System.out.println("Stopping Cling...");
upnpService.shutdown();
}
public Map action(UpnpService upnpService, RemoteDevice device, String serviceId, String actionId, Map inputs){
Map retMap = null;
Service service = device.findService(new UDAServiceId(serviceId));
Action getStatusAction = service.getAction(actionId);
ActionInvocation getStatusInvocation = new ActionInvocation(getStatusAction);
Set<String> keys = inputs.keySet();
for(String key:keys){
getStatusInvocation.setInput(key, inputs.get(key));
}
new ActionCallback.Default(getStatusInvocation, upnpService.getControlPoint()).run();
retMap = getStatusInvocation.getOutputMap();
System.out.println(retMap.size());
return retMap;
}
}
附件为文件管理开发文档