Сегодня многие интернет провайдеры обеспечивают услугу Интернет-телевидение (Internet Protocol TeleVision, IPTV) в своих сетях передачи данных. Для того, чтобы начать просмотр телевизионных программ, достаточно запустить программу видеопроигрыватель и подписаться на групповое вещание. Процесс усложняется, если Ваш компьютер для подключения к провайдеру использует беспроводное соединение. Например, Ваш домашний роутер подключен к провайдеру при помощи Fast Ethernet или ADSL, а Вы подключаетесь к роутеру, используя беспроводную сеть. IPTV в качестве транспортного пртокола использует UDP, сооветственно надежность передачи данных и обработка ошибок передачи обеспечивается на строне клиента. Когда IPTV клиент использует проводное соединение, проблем не возникает - потерь пакетов нет, задержка между приемом пакетов примерно одинакова. Беспроводное соединение вносит свои корективы - задержки и потери пакетов, искажения сигнала приводят к тому, что просмотр программ становится некомфортным - картинка дергается и искажается, пропадает звук. В качестве решения такой проблемы можно использовать преобразование групповой рассылки (рассылающей данные подписчикам по протоколу UDP) в клиентское TCP соединение. Т.е. Ваш домашний роутер по запросу беспроводного клиента подписывается на необходимый клиенту канал, получает данные при помощи multicast рассылки и отдает их клиенту, используя TCP соединение. Для преобразования протоколов передачи на роутере должна выполнятся программа proxy, например, udpxy. Рассмотрим процесс ее установки и настройки для организации домашнего IPTV. Мой домашний роутер работает под управлением OC FreeBSD, поэтому описанный ниже процесс установки и настройки применим только для этой ОС, для других операционных систем он может отличаться. Готовый пакет udpxy не входит в состав ОС FreeBSD, но его можно собрать самостоятельно, используя коллекцию портов. Мантейнером порта net/udpxy является Ваш покорный слуга и если у Вас есть мысли о том, как сделать пакет udpxy еще лучше, я буду рад услышать любые пожелания. Установка пакета udpxy из коллекции портов ничем не отличается от установки любого другого пакета:
# cd /usr/ports/net/udpxy
# make install
# pkg_info udpxy*
Information for udpxy-1.0.16:
Comment:
UDP-to-HTTP multicast traffic relay daemon
Description:
udpxy is a UDP-to-HTTP multicast traffic relay daemon:
it forwards UDP traffic from a given multicast subscription
to the requesting HTTP client.
WWW: http://udpxy.sourceforge.net/
Настройки udpxy просты и понятны - конфигурационных файлов нет, все параметры передаются в коммандной строке:
# udpxy
udpxy 1.0-Chipmunk (build 16) standard
usage: udpxy [-vTS] [-a listenaddr] -p port [-m mcast_ifc_addr] [-c clients] [-l logfile] [-B sizeK] [-n nice_incr]
-v : enable verbose output [default = disabled]
-S : enable client statistics [default = disabled]
-T : do NOT run as a daemon [default = daemon if root]
-a : (IPv4) address/interface to listen on [default = 0.0.0.0]
-p : port to listen on
-m : (IPv4) address/interface of (multicast) source [default = 0.0.0.0]
-c : max clients to serve [default = 3, max = 16]
-l : log output to file [default = stderr]
-B : buffer size (65536, 32Kb, 1Mb) for inbound (multicast) data [default = 2048 bytes]
-R : maximum messages to store in buffer (-1 = all) [default = 1]
-H : maximum time (sec) to hold data in buffer (-1 = unlimited) [default = 1]
-n : nice value increment [default = 0]
-M : periodically renew multicast subscription (skip if 0 sec) [default = 0 sec]
Examples:
udpxy -p 4022
listen for HTTP requests on port 4022, all network interfaces
udpxy -a lan0 -p 4022 -m lan1
listen for HTTP requests on interface lan0, port 4022;
subscribe to multicast groups on interface lan1
udpxy and udpxrec are Copyright (C) 2009 Pavel V. Cherenkov and licensed under GNU GPLv3
Единственный обязательный параметр - номер порта, на котором udpxy будет принимать соединения от клиентов. В соответствии с идеологией FreeBSD определим все необходимые для запуска приложения параметры, используя файл /etc/rc.conf (или /etc/rc.conf.local или /etc/conf.d/udpxy):
udpxy_enable="YES"
udpxy_flags="-S -a wlan0 -m vge0 -M 300"
Где:
- wlan0 - беспроводной интерфейс для обслуживания домашней сети
- vge0 - ethernet интерфейс подключения к провайдеру
Запустим приложение:
# /usr/local/etc/rc.d/udpxy start
Starting udpxy.
# /usr/local/etc/rc.d/udpxy status
udpxy is running as pid 4561.
Проверим, что udpxy слушает на нужных интерфейсах и портах:
# netstat -an | grep LISTEN | grep 4022
tcp4 0 0 10.1.1.1.4022 *.* LISTEN
Статистику использования и активные подключения можно увидеть, если открыть в браузере ссылку:
http://10.1.1.1:4022/status

На это настройка серверной части закончена.
На стороне клиента необходимо установить медиапроигрыватель, подерживающий потоковое воспроизведение с использованием HTTP протокола. Я использую vlc и mplayer. Перед тем как загрузить плейлист IPTV, полученный у провайдера, его необходимо преобразовать. В оригинальном плейлисте присутствуют адреса, протоколы и порты провайдера, которые необходимо заменить на локальный адрес домашнего роутера, используя нехитрый однострочник:
$ sed 's|^udp://@|http://10.1.1.1:4022/udp/|' channels.m3u > new-channels.m3u
Открываем преобразованный плейлист, выбираем канал и смотрим:


Просмотр потока с использованием HTTP менее чувствителен к задержкам и потерям, что позволяет смотреть телевизионные каналы гораздо более комфортно.