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

1. 查找nas的原理1

2. 与dlna的关系1

3. 与ssdp的关系1

4. Cling - Java/Android UPnP library and tools3

5. 框架 java。Net3

6. Cling  Code----4

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

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

6.3. 通过回调监听器得到nas的ip地址4

6.4. Code--5

7. 参考8

1. 查找nas的原理

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

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

而且也没办法区分nas和pc

只好使用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的关系

简单服务发现协议(SSDP,Simple 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. 通过回调监听器得到nas的ip地址

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

6.4. Code--

public static void main(String[] args) throws 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

Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++的更多相关文章

  1. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

    Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型  按查找 ...

  2. Atitit web remote远程调试的原理attilax总结

    Atitit web remote远程调试的原理attilax总结 Jvm是vm打开一个debug port,然后ide先连接..然后执行url,就会vm会与ide沟通.. Php的xdebug po ...

  3. Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构

    Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 索引的类型  按查找方式分,两种,分块索引 vs编号索引1 1.2. 按索引与数据的查找顺序可分为 正 ...

  4. Atitit Data Matrix dm码的原理与特点

    Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于 ...

  5. Atitit 深入理解耦合Coupling的原理与attilax总结

    Atitit 深入理解耦合Coupling的原理与attilax总结     耦合是指两个或两个以上的电路元件或电网络等的输入与输出之间存在紧密配合与相互影响,并通过相互作用从一侧向另一侧传输能量的现 ...

  6. Atitit 异常机制与异常处理的原理与概论

    Atitit 异常机制与异常处理的原理与概论 1. 异常vs 返回码1 1.1. 返回码模式的处理 (瀑布if 跳到失败1 1.2. 终止模式  vs 恢复模式(asp2 1.3. 异常机制的设计原理 ...

  7. Atitit.gui api自动化调用技术原理与实践

    Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...

  8. Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2

    Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...

  9. Atitit.实现继承的原理and方法java javascript .net c# php ...

    Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 ...

随机推荐

  1. RabbitMQ (五) 订阅者模式之分发模式 ( fanout )

    前面讲到了简单队列和工作队列. 这两种队列有个非常明显的缺点 : 生产者发送的消息,只能进入到一个队列. 消息只能进入到一个队列就意味着消息只能被一个消费者消费. 尽管工作队列模式中,一个队列中的消息 ...

  2. Xamarin XAML语言教程ContentView视图作为自定义视图的父类

    Xamarin XAML语言教程ContentView视图作为自定义视图的父类 自定义视图的父类:ContentView视图可以作为自定义视图的父类. [示例14-2]以下将自定义一个颜色视图.具体的 ...

  3. map泛型 map不指定泛型 与 Map<Object,Object>的区别

    map泛型 map不指定泛型 与 Map<Object,Object>的区别 private void viewDetail(){ Map map1 = new HashMap(); Ma ...

  4. 多IDC GSLB的部署 - ADC技术博客 - 51CTO技术博客

    多IDC GSLB的部署 - ADC技术博客 - 51CTO技术博客 A10

  5. Looking deeper into SQL Server using Minidumps

    https://blogs.msdn.microsoft.com/sqlcat/2009/09/11/looking-deeper-into-sql-server-using-minidumps/ A ...

  6. EF 通用数据层父类方法小结

    MSSql 数据库 数据层 父类 增删改查: using System;using System.Collections.Generic;using System.Data;using System. ...

  7. JavaScript 的闭包用于什么场景

    本文翻译自 MDN ( Mozilla Developer Network ): 原文地址:MDN 译文地址:shixinzhang 的博客 读完本文你将了解到: 词法作用域 闭包 闭包实战场景之回调 ...

  8. javascript设计模式 第一章 灵活的javascript

    javascript 设计模式 第1章 灵活的语言--JavaScript 初级程序员接到一个验证表单功能的任务,需要验证用户名.邮箱.密码等 ** 此文章内容大部分来自 <javascript ...

  9. WebLogic Server 12.2.1 多租户安装配置

    1.安装WebLogic 12.2.1版本 下载安装的时候记住选择Fusion Middleware Infrastructer Installer. 2.安装OTD OTD需要单独下载安装,安装的时 ...

  10. IP地址后面斜杠加具体数字详解

    其实这种形式就是用CIDR(无类别域间路由选择,Classless and Subnet Address Extensions and Supernetting))的形式表示的一个网段,或者说子网. ...