package example.binarylight;
import org.teleal.cling.binding.annotations.UpnpAction;
import org.teleal.cling.binding.annotations.UpnpInputArgument;
import org.teleal.cling.binding.annotations.UpnpOutputArgument;
import org.teleal.cling.binding.annotations.UpnpService;
import org.teleal.cling.binding.annotations.UpnpServiceId;
import org.teleal.cling.binding.annotations.UpnpServiceType;
import org.teleal.cling.binding.annotations.UpnpStateVariable;
@UpnpService(
serviceId = @UpnpServiceId("ElectricfanService"), //serviceId
serviceType = @UpnpServiceType(value = "ElectricfanService", version = 1) //SERVICE TYPE 和版本
)
public class ElectricfanService {
@UpnpStateVariable(defaultValue = "0", sendEvents = false)
private boolean target = false;
@UpnpStateVariable(defaultValue = "0")
private boolean status = false;
@UpnpAction
public void setTarget(@UpnpInputArgument(name = "NewTargetValue")
boolean newTargetValue) {
target = newTargetValue;
status = newTargetValue;
System.out.println("myService is: " + status);
}
@UpnpAction(out = @UpnpOutputArgument(name = "RetTargetValue"))
public boolean getTarget() {
return target;
}
@UpnpAction(out = @UpnpOutputArgument(name = "ResultStatus"))
public boolean getStatus() {
return status;
}
@UpnpStateVariable(defaultValue = "0", sendEvents = false)
private String aa;
@UpnpAction
public void setAa(@UpnpInputArgument(name = "rr")
String rr) {
aa = rr;
System.out.println("myService setAa is: " + rr);
}
}
1、 target和status是官方文档里面例子,暂时不明白为什么需要两个参数。
2、@UpnpStateVariable(defaultValue = "0", sendEvents = false)
private String aa;
可以直接改为:
@UpnpStateVariable
private String aa;
不知道这样有什么影响。
3、aa是自己写的变量,使用string类型,提供一个action方法,要求符合java bean规范:setAa这种写法。rr是控制点传入参数Key值,输入输出使用key value的形式。
4、控制点调用如下:
基本使用官方demo
package example.binarylight;
import java.net.URI;
import java.net.URISyntaxException;
import org.teleal.cling.UpnpService;
import org.teleal.cling.UpnpServiceImpl;
import org.teleal.cling.controlpoint.ActionCallback;
import org.teleal.cling.model.action.ActionInvocation;
import org.teleal.cling.model.message.UpnpResponse;
import org.teleal.cling.model.message.header.STAllHeader;
import org.teleal.cling.model.meta.RemoteDevice;
import org.teleal.cling.model.meta.Service;
import org.teleal.cling.model.types.InvalidValueException;
import org.teleal.cling.model.types.ServiceId;
import org.teleal.cling.model.types.UDAServiceId;
import org.teleal.cling.registry.DefaultRegistryListener;
import org.teleal.cling.registry.Registry;
import org.teleal.cling.registry.RegistryListener;
public class ElectricfanClient implements Runnable {
public static void main(String[] args) throws Exception {
// Start a user thread that runs the UPnP stack
Thread clientThread = new Thread(new ElectricfanClient());
clientThread.setDaemon(false);
clientThread.start();
}
public void run() {
try {
UpnpService upnpService = new UpnpServiceImpl();
// Add a listener for device registration events
upnpService.getRegistry().addListener(
createRegistryListener(upnpService)
);
// Broadcast a search message for all devices
upnpService.getControlPoint().search(
new STAllHeader()
);
} catch (Exception ex) {
System.err.println("Exception occured: " + ex);
System.exit(1);
}
}
// DOC: REGISTRYLISTENER
RegistryListener createRegistryListener(final UpnpService upnpService) {
return new DefaultRegistryListener() {
ServiceId serviceId = new UDAServiceId("ElectricfanService");
@Override
public void remoteDeviceAdded(Registry registry, RemoteDevice device) {
Service switchPower;
if ((switchPower = device.findService(serviceId)) != null) {
System.out.println("Service discovered: " + switchPower);
executeAction(upnpService, switchPower);
}
}
@Override
public void remoteDeviceRemoved(Registry registry, RemoteDevice device) {
Service switchPower;
if ((switchPower = device.findService(serviceId)) != null) {
System.out.println("Service disappeared: " + switchPower);
}
}
};
}
// DOC: REGISTRYLISTENER
// DOC: EXECUTEACTION
void executeAction(UpnpService upnpService, Service switchPowerService) {
ActionInvocation setTargetInvocation =
new SetTargetActionInvocation(switchPowerService);
// Executes asynchronous in the background
upnpService.getControlPoint().execute(
new ActionCallback(setTargetInvocation) {
@Override
public void success(ActionInvocation invocation) {
assert invocation.getOutput().length == 0;
System.out.println("Successfully called action!");
}
@Override
public void failure(ActionInvocation invocation,
UpnpResponse operation,
String defaultMsg) {
System.err.println(defaultMsg);
}
}
);
}
// class SetTargetActionInvocation extends ActionInvocation {
//
// SetTargetActionInvocation(Service service) {
// super(service.getAction("SetTarget"));
// try {
//
// // Throws InvalidValueException if the value is of wrong type
// setInput("NewTargetValue", true);
//
// } catch (InvalidValueException ex) {
// System.err.println(ex.getMessage());
// System.exit(1);
// }
// }
// }
class SetTargetActionInvocation extends ActionInvocation {
SetTargetActionInvocation(Service service) {
super(service.getAction("SetAa"));
try {
// Throws InvalidValueException if the value is of wrong type
setInput("rr", "1234");
} catch (InvalidValueException ex) {
System.err.println(ex.getMessage());
System.exit(1);
}
}
}
// DOC: EXECUTEACTION
}
主要区别在于:
1、 ServiceId serviceId = new UDAServiceId("ElectricfanService");
定义为自己需要的service
2、 super(service.getAction("SetAa"));
调用自己定义的action
3、传入自己的key value
setInput("rr", "1234");
以上基本实现控制点控制设备的服务功能。
按照理解,UPnP-av-ContentDirectory-v1-Service应该也是通过这种方式的,无非自己定义通讯的key value,加上设备需要启动一个web容器,然后提供对外资源暴露的功能。
以控制电风扇例子为例,简单家电需要提供的服务如下:
1、开关功能。 (电风扇开关)
2、功能列表查询功能。 (档位控制,定时控制)
3、具体功能控制
a、档位增减
b、定时多少
一般设备功能:
1、开关
2、控制量的增减
3、定时
难点:
1、设备要求支持网络模块(upnp协议)以及服务的实现
2、控制点可以为电脑,智能手机。
分享到:
相关推荐
cling库是基于UPnP(Universal Plug and Play)协议的DLNA(Digital Living Network Alliance)开发库。通过使用cling库,可以轻松地实现DLNA设备的开发和集成。下面是cling库的DLNA开发详解: cling库简介 cling...
使用Cling的源代码,开发者可以获得深入理解UPnP协议工作原理的机会,这对于自定义实现或者调试现有UPnP解决方案非常有帮助。同时,源代码也允许开发者根据特定需求进行定制和扩展,例如优化性能、增加新的功能,...
1. **设备发现**:Cling支持SSDP(Simple Service Discovery Protocol)协议,用于在网络中广播和接收设备的存在信息。 2. **服务解析**:Cling可以解析UPnP设备提供的XML描述文件,获取服务信息和接口。 3. **事件...
通过分析和学习这个【Cling 2.0 本地视频、音频、图片投屏DEMO】,开发者不仅可以掌握Cling库的使用,还能深入了解DLNA标准以及跨设备多媒体共享的实现原理。这对于开发智能家居应用或多媒体播放解决方案的工程师来...
Android Upnp 库 查看示例项目以获取快速入门。 如何使用? 包括位于项目“out”目录中的 jar 文件。 编辑您的清单以提供适当的权限和服务描述(参见示例) 然后,您可以对 AndroidUpnpProvider 对象执行方法调用...
Cling库是这个场景下的关键组件,因为它为开发者提供了易于使用的API来处理复杂的UPnP协议细节。 Cling库的核心特性包括: 1. **设备发现**:Cling支持扫描网络上的UPnP设备,发现它们的类型、制造商信息和可用的...
然后,通过学习和理解Cling的API文档,可以开始编写代码来创建和控制UPnP设备。压缩包中的"cling"文件可能包含了Cling项目的源码、示例、文档等资源,这将帮助开发者深入理解并实践UPnP协议的实现。 总的来说,UPNP...
它们是Cling框架的重要组成部分,Cling是一个开放源码的实现,主要用于UPnP(通用即插即用)设备控制点的开发。UPnP是一种网络协议,它允许设备在本地网络中自动发现并互相通信,实现家庭自动化、媒体共享和设备控制...
cling-core-2.0.1及三个依赖包,用于Java对UPnP操作的实现 cling-core-2.0.1.jar seamless-http-1.1.1.jar seamless-util-1.1.1.jar seamless-xml-1.1.1.jar
将upnp复制到手机根目录的/system/bin 运行方式: 第一种:将手机连到电脑 运行 adb shell 输入upnp 就可以看到帮助文档了 第二种:下载安卓虚拟终端,直接运行upnp 第三种:通过java代码调用(开发android程序...
在Android上使用Cling进行UPnP开发,首先需要了解以下几个关键概念: 1. **设备**:在UPnP中,设备是网络中的实体,可以是硬件设备或软件服务,如智能电视、打印机或媒体服务器。每个设备都有一个唯一的UUID标识,...
这可能包括对特定UPnP服务的支持、更高级的媒体处理能力、用户界面组件或其他辅助类,使得开发者能够更容易地集成和使用cling库来实现电视投屏功能。 标签中的"jar"指的是Java Archive,是Java平台的标准打包格式,...
在cling项目中,开发者可以使用`UpnpService`类来创建和管理UPnP设备和服务。`DeviceHost`是Cling用于发布本地设备的接口,而`ControlPoint`则用于查找和控制网络上的其他设备。例如,通过`ControlPoint`,你可以...
通过以上步骤,你就可以使用Cling库在Android应用中实现UPnP服务。实际开发中,可能还需要处理网络连接问题、设备兼容性以及性能优化等问题。不断调试和测试,以确保服务的稳定性和可靠性。在开发过程中,查阅Cling...
1. **设备发现**:Cling库提供了扫描和发现网络上DLNA设备的能力,这通常通过SSDP(Simple Service Discovery Protocol)和UPnP Device Advertising and Discovery协议实现。 2. **服务浏览**:找到设备后,Cling...
2. **Java API**:项目完全用Java编写,使得它能够在任何Java运行环境中使用,包括桌面应用、Android应用以及服务器端应用。 3. **媒体内容处理**:cling-dlna 能够解析和处理多种多媒体格式,包括音频、视频和图像...
在这个项目中,开发人员使用了第三方库——Cling,一个强大的Java UPnP框架,来简化UPnP编程过程。 首先,让我们深入了解UPnP技术。UPnP是一种开放的标准,它定义了一种设备自我发现、网络服务注册和通信的方法。在...
android upnp client and server use cling 2.0
【Cling库】:Cling是用Java编写的开源DLNA/UPnP(Universal Plug and Play)框架,它提供了全面的API,用于创建和控制UPnP设备和服务。Cling库为开发者提供了便捷的工具,以便在各种平台上实现UPnP功能,包括DMR。 ...
6. **异常处理**:cling如何处理运行时错误和异常,以及如何编写健壮的交互式代码。 为了深入理解这个demo,你需要阅读和运行"BrowserActivity"的源代码,观察其执行流程,理解其中的cling语法和用法。同时,查阅...