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. ( 转 ) 数据库BTree索引、Hash索引、Bitmap位图索引的优缺点

    测试于:MySQL 5.5.25 当前测试的版本是Mysql 5.5.25只有BTree和Hash两种索引类型,默认为BTree.Oracle或其他类型数据库中会有Bitmap索引(位图索引),这里作 ...

  2. Java异常处理机制及两种异常的区别

    java异常处理机制主要依赖于try,catch,finally,throw,throws五个关键字.   try 关键字后紧跟一个花括号括起来的代码块,简称try块.同理:下面的也被称为相应的块. ...

  3. Ze_Min Tree 主席树

    前言 主席树,也叫可持久化线段树,所以他的本质是颗线段树,而可持久化指的是这颗线段树可以访问过去某个时刻线段树上的信息. 应用 应用的比较多的是查询区间的第k大值(因为其他的数据结构不好做). 实现 ...

  4. POJ 2311 Cutting Game (Multi-Nim)

    [题目链接] http://poj.org/problem?id=2311 [题目大意] 给出一张n*m的纸,每次可以在一张纸上面切一刀将其分为两半 谁先切出1*1的小纸片谁就赢了, [题解] 如果切 ...

  5. 8.5(java学习笔记)8.5 字节码操作(javassist)

    一.javassist javassist让我们操作字节码更加简单,它是一个类库,允许我们修改字节码.它允许java程序动态的创建.修改类. javassist提供了两个层次的API,基于源码级别的和 ...

  6. 13test04:捕鱼

    #include<iostream> using namespace std; int main() { int fish_sum,flag=1; for(fish_sum=6;flag; ...

  7. iOS:延迟加载和上拉刷新/下拉加载的实现

    lazy懒加载(延迟加载)UITableView 举个例子,当我们在用网易新闻App时,看着那么多的新闻,并不是所有的都是我们感兴趣的,有的时候我们只是很快的滑过,想要快速的略过不喜欢的内容,但是只要 ...

  8. linux sudo使用学习记录

    sudo在linux中非常重要,它能够使普通的用户临时拥有root权限.但是如果让用户滥用sudo命令的话可能会造成严重的影响. 例如:修改root的密码,切换到root用户等等. 所以我们虽然需要赋 ...

  9. GPU Instance

    http://forum.china.unity3d.com/thread-17131-1-1.html https://docs.unity3d.com/Manual/GPUInstancing.h ...

  10. Hadoop+Spark+Hbase部署整合篇

    之前的几篇博客中记录的Hadoop.Spark和Hbase部署过程虽然看起来是没多大问题,但是之后在上面跑任务的时候出现了各种各样的配置问题.庆幸有将问题记录下来,可以整理出这篇部署整合篇. 确保集群 ...