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://www.cnblogs.com/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