Linux - статьи

Практическое использование DVB технологий


Начнем конечно же с того, что все будет рассматриваться на примере построения в Linux и всеразличных инструментов, связанных с этой ОС. Не будем разбирать все по-детально, как это было в теоретическом свидетельстве, перейдем непосредственно к делу.

За основу мною был взят стандартный rpm-based дистрибутив, от корпорации RedHat - Fedora Core. Собственно, что стоит только выделить - в рассмотрение берутся диапазон ядер от 2.6.1 до 2.6.12 включительно (касательно более ранних ядер, то поддержка того устройства, что мы будем рассматривать - не имелась, для этого придется накладывать патч драйвера на ядро, взять который можно с сайта производителя www.linuxtv.org).

При конфигурировании ядра, в разделе "Драйвера Устройств" находим поддержку "Мультимедийные устройства", далее видим "DVB" и, естественно, выбираем, как и последующий пункт "DVB CORE" (только модулем!), здесь нам необходимо найти тип устройства (в данном случае карта "skystar2") - "B2C2/...". Затем устанавливаем поддержку "I2C" для чипсета нашей материнской платы (сделать это так же можно в основном разделе устройств).

На этом этапе все. Собираем ядро и загружаемся. Теперь при просмотре lspci замечаем нашу карту: Network controller: Techsan Electronics Co Ltd B2C2 FlexCopII DVB chip / Technisat SkyStar2 DVB card

Переходим к настройке собственно самой тарелки. Для начала необходимо создать dvb-устройство в системе (стандартным путем или же при помощи udev). Скрипт выглядит таким образом (уточню, что его необходимо поставить в автозагрузку): #!/bin/sh

if [ -e /dev/.devfsd ]; then exit 0 fi rm -rf /dev/dvb rm -rf /dev/dvb mkdir /dev/dvb chmod 755 /dev/dvb for i in `seq 0 3`; do mkdir /dev/dvb/adapter$i chmod 755 /dev/dvb/adapter$i mknod -m 0660 /dev/dvb/adapter$i/frontend0 c 212 `expr 64 \* $i + 3` mknod -m 0660 /dev/dvb/adapter$i/demux0 c 212 `expr 64 \* $i + 4` mknod -m 0660 /dev/dvb/adapter$i/net0 c 212 `expr 64 \* $i + 7` chown root.root /dev/dvb/adapter$i/* done


После этого необходимо скомпилировать утилиты для управления самой антенной. Взять их можно так же на сайте производителя http://www.linuxtv.org/downloads/linuxtv-dvb-apps-1.1.0.tar.bz2. Пригодятся лишь собранные бинарные файлы dvbnet (задача PID и соответственно включение broadcast) и szap (задача частоты параметра). Далее перекладываем их в /usr/local/bin и заносим значения частоты спутника, выданные провайдером, в файл /etc/channels.conf: 1:11056:h:0:20979:523:523:1

Теперь пишем следующий скрипт и так же помещаем его в автозагрузку, который будет отвечать за загрузку модулей с необходимыми параметрами и соответственно установку связи со спутником (здесь необходимо подставить параметры PID и MAC, которые у каждого свои и зависят от устройства, IP прописывается фэйковый, фактически любой): #!/bin/sh

DIR=/usr/local PID=PID DEV_NAME=dvb0_0 IP_ADDR=192.168.238.238 MAC_ADDR=MAC

cd $DIR/bin case "$1" in start)

/sbin/rmmod -f skystar2 >/dev/null 2>&1 /sbin/rmmod -f mt312 >/dev/null 2>&1 /sbin/rmmod -f dvb-core >/dev/null 2>&1 sh /root/.sh/dvb_0 /sbin/modprobe dvb-core dvb_shutdown_timeout=0 /sbin/modprobe mt312 /sbin/modprobe skystar2 $DIR/bin/szap -c /etc/channels.conf -n 1 -x $DIR/bin/dvbnet -p $PID /sbin/ifconfig $DEV_NAME $IP_ADDR /sbin/ifconfig $DEV_NAME hw ether $MAC_ADDR /etc/init.d/sat start

;;

stop)

/sbin/ifconfig $DEV_NAME down $DIR/bin/dvbnet -d 0 /sbin/rmmod -f skystar2 >/dev/null 2>&1 /sbin/rmmod -f mt312 >/dev/null 2>&1 /sbin/rmmod -f dvb-core >/dev/null 2>&1 /etc/init.d/sat stop ;;

restart) $0 stop $0 start ;; *) echo "Usage: `basename $0` start | stop | restart" ;;



esac

Небольшое пояснение: удаляем модули (при том именно со значением -f - форсированно, иначе какой-либо "зомби" может не дать перегрузить модули), затем применяем скрипт для создания dvb-устройства в системе, написанный выше, потом подгружаем модули (dvb-core обязательно со значением dvb_shutdown_timeout=0, за боле подробной информацией можно обратиться в документацию), после устанавливаем соединение со спутником (проверяем качество сигнала перед запуском скрипта, дабы убедиться, что все настроено верно - должно пройти 2 проверки и после этого szap закроется), устанавливаем PID при помощи dvbnet, создаем устройство сети с данными параметрами и применяем скрипт "sat", основные концепции которого будут приведены ниже.

Значит, соединение мы установили, связь со спутником налажена. Теперь осталось завершение и то, к чему шли - сам Интернет. Провайдер предлагает 3 вида соединения для передачи данных (VPN, GRE и IPIP туннели). С нашей стороны все они конечно же будут выполнять роль обратного канала. Не буду рассматривать первые два, в силу того, что VPN абсолютно не составляет нужды в использовании, из-за постоянных разъединений, как конечно же и большой цени за обмен пакетами, благодаря тому, на сколько активно отдаются пакеты, на столько же и принимаются (речь идет о наших ISP, я же использую ppp-соединение, путем ADSL), в итоге набегают немалые деньги (инициатива есть использовать только для тех, у кого нет внешнего IP). GRE и IPIP во многом идентичны, я же взял за построение последний метод.

Связываемся с тех. поддержкой нашего провайдера (путем ICQ или E-Mail) и просим на их стороне поднять на наш аккаунт IPIP туннель (не забудьте главное попросить еще предоставить внешний IP). После чего, выданные параметры заносим в следующий скрипт, которые и называется "sat": #! /bin/sh



IPIP_I_FACE=ipip1 EARTH_IP=x.x.x.x VPN_SRV_IP=x.x.x.x PS_IP=x.x.x.x PS_GRAY_SRV=192.168.102.x PS_GRAY_CLI=192.168.102.x EARTH_GW=x.x.x.x LOG=/var/log/ipip_log

start) echo "del ipip1 if exists" > $LOG /sbin/ip tunnel del $IPIP_I_FACE >> $LOG

echo "create new ipip tunnel" >> $LOG 2>&1 /sbin/ip tunnel add $IPIP_I_FACE mode ipip local $EARTH_IP remote $VPN_SRV_IP

echo " assign PS ip to tunnel interface">>$LOG ifconfig $IPIP_I_FACE $PS_GRAY_CLI netmask 255.255.255.255 >> $LOG 2>&1

echo "add route to gray tunnel IP" >> $LOG /sbin/ifconfig $IPIP_I_FACE:1 $PS_IP netmask 255.255.255.255 /sbin/ip route add $PS_GRAY_SRV/32 dev $IPIP_I_FACE >> $LOG 2>&1

echo "route to VPN-server via earth" >> $LOG /sbin/ip route add $VPN_SRV_IP via $EARTH_GW >> $LOG 2>&1

echo "delete currewnt default route" >> $LOG /sbin/ip route del default >> $LOG 2>&1

echo "route PS network via earth if needed" >> $LOG /sbin/ip route add 213.138.110.0/24 via $EARTH_GW src $EARTH_IP >> $LOG 2>&1

echo "setting up new default route" >> $LOG /sbin/ip route add default via $PS_GRAY_SRV >> $LOG 2>&1 ;; stop) /sbin/ifconfig ipip1 down ;; restart) $0 stop $0 start ;; *) echo "Usage: `basename $0` start | stop | restart" ;;

esac

Не думаю, что требуются какие-то обширные пояснения к скрипту, ибо, на мой взгляд, в нем подробно описан ход действий.

По окончанию, раскладываем все по директориями (в моем случае это /root/.sh) и запускаем, затем смотрим вывод в логах (рекомендую для начала по-детально изучить каждую из выполняемых команд). Далее, при просмотре ifconfig, должны увидеть устройства: "dvb0_0" "ipip1" и его алиас с внешним IP "ipip1:1". Просматриваем маршрутизацию, убеждаемся, что все в порядке, настраиваем NAT с заданным интерфейсом (-o ipip) и заворачиваем все через внешний IP (--to-source IP).

Есть еще один нюанс, так это то, что постоянно необходимо поддерживать связь со шлюзом, т.е. ~ каждые 15 секунд посылать пару пакетов, иначе при долгом застое просто на просто туннель падает с их стороны.

В общем-то и все, на настройке системы мы закончили, об установке самой тарелки позаботятся естественно люди, которые являются у нас поставщиками данных услуг, от администратора такие навыки не требуются.

Вывод, я думаю, вы сделаете сами, после того, как рационально оцените представленный вид передачи данных, за достаточно небольшую цену и вполне весомую скорость с неограниченным трафиком.


Содержание раздела