Я аж сам обалдел от названия записи))
Предыстория:
Так получилось , что появился у меня медиа плеер WD (WD TV Live). Эта маленькая, совсем недорогая, штучка может воспроизводить фильмы в HD качестве и при наличии прямых рук растущих из плечей — качать торренты, к нему можно подключить внешний винт и качать с него по фтп, ну и показывать IPTV. Последний пункт я решил воплотить в жизнь т.к. мой провайдер транслирует сто каналов в хорошем качестве абсолютно бесплатно. Ну и последним штрихом в задаче стало — транслировать все через вайфай, ведь по проводам как то не гламурно. Да ведь? Для этого был куплен свисток DLink DWA-140 (на спец форуме есть отдельная тема посвященная их выбору).
Планировалось так же гонять HD видео по сети и наличие вайфая 802.11n в свистке и роутере (Asus RT-N16) было обязательно.
На роутере стояла прошивка DD-WRT v24-sp2 (08/12/10) mega с дефолтными настройками. Процесс прошивки можно почитать в Wiki на сайте www.dd-wrt.com.
В первую очередь необходимо было протестить самое первое звено получающее IPTV траффик — роутер. Для этого отключается параметр"Filter Multicast" на вкладке Security—>Firewall и там же на время тестов полностью отключить фаервол (SPI Firewall выставить Disable). После надо узнать UDP адреса каналов провайдера (они как правило лежат в плейлисте формата m3u) и попробовать впихнуть их в VLC Player (гуглим->качаем) на стационарном компе\ноуте подключенном шнурком к роутеру.
Адреса выглядят так:
#EXTM3U
#EXTINF:-1,ICTV Channel
udp://@238.0.0.5:1234
#EXTINF:0,Новый канал
udp://@238.0.0.7:1234 Вот например udp://@238.0.0.5:1234 и надо скормить в VLC Player. Если не работает — идти на форумы тех поддержки провайдера.
Наслаждаемся видео и понимаем, что из соседней комнаты кричит жена "не работает интернед!!!". Это мы получили последствия мультикаст шторма и у нас завалился вайфай от того, что видео контент транслируется роутером одновременно на все лан порты и в вайфай сеть, от чего та пухнет и не работает. Как же это лечить? Сложно. Но можно.
UDP Proxy (small-footprint UNIX/Linux daemon to relay multicast UDP traffic to client’s TCP (HTTP) connection) — прокся, которая конвертит UDP контент в HTTP. Её нам и надо поставить, чтобы видео контент с роутера шел направленно в медиа плеер или компьютер.
Дальше я пользовался мануалом товарища clark15b , я его немного видоизменил и добавил комменты:
— Качаем отсюда ipkg пакет для mipsel, например это;
— Закидываем его по SCP на роутер в /var/tmp; (прим. я использовал WinSCP )
— Идем на роутер ssh`ом (прим. я использовал Putty), генерим необходимые ключи и выполняем там ‘ipkg -d /var/tmp install /var/tmp/udpxy_1.0-Chipmunk-11_mipsel.ipk’; ( с первого раза у меня этот шаг не получился и инсталлил я его сразу в jffs)
— Ищем в поддиректориях /var/tmp бинарник ‘udpxy’ и переносим его в /jffs/bin (JFFS должен быть, места в нем должно быть достаточно, директорию bin создаем руками). С таким же успехом можно положить udpxy и на USB флешку, но я ей не пользуюсь;
— Если по каким то причинам не получилось проинсталлить udpxy, то бинарник можно взять из этой темы и залить его ручками в /jffs/bin.
JFFS монтируется следующим образом (мануал ):
- Click Enable JFFS.
- On the router web page click on Administration.
- Scroll down until you see JFFS2 Support section.
- Click Save.
- Wait couple seconds, then click Apply.
- Wait again. Go back to the Enable JFFS section, and enable Clean JFFS.
- Do not click "Save". Click Apply instead.
- *** The router formats the available space. ***
- Wait till you get the web-GUI back, then disable "Clean JFFS" again.
- Click "Save".
- It may be wise to Reboot the router, just to make sure
После этого в меню Administration->Commands я добавил следующее:
cd /jffs/bin
chmod +x udpxy
/jffs/bin/udpxy -p 81 -M 30 -B 1Mb -a 192.168.1.1
где 192.168.1.1 — адрес роутера.
Жмем Save Startup. Этот скрипт будет загружаться при загрузке роутера.
Перезагружаемся, проверяем работает ли udpxy, для этого надо зайти на http://192.168.1.1:81/status
И посмотреть появилось ли окно статуса udpxy. Если нет — перечитываем и пробуем еще раз.
Убедитесь, что в JFFS достаточно места, что бинарник udpxy лежит в /jffs/bin, что у него есь право на исполнение.
Дальше еще веселее…
Теперь нам необходимо определить:
1. адрес источника мультикаста
2. адрес IGMP роутера
Это шикарно расписано в сообщении Олега с форума wl500g.info:
Цитирую:
Как определить адрес источника мультикаста.
Самый простой способ — спросить у провайдера. Сразу хочу сказать, что адреса 224.x.x.x — 239.x.x.x — это не источник, а адрес мультикаст группы. Добавлять маршрут к ней НЕ нужно. Если Вам хочется определить самому адрес источника, то делается это так:
Предположим, что вещание какого-то канала ТВ осуществляется в мультикаст группе 233.32.210.1 по протоколу UDP, порт 5500.
Заходите на роутер с помощью telnet или ssh (telnet 192.168.1.1) и выполняете команду
tcpdump -i $(nvram get wan_ifname) -n -p udp port 5500 and host 233.32.210.1
(прим. у меня потребовалось сначала установить сам tcpdump, командой — ipkg -force-depends -d root install tcpdump )
Дальше запускаете ТВ, включаете этот канал и смотрите на вывод роутера. Должны "полететь" однотипные пакеты примерно такого содержания:
00:20:07.717562 IP 85.21.91.195.32770 > 233.32.210.1.5050: UDP, length: 1316
В левой части — адрес источника (85.21.91.195). Далее, Вы должны проделать тоже самое для других каналов. Как правило, выясняется, что либо источник один, либо они все в одной сети — в данном случае 85.21.91.0/255.255.255.0 (это Корбина).
Как определить адрес следящего IGMP роутера.
Запускаем на роутере:
tcpdump -i $(nvram get wan_ifname) -p igmp -n
Смотрим телевизор. И наблюдаем за выводом. Нас интересует, кто делает igmp query:
22:28:56.543469 IP 93.61.0.38 > 239.255.0.100: igmp v2 report 239.255.0.100
22:28:57.173465 IP 93.61.0.38 > 239.255.255.250: igmp v2 report 239.255.255.250
22:30:56.616203 IP 10.39.36.10 > 224.0.0.1: igmp query v2
93.61.0.38 — мой роутер. igmp report — это он подписывается на трафик.
Вот так круто мы все узнали. Теперь во вкладке Setup->Advanced Routing добавляем:
Сеть — [адрес источника мультикаста]
Маска — 255.255.255.0
Шлюз — 0.0.0.0
Мнтерфейс — WAN
и
Сеть — [адрес IGMP роутера]
Маска — 255.255.255.255
Шлюз — 0.0.0.0
Интерфейс — WAN
В Administration->Commands редактируем стартап системы и добавляем:
/usr/sbin/iptables -I INPUT -p udp -s [адрес источника мультикаста]/24 -j logaccept
/usr/sbin/iptables -I INPUT -p igmp -s [адрес IGMP роутера] -j logaccept
Перезагружаемся и пробуем скормить VLC ссылку типа:
http://192.168.1.1:81/udp/238.0.0.5:1234
Мы обращаемся к роутеру через HTTP и запрашиваем UDP контент.
Работает!
Идем в Security-> Firewall и включаем фаервол : SPI Firewall — Enable.
Проверяем что с ним тоже все работает.
Ну чтож, дело осталось за малым. За "ведерком" как его кличут на дружественных форумах WD.
Смело бежим качать кастомную прошивку товарища Брада здесь. Лично я взял 4.5.3.
Процесс перепрошивки крайне прост:
— берем флешку на гиг
— форматируем ее в фат32
— разархивируем прошивку во флешку и втыкаем её в ведро
— через несколько секунд оно само скажет мол ай ай прошивка новая и пару раз кликнув ок, начнется процесс перепрошивки.
Если возникнут трудности, весь процесс подробно можно прочитать тут.
Теперь IPTV,
Берём архив iptv.zip , его содержимое распаковываем на флешку. Редактируем плейлист (настоятельно рекомендую брать плейлист из архива. Сам обжегся и танцевал с бубном несколько часов, пока понял что мой плейлист читается криво).
Открываем S00custom-options , в нем нам надо отключить локальное udpxy и указать адрес роутера, вот так:
#!/bin/sh
config_tool -c UDPXY_LOCAL="OFF"
#config_tool -c UDPXY_PARAM="-B 512000 -R -1"
config_tool -c UDPXY_EXTURL="http://192.168.1.1:81/udp/"
Теперь ведро когда будет видеть ссылки на UDP, оно будет автоматом подставлять строку типа http://192.168.1.1:81/udp/ перед ним.
Подробно о настройке IPTV на ведре читать тут.
Все господа! Все настроено, наслаждаемся.
P.S. Большую часть смог настроить благодаря AlexGP48 с форума DD-WRT. Спасибо тебе !