Site Tools


software:ssdpd:config

В ssdpd.conf - файл конфигурации, подробнее ниже.

ssdpd и веб сервер могут быть запущены на разных серверах, можно запускать ssdpd на нескольких серверах (резервирование), важно чтобы root.xml был везде одинаковый.

SSDPd и nginx должны отдавать клиентам одинаковый XML файл с описанием UPnP устройства и его сервисов, далее везде root.xml
/upnp/ - положить/сделать симлинк в wwwroot веб сервера.
/upnp/control/ContentDirectory.php - отредактировать в начале файла переменные с путями и разрешить выполнение.
Нужен PHP с поддержкой SOAP.

Если потребуется изменить пути то нужно редактировать следующие файлы:

  • ssdpd.conf
  • nginx.conf
  • /upnp/descr/root.xml
  • /upnp/control/ContentDirectory.php

Настройка сети

IPv4

  • разрешить IGMP с опциями на вход и на выход с адресом назначения: 224.0.0.0/4
  • разрешить UDP на вход с адресом назначения: 224.0.0.0/4, на выход с любым адресом
pass out quick inet proto udp to 224.0.0.0/4 no state allow-opts
pass out quick inet proto igmp to 224.0.0.0/4 no state allow-opts
pass in quick inet proto udp to 224.0.0.0/4 no state # Allow receive multicast
pass in quick inet proto igmp to 224.0.0.0/4 no state allow-opts

IPv6

  • разрешить icmp6 с опциями на вход и на выход
  • разрешить UDP на вход с адресом назначения: ff00::/8, на выход с любым адресом
pass out quick inet6 proto udp to ff00::/8 no state allow-opts # Allow send multicast
pass out quick inet6 proto icmp6 no state allow-opts # mld (igmp6) also here
pass in quick inet6 proto udp to ff00::/8 no state # Allow receive multicast
pass in quick inet6 proto icmp6 no state allow-opts # mld (igmp6) also here

ssdpd.conf

log

Лог файл.

<log>
	<file>/root/msd/msd.log</file>
</log>

file

Имя файла. Запись производится если в командной строке не указан -v, иначе лог пишется в stdout.


skt

Настройки сокета.

<skt>
	<rcvBuf>64</rcvBuf>
	<sndBuf>64</sndBuf>
	<ttl>2</ttl>
	<hopLimit>5</hopLimit>
</skt>

rcvBuf

Максимальный размер буфера для приёма (SO_RCVBUF).

sndBuf

Максимальный размер буфера для отправки (SO_SNDBUF).

ttl

TTL - Только для IPv4. IP_MULTICAST_TTL

hopLimit

TTL - Только для IPv6. IPV6_MULTICAST_HOPS


Общие настройки

<flagEnableIPv4/>
<flagEnableIPv6/>
<httpServer></httpServer>

flagEnableIPv4

Включить IPv4.

flagEnableIPv6

Включить IPv6.

httpServer

Если не задано или пустое то автоматически генерируется поле Server вида: 'OS/version UPnP/1.1 product/version'


announceList

Список устройств для анонсирования.

<announceList>
	<announce>
		<xmlDevDescr>/usr/local/www/upnp/descr/root.xml</xmlDevDescr>
		<maxAge>1800</maxAge>
		<interval>10</interval>
		<ifList>
			<if>
				<ifName>vlan777</ifName>
				<DevDescrURL4><![CDATA[http://0.0.0.0:80/upnp/descr/root.xml]]></DevDescrURL4>
				<DevDescrURL6><![CDATA[http://[::]:80/upnp/descr/root.xml]]></DevDescrURL6>
			</if>
		</ifList>
	</announce>
</announceList>

announce

Описание UPnP устройства для анонсирования.

xmlDevDescr

Путь к XML файлу с описанием устройства.
SSDPd загружает из этого файла описание устройства и его сервисов.

maxAge

Время в секундах, используется клиентами для кеширования.

interval

Время в секундах, указывает как часто SSDPd посылает анонс в сеть.

ifList, if

Список сетевых интерфейсов для отсылки анонсов данного устройства.

ifName

Имя сетевого интерфейса для отсылки анонсов, так как его выдает ifconfig, например: eth0, re0, em1.

DevDescrURL4

URL для IPv4 анонсов.
Адрес “0.0.0.0” автоматически заменяется на IPv4 адрес на данном интерфейсе.
URL должен указывать на файл с XML описанием UPnP устройства и его сервисов, это должен быть тот же самый файл что и xmlDevDescr только доступный все по протоколу HTTP.

DevDescrURL6

Аналогично DevDescrURL4.
Адрес “[::]” автоматически заменяется на IPv6 адрес на данном интерфейсе.


Настройка nginx

Здесь самый минимум настроек, всё что связано с безопасностью/доступом, логами удалено.

Расшариваем папку с контентом:

# allow files listing: DataStore
location ^~ /DataStore/ {
	root /usr/;
	add_header TransferMode.DLNA.ORG 'Streaming';
	add_header ContentFeatures.DLNA.ORG 'DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000';
}

Дополнительные заголовки часто требуются UPnP/DLNA клиентам для работы.

Поддержка UPnP SUBSCRIBE/UNSUBSCRIBE (они нужны для VLC и WMP)

# UPnP SUBSCRIBE/UNSUBSCRIBE handle
location ^~ /upnp/subscribe/ {
	if ($request_method = SUBSCRIBE) {
		add_header Pragma "no-cache";
		add_header SID "uuid:7CF21CB0-2266-47BE-A608-3CC1F5210BB4";
		add_header Timeout "Second-1800";
		return 200;
	}
	if ($request_method = UNSUBSCRIBE) {
		add_header Pragma "no-cache";
		return 200;
	}
}

Если потребуется обрабатывать эти запросы в скриптах, то можно превратить их в POST с дополнительным заголовком и передать в скрипт, пример описан здесь: http://serverfault.com/questions/347663/nginx-convert-head-to-get-requests

Разрешаем PHP для UPnP скриптов:

# php for: UPnP
location ^~ /upnp/control/ {
	root /usr/local/www/;

	try_files		$fastcgi_script_name = 404;
	#fastcgi_pass		127.0.0.1:54475;
	fastcgi_pass		unix:/var/run/spawn-fcgi.sock;
	fastcgi_connect_timeout 30;
	fastcgi_read_timeout	600;
	fastcgi_send_timeout	600;
	fastcgi_ignore_client_abort off;
	#fastcgi_cache_valid	any 10s;
	fastcgi_intercept_errors off;
	include			fastcgi_params;
	fastcgi_param		SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

Расширенная настройка и кастомизация под себя

В файле root.xml
root/device
friendlyName - отображаемое имя UPnP устройства;
UDN - UUID идетификатор устройства, его нужно изменять только если хотим больше одного устройства (или кто то уже его занял), длинна обязательно 36 символов;
presentationURL - можно указать там страничку с описанием или админкой.

root/device/iconList/icon
url - URL на png иконку 48х48;

root/device/serviceList/service
SCPDURL - URL до хмл файла с описанием;
controlURL - URL куда будут прилетать HTTP POST запросы к сервисам;
eventSubURL - URL куда будут идти HTTP SUBSCRIBE/UNSUBSCRIBE, можно оставить пустым.

root.xml описано ТРИ сервиса, нужно править для всех трёх!

software/ssdpd/config.txt · Last modified: 2022/02/04 18:43 by root