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

原文地址:https://www.cnblogs.com/attilax/p/5963551.html