SSDP-简单服务发现协议(SSDP,Simple Service Discovery Protocol)是一种应用层协议,是构成通用即插即用(UPnP)技术的核心协议之一。简单服务发现协议是在HTTPU和HTTPMU的基础上实现的协议。
按照协议的规定,当一个控制点(客户端)接入网络的时候,它可以向一个特定的多播地址的SSDP端口使用M-SEARCH方法发送“ssdp:discover”消息。本例中客户端接入网络发送的消息如下:
M-SEARCH * HTTP/1.1
MX:3
MAN:"ssdp:discover"
ST:gyfk:fkdevice
HOST:239.255.255.250:1900
Content-Length:0
含义:
M-SEARCH * HTTP/1.1 M-SEARCH
ST gyfk:fkdevice 仅搜索网络中的网元设备.
MX 设臵设备响应最长等待时间,这里为10.
MAN 设臵协议查询的类型,必须是"ssdp:discover”
HOST 设臵为协议保留多播地址和端口,必须是239.255.255.250:1900
当设备监听到这个保留的多播地址上由控制点发送的消息的时候,设备会分析控制点请求的服务,如果自身提供了控制点请求的服务,设备将通过单播的方式直接响应控制点的请求。本例中服务器端接收的主要处理代码:
protected void SendAliveMessage() {
SSDPAliveMsg aliveProduct = new SSDPAliveMsg(ipAndPort);//发送消息对象
SSDPSocket socket_rev = null;
SSDPSocket socket_send = null;
try {
socket_rev = new SSDPSocket(SSDP.PORT);//1900接收socket
socket_send = new SSDPSocket();//发消息socket
} catch (IOException e) {
e.printStackTrace();
}
try {
while (true) {
DatagramPacket dp_rev = socket_rev.receive();//接收到的数据包
InetAddress address = dp_rev.getAddress();//客户端IP
String s = new String(dp_rev.getData(),"utf-8");
if(s.contains("gyfk:fkdevice")){//匹配的终端设备才响应
DeviceSearchFrame.showMsg("发送数据到:"+address);
socket_send.send(aliveProduct.toString(), address);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
本例发送消息的内容为:
1
2
3
4
5
6
7
8
9
|
NOTIFY * HTTP/
1.1
HOST:
239.255
.
255.250
:
1900
CACHE-CONTROL: max-age=
300
LOCATION: http:
//192.168.196.64:8000/gyfk/
NT: gyfk:fkdevice
NTS: ssdp:alive
SERVER: Linux/
2.6
.
23
.17_stm23_A25C-SDK7105_7105-STSDK, UPnP/
1.0
, Portable SDK
for
UPnP devices/
1.6
.
6
X-User-Agent: redsonic
USN: uuid:70a9a997-a9d0-43ed-91dc-492e776a26c0::gyfk:fkdevice
|
服务端回复消息含义:
HTTP/1.1 200 OK HTTP版本信息以及响应代码
CACHE-CONTROL max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认
为设备不存在,这里为 300秒
DATE 服务器的时间信息
LOCATION 包含根设备描述得 URL地址
SERVER 包含操作系统名,版本,产品名和产品版本信息
ST 服务器设备类型为 gyfk:fkdevice
USN uuid: 通用唯一识别码 gyfk:fkdevice 设备类型
本例中设备发现的主要含义是终端接入网络后 通过设备发现将location:http://192.168.196.64:8000/gyfk/中的地址发给终端,便于终端后续数据的请求。