前言:
之前有专文介绍了minidlna中的UPNP功能,内中介绍其中包含的SSDP(简单发现协议),SOAP(简单对象访问协议)等几个协议(http://blog.csdn.net/sakaue/article/details/19070735)。本文将根据minidlna的程序流程,概述SSDP的流程,为下一部分ACE实现做铺垫。
设备发现的大致流程:
首先,根据UPNP的规范:
在设备加入网络,UPnP发现协议允许设备向控制点广告它的服务。它使用向一个标准地址和端口多址传送发现消息来实现。控制点在此端口上侦听是否有新服务加入系统。为了通知所有设备,一个设备为每个其上的嵌入设备和服务发送一系列相应的发现消息。每个消息也包含它表征设备或服务的特定信息。
我们需要在服务(设备)开始时定时多播一个ssdp::alive给各个加入组播的用户(控制点),信息个格式如下:
NOTIFY * HTTP/1.1
HOST:239.255.255.250:1900 #协议保留多播地址和端口,必须是239.255.255.250:1900
CACHE-CONTROL:max-age=1810 #max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在
LOCATION:http://192.168.1.20:8200/rootDesc.xml #包含根设备描述得URL地址
SERVER: 3.4.72-rt89 DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.0
NT:upnp:rootdevice #在此消息中,NT头必须为服务的服务类型
USN:uuid:4d696e69-444c-164e-9d41-001ec92f0378::upnp:rootdevice #表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力
NTS:ssdp:alive #表示通知消息的子类型,必须为ssdp:alive
这种定时的的ssdp::alive消息需要发送以下几种类型的USN(统一服务名):
static const char * const known_service_types[] =
{
"upnp:rootdevice",