Мар 102011
 

Я аж сам обалдел от названия записи))
Предыстория:
Так получилось , что появился у меня медиа плеер 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. Её нам и надо поставить, чтобы видео контент с роутера шел направленно в медиа плеер или компьютер.
Дальше я пользовался мануалом товарища [info]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 монтируется следующим образом (мануал ):

  1. Click Enable JFFS.
  2. On the router web page click on Administration.
  3. Scroll down until you see JFFS2 Support section.
  4. Click Save.
  5. Wait couple seconds, then click Apply.
  6. Wait again. Go back to the Enable JFFS section, and enable Clean JFFS.
  7. Do not click "Save". Click Apply instead. 
  8. *** The router formats the available space. ***
  9. Wait till you get the web-GUI back, then disable "Clean JFFS" again.
  10. Click "Save".
  11. 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. Спасибо тебе !

 

 

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)