LINUX下 ssdp 实现

编程入门 行业动态 更新时间:2024-10-27 02:18:38

<a href=https://www.elefans.com/category/jswz/34/1770067.html style=LINUX下 ssdp 实现"/>

LINUX下 ssdp 实现

LINUX下 ssdp 实现

ssdp介绍

ssdp(简单发现协议)是一个应用层协议,主要是在局域网中,让别的应用发现自己。通过ssdp协议,也能够让windows网络邻居显示应用。

ssdp实现流程

ssdp设备(相机、打印机):在网络中通过组播定时向外发送notify通知消息,通知查找端自己的存在,并在查找端查询时,向组播组中发送resp消息,在设备下线时向组播中发送bye消息。
ssdp查找者(群控软件、网络邻居):在网络中通过组播来发送search消息,询问局域网中的设备,并且接收设备发送的notify消息和resp消息得到对方的信息,接收bye信息并处理。

ssdp消息类型

saerch:

M-SEARCH * HTTP/1.1
HOST:239.255.255.250:1900
MAN:"ssdp:discover"
ST:upnp:rootdevice  //查询的设备类型
MX: 8 //设置设备响应最长等待时间,设备响应在0和这个值之间随机选择响应延迟的值

noti:

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900      //协议保留多播地址和端口,必须是239.255.255.250:1900
CACHE-CONTROL: max-age=3600 // max-age指定通知消息存活时间,如果超过此时间间隔,控制点可以认为设备不存在  
LOCATION:http://192.168.2.172:80/upnpdevicedesc.xml   //xml文件
SERVER: 3.4.72-rt89 DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.0 
NT:upnp:rootdevice           //设备的服务类型  
USN: uuid:4d696e69-444c-164e-9d41-001ec92f0378::upnp:rootdevice 8  // 表示不同服务的统一服务名,它提供了一种标识出相同类型服务的能力  
NTS:ssdp:alive

USN类型

static const char * const known_service_types[] =
{"upnp:rootdevice",                                               //网络中的根设备"urn:schemas-upnp-org:device:MediaServer:",                      //媒体服务器"urn:schemas-upnp-org:service:ContentDirectory:",               //内容管理服务"urn:schemas-upnp-org:service:ConnectionManager:",          //连接管理服务"urn:microsoft.com:service:X_MS_MediaReceiverRegistrar:",0
};

resp:

HTTP/1.1 200 OK
CACHE-CONTROL: max-age=1810
ST:upnp:rootdevice
USN: uuid:4d696e69-444c-164e-9d41-001ec92f0378::urn:schemas-upnp-org:device:MediaServer:1
EXT:
SERVER: 3.2.0-61-generic DLNADOC/1.50 UPnP/1.0 SakaueDLNA/1.1.2
LOCATION:http://192.168.2.172:80/upnpdevicedesc.xml
Content-Length: 0

bye:

NOTIFY * HTTP/1.1
HOST: 239.255.255.250:1900
NT: upnp:rootdevice
NTS: ssdp:byebye
USN: advertisement 4d696e69-444c-164e-9d41-001ec92f0378

编程问题

1.组播发送套接字不需要加入组播,接收套接字需要加入,需要创建两个不同的套接字。
2.设置组播属性时,建议使用struct ip_mreq 结构体,我使用ip_mreqn结构体在release下出现setsockopt: No such device问题。
3.想要在网络邻居中看见,要win + r 输入services.msc打开‘服务’,并在‘服务’中打开ssdp discovery 功能。
4.想在网络邻居中看见还需要在location中给出一个xml文件,Windows会向对应的ip的location中给出的端口寻找,需要一个web服务器提供此文件。
5.ssdp消息格式错误。
xml:

<?xml version="1.0" encoding="UTF-8"?>-<root xmlns="urn:schemas-upnp-org:device-1-0">-<specVersion><major>1</major><minor>0</minor></specVersion>-<device><deviceType>urn:schemas-upnp-org:device:EmbeddedNetDevice:1</deviceType><friendlyName>http://192.168.2.172/</friendlyName><manufacturer>xinmier</manufacturer><manufacturerURL>/</manufacturerURL><modelDescription>Digital Video Recorder</modelDescription><modelName>xinmier</modelName><modelNumber>xmr-ar02</modelNumber><modelURL>http://192.168.2.172/</modelURL><serialNumber>0420220908CCRRK36892190WCVU</serialNumber><UDN>uuid:484B3336-3839-3231-3930-C06DED185BA9</UDN>-<serviceList>-<service><serviceType>urn:schemas-upnp-org:service:EmbeddedNetDeviceControl:1</serviceType><serviceId>urn:upnp-org:serviceId:EmbeddedNetDeviceControl</serviceId><controlURL>/</controlURL><eventSubURL>/</eventSubURL><SCPDURL>/</SCPDURL></service></serviceList><presentationURL>/</presentationURL></device></root>

更多推荐

LINUX下 ssdp 实现

本文发布于:2023-06-13 05:26:27,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/674928.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:LINUX   ssdp

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!