В ssdpd.conf - файл конфигурации, подробнее ниже.
ssdpd и веб сервер могут быть запущены на разных серверах, можно запускать ssdpd на нескольких серверах (резервирование), важно чтобы root.xml был везде одинаковый.
SSDPd и nginx должны отдавать клиентам одинаковый XML файл с описанием UPnP устройства и его сервисов, далее везде root.xml
/upnp/ - положить/сделать симлинк в wwwroot веб сервера.
/upnp/control/ContentDirectory.php - отредактировать в начале файла переменные с путями и разрешить выполнение.
Нужен PHP с поддержкой SOAP.
Если потребуется изменить пути то нужно редактировать следующие файлы:
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
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
Лог файл.
<log> <file>/root/msd/msd.log</file> </log>
Имя файла. Запись производится если в командной строке не указан -v, иначе лог пишется в stdout.
Настройки сокета.
<skt> <rcvBuf>64</rcvBuf> <sndBuf>64</sndBuf> <ttl>2</ttl> <hopLimit>5</hopLimit> </skt>
Максимальный размер буфера для приёма (SO_RCVBUF).
Максимальный размер буфера для отправки (SO_SNDBUF).
TTL - Только для IPv4. IP_MULTICAST_TTL
TTL - Только для IPv6. IPV6_MULTICAST_HOPS
<flagEnableIPv4/> <flagEnableIPv6/> <httpServer></httpServer>
Включить IPv4.
Включить IPv6.
Если не задано или пустое то автоматически генерируется поле Server вида: 'OS/version UPnP/1.1 product/version'
Список устройств для анонсирования.
<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>
Описание UPnP устройства для анонсирования.
Путь к XML файлу с описанием устройства.
SSDPd загружает из этого файла описание устройства и его сервисов.
Время в секундах, используется клиентами для кеширования.
Время в секундах, указывает как часто SSDPd посылает анонс в сеть.
Список сетевых интерфейсов для отсылки анонсов данного устройства.
Имя сетевого интерфейса для отсылки анонсов, так как его выдает ifconfig, например: eth0, re0, em1.
URL для IPv4 анонсов.
Адрес “0.0.0.0” автоматически заменяется на IPv4 адрес на данном интерфейсе.
URL должен указывать на файл с XML описанием UPnP устройства и его сервисов, это должен быть тот же самый файл что и xmlDevDescr только доступный все по протоколу HTTP.
Аналогично DevDescrURL4.
Адрес “[::]” автоматически заменяется на IPv6 адрес на данном интерфейсе.
Здесь самый минимум настроек, всё что связано с безопасностью/доступом, логами удалено.
Расшариваем папку с контентом:
# 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 описано ТРИ сервиса, нужно править для всех трёх!