/* * 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; } }
附件为文件管理开发文档