Донецкий техникум промышленной автоматики

Управление приставкой DirecTV (STB) через сеть

  1. Резюме
  2. Perl Script
  3. Альтернативный скрипт
  4. Документация


имя = безымянный автор = веб-страница Lionsnob = нет коротких = длинный сменщик каналов DirectTV = Perl-скрипт для смены каналов на приставках DirectTV с помощью веб-интерфейса. file = directtv_http.pl category = Поддержка сценариев изменения канала = S21: не установлено, S22: не установлено, S23: не установлено, S231: не установлено, S24: не установлено, S241: не установлено, S25: не установлено, S251: не установлено, S252: не установлено, S26: снята с охраны, S27: снята с охраны, S28: снята с охраны, S29 незадана

Author Lionsnob Описание Perl-скрипт для смены каналов на приставках DirectTV с помощью веб-интерфейса. опоры

Резюме

Некоторые приставки DirecTV теперь разрешают определенные операции через HTTP-сервер DirecTV через порт 8080. Один из примеров - H23. Чтобы это работало, приставка должна быть подключена к сети.

Документация в интернете в настоящее время отсутствует, но в настоящее время можно сменить канал и собрать текущую (настроенную) информацию о канале. Прикрепленный скрипт perl позволяет пользователям изменять канал или собирать данные текущего канала. Приставка DirecTV всегда возвращает данные в формате JSON.

Perl Script

В приложении моя первая трещина в сценарии. Я довольно зеленый в Perl, так что это довольно много, но это работает. Скрипт принимает следующие аргументы:

Всегда сначала указывайте IP-адрес получателя. Затем введите количество секунд для сна после смены канала. Затем введите «tune», чтобы изменить канал, или «getTuned», чтобы отобразить JSON для текущего списка. Если вы выбрали «tune», введите номер канала.

В Ubuntu установите JSON следующим образом:

$ sudo apt-get install libjson-perl directtv_http.pl
#! / usr / bin / perl use LWP :: UserAgent; использовать JSON; #use строгий; # Получить время для регистрации, если необходимо # ($ sec, $ min, $ hour, $ mday, $ mon, $ year, $ wday, $ yday, $ isdst) = localtime (time); # $ год = $ год + 1900; # $ mon = $ mon + 1; $ ua = LWP :: UserAgent-> new; $ ua-> agent ("$ 0 / 0.1". $ ua-> agent); # $ ua-> agent ("Mozilla / 8.0") # представьте, что мы очень способный браузер # Если вы хотите регистрировать результаты изменения канала, # раскомментируйте строки, которые выглядят следующим образом: ## print MYFILE ("$ year .. . ## close (MYFILE); # Как и строки в начале этого скрипта, которые выглядят следующим образом: # Получите время для регистрации, если необходимо ## ($ sec, $ min, $ hour, $ mday, $ mon, $ year, $ wday, $ yday, $ isdst) = localtime (время); ## $ year = $ year + 1900; ## $ mon = $ mon + 1; # А также файл для регистрации ниже. Измените путь к чему-то, что # имеет смысл ... #open (MYFILE, '>> / home / steve / Documents / dtvchangerdata.txt'); # получить аргументы $ dtv_ip = $ ARGV [0]; $ sleep_sec = $ ARGV [1 ]; $ arg = $ ARGV [2]; $ chan_num = ""; $ numArgs = $ # ARGV + 1; $ tune = 1; $ minor = 0; if ($ numArgs == 0) {print "(10) Ошибка: нет аргументов командной строки \ n "; выход 1;} if ($ arg eq" getTuned ") {$ tune = 0;} elsif ($ arg eq" tune ") {if (($ ARGV [3] = ~ m / - /) == 1) {@chan_arr = split (/ - /, $ ARGV [3]); $ chan_num = $ chan_arr [0]; $ minor = $ chan_arr [1];} else {$ chan_num = $ ARGV [3];} $ мелодия = 1; } else {print "(20) Ошибка: неверный аргумент командной строки \ n"; выход 1; } $ url = 'http: //'.$dtv_ip.': 8080 / tv / tune? major = '. $ chan_num; if ($ tune == 0) {$ url = 'http: //'.$dtv_ip.': 8080 / tv / getTuned '; } if ($ minor! = 0) {$ url = 'http: //'.$dtv_ip.': 8080 / tv / tune? major = '. $ chan_num.' & minor = '. $ minor; } $ req = HTTP :: Request-> new (GET => $ url); $ req-> header ('Accept' => 'text / html'); $ i = 0; while ($ i <21) {# отправить запрос $ res = $ ua-> запрос ($ req); # проверить результат, если ($ res-> is_success) {#print $ res-> content. &quot;\ n"; $ json = новый JSON; $ json_text = $ json-> decode ($ res-> content); $ check_ok = $ json_text -> {status} -> {msg}; #print "ОК?". $ check_ok. "\ П"; if (index ($ check_ok, "OK")! = -1) {if ($ tune == 0) {print $ res-> content. "\ П"; } #print "Здесь 1 \ n"; sleep $ sleep_sec; #print "Here 2 \ n"; #print MYFILE ("$ year- $ mon- $ mday $ hour: $ min: $ sec, chan $ chan_num: $ i failures \ n"); #close (MYFILE); выход 0; } else {print "(30) Error:". $ check_ok. "\ П"; #print MYFILE ("$ year- $ mon- $ mday $ hour: $ min: $ sec, chan $ chan_num: сбои $ i, (30) ошибка". $ check_ok. "\ n"); #close (MYFILE); выход 1; }} $ i ++; if ($ i> = 20) {print "(40) Error:". $ res-> status_line. "\ П"; #print MYFILE ("$ year- $ mon- $ mday $ hour: $ min: $ sec, chan $ chan_num: сбои $ i, (40) ошибка". $ res-> status_line. "\ n"); #close (MYFILE); выход 1; }} #print MYFILE ("$ year- $ mon- $ mday $ hour: $ min: $ sec, chan $ chan_num: $ i сбои. Как я сюда попал? \ n"); #close (MYFILE); выход 1;

Альтернативный скрипт

Используя оригинальный сценарий directv.pl в качестве схемы, приведенный ниже сценарий был создан для использования всех доступных функций сетевого интерфейса. Он был протестирован на оборудовании H20, H21 и HR22. Он должен работать с дополнительными моделями, но нуждается в дальнейшем тестировании.

Основное использование: directv_http.pl ip xxxx команда ...

  • Обновлено 18.09.12 для исправления незначительной ошибки с клавишами вверх и вниз по каналу
  • Обновленный Джеймсом МакЛареном 3/3/15, чтобы позволить управлять коробками мини джина, а также сервером (см. $ Clientaddr)
$ Clientaddr = "XXXXXXXXXXXX"; где XXXXXXXXXXXX - это MAC-адрес мини-джина без двоеточий. ДОЛЖНЫ ИСПОЛЬЗОВАТЬ CAPS в MAC-АДРЕСЕ $ clientaddr = "0" для сервера
  • Обновлено Alarson 14.06.16.
    • Не указывайте поле URL "clientAddr", если оно не задано в коде perl.
    • Предоставьте некоторые диагностические сообщения, чтобы помочь отладить неправильные конфигурации DTV.
    • Незначительная очистка кода.
directv_http.pl
#! / usr / bin / perl # # Copyright (c) 2011 Paul Sands <usg990a at cebridge.net> # # Настоящим предоставляется бесплатное разрешение любому лицу, получающему копию # этого программного обеспечения и связанных файлов документации ( "Программное обеспечение"), чтобы иметь дело с # в Программном обеспечении без ограничений, включая без ограничения права # на использование, копирование, изменение, объединение, публикацию, распространение, сублицензирование и / или продажу # копий Программного обеспечения, а также на разрешение лиц Кому предоставляется Программное обеспечение для выполнения следующих условий: # Указанное выше уведомление об авторском праве и это уведомление о разрешении должны быть включены во все копии или существенные части Программного обеспечения. # # ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПРЕДОСТАВЛЯЕТСЯ «КАК ЕСТЬ», БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, ЯВНЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЯ ГАРАНТИЙ ТОВАРНОГО ТОВАРА, # ПРИГОДНОСТЬ ДЛЯ ОСОБЫХ ЦЕЛЕЙ И НЕЗАКРЕПЛЕНИЙ. НИ ПРИ КАКИХ ОБСТОЯТЕЛЬСТВАХ НЕ ДОЛЖНЫ ОТВЕТИТЬ АВТОРЫ ИЛИ АВТОРСКИЕ ПРАВА ЗА ЛЮБЫЕ ПРЕТЕНЗИИ, УЩЕРБ ИЛИ ДРУГОЕ # ОТВЕТСТВЕННОСТЬ, В СООТВЕТСТВИИ С ДЕЙСТВИЕМ КОНТРАКТА, ИСПОЛЬЗОВАНИЯ ИЛИ ИНОГО В ПРОИЗВОДСТВЕ, ИЛИ В СВЯЗИ С ПРОГРАММНЫМ ОБЕСПЕЧЕНИЕМ ИЛИ ИСПОЛЬЗОВАНИЕМ ИЛИ СДЕЛКИ В # ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ. # # directv_http.pl: Сетевое управление устройством DirecTV через http # На основе сценария directv.pl, поддерживаемого Дэвидом Гессвайном <djg at pdp8online.com> # на http://www.pdp8online.com/directv/directv.shtml # Технический справочник: DTV-MD-0359-DIRECTV SHEF Public Beta Command Set-V1.0.pdf # # Я не несу ответственности за любой ущерб, который может причинить этот скрипт. # Не стесняйтесь изменять и распространять это по своему усмотрению, но, пожалуйста, сохраните # комментарии выше. # # URL "info / getOptions" в dtv показывает поддерживаемые строки запроса, # включая все поддерживаемые поля для каждого из них. использовать Switch; использовать LWP :: UserAgent; использовать JSON; # use Data :: Dumper; # Используется только для отладки. # Установить номер версии скрипта $ version = "1.1"; # Установить клиент addr # $ clientaddr = "XXXXXXXXXXXX"; $ Clientaddr = ""; # Используя "/ info / getLocations", можно было бы указать # клиентские адреса, используя имена клиентских ящиков, например, # clientAddr = "BEDROOM". # IP-адрес DTV. По умолчанию не указан IP-адрес, если он явно не задан в командной строке. $ dtv_ip = ""; Определите новый сеанс и инициализируйте его. $ ua = LWP :: UserAgent-> new; $ ua-> agent ("$ 0 / 0.1". $ ua-> agent); # Установите время ожидания по умолчанию на 2 секунды (останавливает медленный ответ, если приемник DirecTV выключен) $ ua-> timeout (2); # Сопоставить команды для выполнения функции. # last_param обрабатывается в основной программе. % cmds = ("on" => \ & on, "off" => \ & off, "reboot" => \ & reboot, "ip" => \ & ip, "get_channel" => \ & get_channel, "get_signal" => \ & get_signal, "get_systemtime" => \ & get_systemtime, "get_systemversion" => \ & get_systemversion, "key" => \ & key, "serial" => \ & serial, "delay" => \ & delay, "version" => \ & version, "использование" => \ & использование,); # Определите ключи, которые поддерживает скрипт% keymap = (power => "power", poweron => "poweron", poweroff => "poweroff", format => "format", pause => "pause", rew => " rew ", replay =>" replay ", stop =>" stop ", advance =>" advance ", ffwd =>" ffwd ", record =>" record ", play =>" play ", guide =>" guide ", active =>" active ", list =>" list ", exit =>" exit ", back =>" back ", menu =>" menu ", info =>" info ", up =>" up " , вниз => «вниз», влево => «влево», вправо => «вправо», выберите => «выбрать», красный => «красный», зеленый => «зеленый», желтый => «желтый», blue => "blue", ch_up => "chanup", ch_dn => "chandown", prev => "prev", 0 => "0", 1 => "1", 2 => "2", 3 => «3», 4 => «4», 5 => «5», 6 => «6», 7 => «7», 8 => «8», 9 => «9», тире = > "тире", "-" => "тире", ввод => "ввод"); # Заменить аргумент last_param последним параметром в командной строке. # Последний параметр затем удаляется. for ($ i = 0; $ i <$ # ARGV; $ i ++) {if ($ ARGV [$ i] eq "last_param") {$ ARGV [$ i] = $ ARGV [$ # ARGV]; $ # ARGV = $ # ARGV - 1; прошлой; }} if ($ # ARGV <0) {use (); } # Просмотрите все аргументы, передаваемые в командной строке, в то время как ($ # ARGV> = 0) {if (определено ($ sub = $ cmds {$ ARGV [0]}))) {shift @ARGV; & $ К югу; } else {if ($ ARGV [0] == 0) {use (); die "\ nCommand $ ARGV [0] не найден \ n"} change_channel ($ ARGV [0]); shift @ARGV; }} выход 0; # Дайте пользователю синтаксис для использования сценария sub use {print "Usage: $ 0 ip xxxx command ... \ n"; вывести «Команды: \ n»; вывести «version - показать версию программы \ n»; выведите «ip xxxx - IP-адрес коробки - ОБЯЗАТЕЛЬНО \ n»; print "должна быть первой командой \ n"; выведите «on - turn box on \ n»; выведите «off - off box off \ n»; выведите «reboot - hard reboot (reset) - ПРЕДУПРЕЖДЕНИЕ. Требуется ручная повторная активация управления сетью \ n»; выведите «delay number - подождите несколько секунд. Плавающая точка действительна \ n»; print "number {-number} - изменить на указанный канал-подканал \ n"; print "должна быть последней командой \ n"; напечатайте "\ n"; print "get_channel - напечатать текущий канал \ n"; print "get_systemtime - вывести дату и время (добавить эпоху для возврата в формате эпохи) \ n"; print "get_signal - вывести силу сигнала \ n"; напечатать "ключ {ключ} - отправить ключ получателю \ n"; выведите «enter»; напечатайте chr (34); вывести «ключ справки»; напечатайте chr (34); напечатать "для списка доступных ключей \ n"; print "serial - обрабатывать шестнадцатеричную закодированную последовательную команду (только шестнадцатеричная; нет необходимости в 0x) \ n"; напечатайте "\ n"; } # Предоставить текст справки для ключей, поддерживаемых сценарием. Sub keyhelp {print "Usage: $ 0 ip xxxx key {key} \ n"; напечатайте "\ n"; выведите «Действительные ключи: \ n»; выведите «Receiver Power - power, poweron, poweroff \ n»; выведите «Изменить формат вывода - формат \ n»; распечатать «Воспроизведение Live TV / DVR - пауза, перемотка, воспроизведение, остановка, продвижение вперед, ffwd, запись, воспроизведение \ n»; печать «Интерактивное ТВ - гид, активный, список \ n»; распечатать «Навигация - вверх, вниз, влево, вправо, назад, меню, выход, информация, выберите \ n»; печать «Избранное - красный, зеленый, желтый, синий \ n»; print "Канал - chanup, chandown, prev \ n"; выведите «Numbers - 0-9, тире (или -), введите \ n»; напечатайте "\ n"; } sub на {require_ip (); my $ url = 'http: //'.$dtv_ip.': 8080 / remote / processKey? key = poweron'.client_addr ('&'); $ status = send_req ($ url); #my $ key_rcv = $ json_text -> {key} if ($ status == 0); #print "$ key_rcv \ n" if ($ status == 0); выход $ status} sub off {require_ip (); my $ url = 'http: //'.$dtv_ip.': 8080 / remote / processKey? key = poweroff'.client_addr ('&'); $ status = send_req ($ url); #my $ key_rcv = $ json_text -> {key} if ($ status == 0); #print "$ key_rcv \ n" if ($ status == 0); exit $ status} sub reboot {require_ip (); my $ url = 'http: //'.$dtv_ip.': 8080 / serial / processCommand? cmd = 0xf7'.client_addr ('&'); $ status = send_req ($ url); # Команда выполняется без ответа обратно на скрипт exit $ status} sub ip {$ dtv_ip = $ ARGV [0]; shift @ARGV; } sub get_channel {require_ip (); my $ url = 'http: //'.$dtv_ip.': 8080 / tv / getTuned'.client_addr ('?'); $ status = send_req ($ url); my $ chan = $ json_text -> {major} if ($ status == 0); if ($ status == 0) {print "$ chan \ n"; } else {print "Когда доступ запрещен, на вашем DTV попробуйте: Menu-> System Setup-> Whole-Home-> External Device, установите для" Current Program "значение" Allow ". \ n"; } exit $ status} sub serial {require_ip (); my $ url = 'http: //'.$dtv_ip.': 8080 / serial / processCommand? cmd = FA '. $ ARGV [0] .client_addr (' & '); $ status = send_req ($ url); my $ ser = $ json_text -> {return} -> {data} if ($ status == 0); выведите «$ ser \ n» if ($ status == 0); выведите «$ url \ n» if ($ status == 1); exit $ status} sub get_signal {require_ip (); my $ url = 'http: //'.$dtv_ip.': 8080 / serial / processCommand? cmd = FA90'.client_addr ('&'); $ status = send_req ($ url); my $ signal = $ json_text -> {return} -> {data} if ($ status == 0); $ signal = hex ($ signal) if ($ status == 0); выведите «$ signal \ n» if ($ status == 0); exit $ status} sub get_systemtime () {require_ip (); # Предположим, что мы не хотим возвращать время из эпохи, если только заданная командная строка не переопределит my $ epoch = $ ARGV [0] eq "epoch"; # Согласно "/ info / getOptions" на H24, clientAddr не является допустимым полем для "getVersion". my $ url = 'http: //'.$dtv_ip.': 8080 / info / getVersion '; # .Client_addr ( '?'); $ status = send_req ($ url); my $ systime = $ json_text -> {systemTime}; if (! $ epoch == 1) {$ systime = скалярное местное время ($ systime)}; выведите «$ systime \ n» if ($ status == 0); exit $ status} sub get_systemversion () {require_ip (); # Согласно "/ info / getOptions" на H24, clientAddr не является допустимым полем для "getVersion". my $ url = 'http: //'.$dtv_ip.': 8080 / info / getVersion '; # .Client_addr ( '?'); $ status = send_req ($ url); my $ sysversion = $ json_text -> {version} if ($ status == 0); выведите «$ sysversion \ n» if ($ status == 0); exit $ status} sub key () {#if (shift (@ARGV) eq "help") {if (@ARGV = ~ / help /) {keyhelp (); } else {send_key (shift (@ARGV)); }} sub delay {select (undef, undef, undef, $ ARGV [0]); shift @ARGV; } sub version {print "Версия сценария $ version \ n"; } sub change_channel () {require_ip (); my ($ chan_major, $ chan_sub) = split / - /, @ _ ​​[0]; my $ url = 'http: //'.$dtv_ip.': 8080 / tv / tune? major = '. $ chan_major.client_addr (' & '); $ url = $ url. '& minor ='. $ chan_sub if ($ chan_sub ne ""); $ status = send_req ($ url); if ($ status! = 0) {print "Когда доступ запрещен, попробуйте на DTV: Menu-> System Setup-> Whole-Home-> External Device, установить для параметра" External Access "значение" Allow ". \ n"; } exit $ status} sub send_key () {require_ip (); мой $ url; мой $ ky; my @keys = split / /, @ _ ​​[0]; foreach $ ky (@keys) {my $ key = $ keymap {$ ky}; die "Неизвестный ключ $ ky \ n" if (!fined ($ key)); $ url = 'http: //'.$dtv_ip.': 8080 / remote / processKey? key = '. $ key.client_addr (' & '); $ status = send_req ($ url); }} sub send_req () {my ($ url) = @_; # print $ url. "\ n"; мой $ parent = (caller (1)) [3]; $ parent = ~ s / main :: // g; $ req = HTTP :: Request-> new (GET => $ url); $ req-> header ('Accept' => 'text / html'); $ res = $ ua-> request ($ req); # print "\ n" .Dumper ($ res); #sleep $ delay_sec if ($ delay> 0); if ($ res-> is_success) {$ json = new JSON; $ json_text = $ json-> decode ($ res-> content); $ check_ok = $ json_text -> {status} -> {msg}; if (($ check_ok eq "OK.") || ($ check_ok eq "OK")) {return 0; #}} else {print "Failed! \ n"; возврат 1; }} else {print "Failed! \ n"; возврат 1; }} # Возвращает строку для указания поля URL-адреса clientAddr. # разделитель должен быть либо "?" если clientAddr является первым полем URL, в противном случае "&". sub client_addr () {my ($ seperator) = @_; # Если clientaddr не заполнено, не включать поле вообще. return "" if ($ clientaddr == ""); вернуть $ seperator. "clientAddr =". $ Clientaddr; } # Выход с ошибкой, если IP-адрес не указан. sub require_ip () {return if $ dtv_ip ne ""; использование(); напечатайте "IP-адрес не указан \ n"; выход 1; }

Документация

Я нашел официальную документацию в формате PDF. Здесь: http://www.sbcatest.com/TechUpdates/DTV-MD-0359-DIRECTV%20SHEF%20Public%20Beta%20Command%20Set-V1.0.pdf Он включает команды и ответы для функций цифрового видеорегистратора и телевизора и даже способ эмулировать нажатия кнопок на пульте дистанционного управления.

Похожие

Что такое НОК? Введение в управление сетевым центром управления
Не знаете, что такое Центр сетевых операций (NOC), что он делает или как он связан со службами удаленного мониторинга и управления? Хорошие новости! Вы пришли в нужное место ... NOC (произносится как слово «стук») означает «центр
Tv / tune?
Tv / tune?
Quot;\ n"; $ json = новый JSON; $ json_text = $ json-> decode ($ res-> content); $ check_ok = $ json_text -> {status} -> {msg}; #print "ОК?
Как я сюда попал?
Remote / processKey?
Remote / processKey?
Serial / processCommand?
Serial / processCommand?
Serial / processCommand?
Tv / tune?