zoukankan      html  css  js  c++  java
  • Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++

    Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++

     

     

    1查找nas的原理1

    2dlna的关系1

    3ssdp的关系1

    4Cling - Java/Android UPnP library and tools3

    5框架 javaNet3

    6Cling  Code----4

    6.1. 主要流程说明。。建立UpnpService  发出查询请求4

    6.2. // Let's wait 10 seconds for them to respond4

    6.3. 通过回调监听器得到nasip地址4

    6.4. Code--5

    7参考8

     

     

    1. 查找nas的原理

    准备使用smb协议,但是使用unc好像太慢,直接使用smb ip都返回true

    或许使用ip/path的方式是可以的。。

    而且也没办法区分naspc

    只好使用upnp ssdp协议来发现nas了。。

     

    2.  与dlna的关系



    dlna是一套标准,是由微软,因特尔,索尼等大厂商组成的联盟,他们制定了一套标准让大家去用。其实dlna基本没做什么事,里面用到的协议都是现成的,而upnp是dlna进行设备控制的一个最基本的协议。如果要有dlna做了什么的话,那么就是把upnp这套协议的内容用在了数字家庭领域。使它得到了极大的发展

     

    作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙,  EMAIL:1466519819@qq.com

    转载请注明来源: http://blog.csdn.net/attilax

     

    3. 与ssdp的关系

    简单服务发现协议(SSDPSimple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。

     

    SSDP:Simple Sever Discovery Protocol,简单服务发现协议,此协议为网络客户提供一种无需任何配置、管理和维护网络设备服务的机制。此协议采用基于通知和发现路由的多播发现方式实现。协议客户端在保留的多播地址:239.255.255.250:1900(IPV4)发现服务,

     

    SSDP 协议消息

    1、设备查询消息

    当一个控制点加入到网络中时,设备发现过程允许控制点寻找网络上感兴趣的设备。发现消息包括设备的一些特定信息或者某项服务的信息,例如它的类型、标识符、和指向XML设备描述文档的指针。从设备获得响应从本质上说,内容与多址传送的设备广播相同,只是采用单址传送方式。设备查询通过HTTP协议扩展M-SEARCH方法实现的。典型的设备查询请求消息格式:

    M-SEARCH * HTTP/1.1

    HOST: 239.255.255.250:1900

    MAN: "ssdp:discover"

    MX: seconds to delay response

    ST: search target

     

     

    在设备接收到查询请求并且查询类型(ST字段值)与此设备匹配时,设备必须向多播地址239.255.255.250:1900回应响应消息。典型:

    HTTP/1.1 200 OK

    CACHE-CONTROL: max-age = seconds until advertisement expires

    DATE: when reponse was generated

    EXT:

    LOCATION: URL for UPnP description for root device

    SERVER: OS/Version UPNP/1.0 product/version

    ST: search target

    USN: advertisement UUID

     

    4. Cling - Java/Android UPnP library and tools

    3.2. Client operations with ControlPoint

    Your primary API when writing a UPnP client application is the ControlPoint. An instance is available with getControlPoint() on the UpnpService.

    public interface ControlPoint {

        public void search(UpnpHeader searchType);
        public void execute(ActionCallback callback);
        public void execute(SubscriptionCallback callback);

    }

     

     

    5. 框架 java。Net


    import java.io.IOException;

    import java.net.DatagramPacket;

    import java.net.DatagramSocket;

    import java.net.InetSocketAddress;

    import java.net.MulticastSocket;

    import java.net.NetworkInterface;

    import java.net.SocketAddress;

    import java.util.Scanner;

     

    import android.content.Context;

    import android.util.Log;

     

     

    6. Cling  Code----

     

    6.1. 主要流程说明。。建立UpnpService  发出查询请求

      final UpnpService upnpService = new UpnpServiceImpl(listener);

      upnpService.getControlPoint().search(

            new STAllHeader()

    );

    6.2. // Let's wait 10 seconds for them to respond

            System.out.println("Waiting 10 seconds before shutting down...");

            Thread.sleep(10000);

    6.3. 通过回调监听器得到nasip地址

     

      "presentationURI": "http://192.168.2.105:5000/",

     

    6.4. Code--

     

    public static void main(String[] argsthrows InterruptedException {

    // TODO Auto-generated method stub

    //UpnpServiceImpl us=new UpnpServiceImpl();

    //  for  (Device device : us.getRegistry().getDevices()) { 

    //           System.out.println(AtiJson.toJson(device));

    //        } 

      

     // UPnP discovery is asynchronous, we need a callback

            RegistryListener listener = 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 available: " + device.getDisplayString()

                    );

                    System.out.println(  AtiJson.toJson(device)  );

                }

     

                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!");

     

                }

     

     

            };

     

            // This will create necessary network resources for UPnP right away

            System.out.println("Starting Cling...");

         //   UpnpService upnpService = new UpnpServiceImpl(listener);

            

            

      final UpnpService upnpService = new UpnpServiceImpl(listener);

      upnpService.getControlPoint().search(

            new STAllHeader()

    );

    // Let's wait 10 seconds for them to respond

            System.out.println("Waiting 10 seconds before shutting down...");

            Thread.sleep(10000);

      

            

            //----------------------

    //  Registry registry = upnpService.getRegistry();

    //Collection<Device> foundDevice = registry.getDevices();

    //  for (Device device : foundDevice) {

    //System.out.println(AtiJson.toJson(device));

    //}

      

      

      //

       // Release all resources and advertise BYEBYE to other UPnP devices

            System.out.println("Stopping Cling...");

       //     upnpService.shutdown();

      

      System.out.println("--f");

     

     

    Ret device

    Remote device available: Synology DS213+ DS213+ 5.2-5644

    {

      "identity": {

        "descriptorURL": "http://192.168.2.105:5000/ssdp/desc-DSM-eth0.xml",

        "discoveredOnLocalAddress": "192.168.2.99",

        "udn": {

          "identifierString": "73796E6F-6473-6D00-0000-0011321cb389"

        },

        "maxAgeSeconds": 1900

      },

      "version": {

        "major": 1,

        "minor": 0

      },

      "type": {

        "namespace": "schemas-upnp-org",

        "type": "Basic",

        "version": 1

      },

      "details": {

        "friendlyName": "dy (DS213+)",

        "manufacturerDetails": {

          "manufacturer": "Synology",

          "manufacturerURI": "http://www.synology.com"

        },

        "modelDetails": {

          "modelName": "DS213+",

          "modelDescription": "Synology NAS",

          "modelNumber": "DS213+ 5.2-5644",

          "modelURI": "http://www.synology.com"

        },

        "serialNumber": "0011321cb389",

        "presentationURI": "http://192.168.2.105:5000/",

        "dlnaDocs": []

      },

      "icons": []

    }

     

    7. 参考

    java - SSDP & Android, how to reply to a M-SEARCH - Stack Overflow.htm

    SSDP协议 - java学习之简单开发快乐学习 - ITeye技术网站.htm

    Cling核心手册 - zangcf的专栏 博客频道 - CSDN.NET.htm

    jcifs lib can't detect NAS - Meggie_love的专栏 博客频道 - CSDN.NET.htm

  • 相关阅读:
    设计模式
    LiggEasyWinApp-104-Ligg.EasyWinForm:Zone
    Ligg.EasyWinApp-10300-Ligg.EasyWinForm:View的配置
    LiggEasyWinApp-103-Ligg.EasyWinForm:View
    Ligg.EasyWinApp-102-Ligg.EasyWinForm:Function--ControlBox、Tray、Resize、Menu
    Ligg.EasyWinApp-101-Ligg.EasyWinForm: Application--启动,传入参数、读取Application级别配置文件、验证密码、软件封面、启动登录、StartForm
    Ligg.EasyWinApp-100-Ligg.EasyWinForm:一款Winform应用编程框架和UI库介绍
    Ligg.WinOa-000: Windows运维自动化编程实战--前言
    Ligg.EasyWinApp-000: 一款Windows应用编程框架介绍
    微服务分布式 spring cloud springboot 框架源码 activiti工作流 前后分离
  • 原文地址:https://www.cnblogs.com/attilax/p/15198776.html
Copyright © 2011-2022 走看看