Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++
Atitit.upnp SSDP 查找nas的原理与实现java php c#.net c++
4. Cling - Java/Android UPnP library and tools3
6.1. 主要流程说明。。建立UpnpService 发出查询请求4
6.2. // Let's wait 10 seconds for them to respond4
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回应响应消息。典型:
|
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++的更多相关文章
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 按照存储结构划分btree,hash,bitmap,fulltext1 1.2. 索引的类型 按查找 ...
- Atitit web remote远程调试的原理attilax总结
Atitit web remote远程调试的原理attilax总结 Jvm是vm打开一个debug port,然后ide先连接..然后执行url,就会vm会与ide沟通.. Php的xdebug po ...
- Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构
Atitit.数据索引 的种类以及原理实现机制 索引常用的存储结构 1. 索引的分类1 1.1. 索引的类型 按查找方式分,两种,分块索引 vs编号索引1 1.2. 按索引与数据的查找顺序可分为 正 ...
- Atitit Data Matrix dm码的原理与特点
Atitit Data Matrix dm码的原理与特点 Datamatrix原名Datacode,由美国国际资料公司(International Data Matrix, 简称ID Matrix)于 ...
- Atitit 深入理解耦合Coupling的原理与attilax总结
Atitit 深入理解耦合Coupling的原理与attilax总结 耦合是指两个或两个以上的电路元件或电网络等的输入与输出之间存在紧密配合与相互影响,并通过相互作用从一侧向另一侧传输能量的现 ...
- Atitit 异常机制与异常处理的原理与概论
Atitit 异常机制与异常处理的原理与概论 1. 异常vs 返回码1 1.1. 返回码模式的处理 (瀑布if 跳到失败1 1.2. 终止模式 vs 恢复模式(asp2 1.3. 异常机制的设计原理 ...
- Atitit.gui api自动化调用技术原理与实践
Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...
- Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2
Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...
- Atitit.实现继承的原理and方法java javascript .net c# php ...
Atitit.实现继承的原理and方法java javascript .net c# php ... 1. 实现继承的问题 1 2. 如何拷贝基类方法?采用prototype原型方式,通过冒充对象 1 ...
随机推荐
- 【找规律】URAL - 2069 - Hard Rock
题解及证明:http://www.cnblogs.com/StupidBoy/p/5241258.html #include<cstdio> #include<algorithm&g ...
- 【函数式权值分块】【块状链表】bzoj3065 带插入区间K小值
显然是块状链表的经典题.但是经典做法的复杂度是O(n*sqrt(n)*log^2(n))的,出题人明确说了会卡掉. 于是我们考虑每个块内记录前n个块的权值分块. 查询的时候差分什么的,复杂度就是O(n ...
- 【kmp算法】模板
void GetFail(char P[],int __next[])//__next[i]表示s[0]~s[i-1]的前缀中,最大长度相等的前后缀是多少 { __next[0]=-1; int le ...
- golang的reflect
引用自 http://www.jb51.net/article/115002.htm 和 C 数据结构一样,Go 对象头部并没有类型指针,通过其自身是无法在运行期获知任何类型相关信息的.反射操作所需要 ...
- JavaScript:this是什么
JavaScript:this是什么? 定义:this是包含它的函数作为方法被调用时所属的对象. 说明:这句话有点咬嘴,但一个多余的字也没有,定义非常准确,我们可以分3部分来理解它! 1.包含它的函数 ...
- TSynDBDataSet内存表
TSynDBDataSet内存表 SynDBMidasVCL.pas TSynDBDataSet = class(TCustomClientDataSet) Props := TSQLDBSocket ...
- 【spring data jpa】spring data jpa 中的update 更新字段,如果原字段值为null不处理,不为null则在原来的值上加一段字符串
示例代码: /** * 如果barCode字段值为null则不处理 * 如果barCode字段值不为null则在原本值的前面拼接 del: * @param dealer * @return */ @ ...
- Swift,字符串
1.字符串只能使用双引号 var a="你好" 2.单字与多字 var a:Character="1" var b:String="12" ...
- LibreOffice创建数据透视表
LibreOffice创建数据透视表 LibreOffice: 选中数据,Data->Pivot Table->Create,拖拽行.列到Row和column,Data Filed要点击O ...
- Render Texture coordinates
https://docs.unity3d.com/550/Documentation/Manual/SL-PlatformDifferences.html Render Texture coordin ...