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

  • 相关阅读:
    Educational Codeforces Round 86 (Rated for Div. 2) D. Multiple Testcases
    Educational Codeforces Round 86 (Rated for Div. 2) C. Yet Another Counting Problem
    HDU
    HDU
    HDU
    HDU
    Good Bye 2019 C. Make Good (异或的使用)
    Educational Codeforces Round 78 (Rated for Div. 2) C. Berry Jam
    codeforces 909C. Python Indentation
    codeforces1054 C. Candies Distribution
  • 原文地址:https://www.cnblogs.com/attilax/p/15198776.html
Copyright © 2011-2022 走看看