`

upnp 使用cling编写service

    博客分类:
  • upnp
 
阅读更多
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库的DLNA开发

    cling库是基于UPnP(Universal Plug and Play)协议的DLNA(Digital Living Network Alliance)开发库。通过使用cling库,可以轻松地实现DLNA设备的开发和集成。下面是cling库的DLNA开发详解: cling库简介 cling...

    UPnP的java源代码

    使用Cling的源代码,开发者可以获得深入理解UPnP协议工作原理的机会,这对于自定义实现或者调试现有UPnP解决方案非常有帮助。同时,源代码也允许开发者根据特定需求进行定制和扩展,例如优化性能、增加新的功能,...

    基于cling upnp发现

    1. **设备发现**:Cling支持SSDP(Simple Service Discovery Protocol)协议,用于在网络中广播和接收设备的存在信息。 2. **服务解析**:Cling可以解析UPnP设备提供的XML描述文件,获取服务信息和接口。 3. **事件...

    Cling 2.0 本地视频、音频、图片投屏DEMO

    通过分析和学习这个【Cling 2.0 本地视频、音频、图片投屏DEMO】,开发者不仅可以掌握Cling库的使用,还能深入了解DLNA标准以及跨设备多媒体共享的实现原理。这对于开发智能家居应用或多媒体播放解决方案的工程师来...

    AndroidSimpleUpnp:使用 Cling 的简化 Android Upnp 库

    Android Upnp 库 查看示例项目以获取快速入门。 如何使用? 包括位于项目“out”目录中的 jar 文件。 编辑您的清单以提供适当的权限和服务描述(参见示例) 然后,您可以对 AndroidUpnpProvider 对象执行方法调用...

    upnp for android

    Cling库是这个场景下的关键组件,因为它为开发者提供了易于使用的API来处理复杂的UPnP协议细节。 Cling库的核心特性包括: 1. **设备发现**:Cling支持扫描网络上的UPnP设备,发现它们的类型、制造商信息和可用的...

    upnp开源代码

    然后,通过学习和理解Cling的API文档,可以开始编写代码来创建和控制UPnP设备。压缩包中的"cling"文件可能包含了Cling项目的源码、示例、文档等资源,这将帮助开发者深入理解并实践UPnP协议的实现。 总的来说,UPNP...

    cling-core-2.1.2.jar和cling-support-2.1.2.jar

    它们是Cling框架的重要组成部分,Cling是一个开放源码的实现,主要用于UPnP(通用即插即用)设备控制点的开发。UPnP是一种网络协议,它允许设备在本地网络中自动发现并互相通信,实现家庭自动化、媒体共享和设备控制...

    cling-core-2.0.1及三个依赖包,用于Java对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

    android版 upnp 端口映射程序

    将upnp复制到手机根目录的/system/bin 运行方式: 第一种:将手机连到电脑 运行 adb shell 输入upnp 就可以看到帮助文档了 第二种:下载安卓虚拟终端,直接运行upnp 第三种:通过java代码调用(开发android程序...

    upnp Android开发

    在Android上使用Cling进行UPnP开发,首先需要了解以下几个关键概念: 1. **设备**:在UPnP中,设备是网络中的实体,可以是硬件设备或软件服务,如智能电视、打印机或媒体服务器。每个设备都有一个唯一的UUID标识,...

    cling-support-2.1.1.jar和cling-core-2.1.1.jar

    这可能包括对特定UPnP服务的支持、更高级的媒体处理能力、用户界面组件或其他辅助类,使得开发者能够更容易地集成和使用cling库来实现电视投屏功能。 标签中的"jar"指的是Java Archive,是Java平台的标准打包格式,...

    cling-master.zip

    在cling项目中,开发者可以使用`UpnpService`类来创建和管理UPnP设备和服务。`DeviceHost`是Cling用于发布本地设备的接口,而`ControlPoint`则用于查找和控制网络上的其他设备。例如,通过`ControlPoint`,你可以...

    android应用发布upnp服务

    通过以上步骤,你就可以使用Cling库在Android应用中实现UPnP服务。实际开发中,可能还需要处理网络连接问题、设备兼容性以及性能优化等问题。不断调试和测试,以确保服务的稳定性和可靠性。在开发过程中,查阅Cling...

    cling source

    1. **设备发现**:Cling库提供了扫描和发现网络上DLNA设备的能力,这通常通过SSDP(Simple Service Discovery Protocol)和UPnP Device Advertising and Discovery协议实现。 2. **服务浏览**:找到设备后,Cling...

    cling-dlna

    2. **Java API**:项目完全用Java编写,使得它能够在任何Java运行环境中使用,包括桌面应用、Android应用以及服务器端应用。 3. **媒体内容处理**:cling-dlna 能够解析和处理多种多媒体格式,包括音频、视频和图像...

    安卓UPNP demo

    在这个项目中,开发人员使用了第三方库——Cling,一个强大的Java UPnP框架,来简化UPnP编程过程。 首先,让我们深入了解UPnP技术。UPnP是一种开放的标准,它定义了一种设备自我发现、网络服务注册和通信的方法。在...

    droid upnp

    android upnp client and server use cling 2.0

    wireme-cling实现

    【Cling库】:Cling是用Java编写的开源DLNA/UPnP(Universal Plug and Play)框架,它提供了全面的API,用于创建和控制UPnP设备和服务。Cling库为开发者提供了便捷的工具,以便在各种平台上实现UPnP功能,包括DMR。 ...

    cling源码的demo程序

    6. **异常处理**:cling如何处理运行时错误和异常,以及如何编写健壮的交互式代码。 为了深入理解这个demo,你需要阅读和运行"BrowserActivity"的源代码,观察其执行流程,理解其中的cling语法和用法。同时,查阅...

Global site tag (gtag.js) - Google Analytics