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. Struts2遇到Caused by Action class not found这类问题怎么解决

    刚才碰到个小坑,显示的错误是struts.xml找不到Action,明显不会有错的因为之前还是正常跑起来的,然后百度google搜了一通没解决,maven clean用了没反应还是照样报错. 最后在百 ...

  2. iOS计算富文本(NSMutableAttributedString)高度

    有时候开发中我们为了样式好看, 需要对文本设置富文本属性, 设置完后那么怎样计算其高度呢, 很简单, 方法如下: - (NSInteger)hideLabelLayoutHeight:(NSStrin ...

  3. debian 6软件更新源列表

    deb http://ftp.debian.org/debian/ squeeze main non-free contribdeb http://ftp.debian.org/debian/ squ ...

  4. java只有值传递,不存在引用传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  5. t-SNE和LDA PCA的学习

    t-SNE 可以看这篇文章: http://bindog.github.io/blog/2016/06/04/from-sne-to-tsne-to-largevis/ LDA可以看这篇文章: htt ...

  6. javascript快速入门18--样式

    修改元素外观方式 修改元素外观主要有下面3种方法:修改ID,修改className,修改元素的style属性 修改ID?会造成多么混乱的结果可想而知! 修改className确实是非常好的方法,我们甚 ...

  7. 【Hadoop】HDFS源码解读

    1.open流程 2.get DFS流程: 3.获取block信息流程

  8. 使用JMeter3.0实战之分布式并发测试以及web API接口测试

    简介: 该文档是以Apche JMeter-3.0为例进行编写的,通过网上的学习资料和官方文档的说明手册学习后,进行项目操作实践,将测试的过程记录下提供给大家学习. 本博文的内容主要是进行配置JMet ...

  9. JSON 对象

    JSON 对象 对象语法 { "name":"runoob", "alexa":10000, "site":null } ...

  10. 协程基础_context系列函数

    近期想看看协程,对这个的详细实现不太了解.查了下,协程最常规的做法就是基于makecontext,getcontext,swapcontext这类函数在用户空间切换用户上下文. 所以在这通过样例代码尽 ...