Страница 1 из 3

приставка mag250

Добавлено: Пт июн 30, 2017 6:33 am
directman66
Из недр приложениея magicremote пульта управления приставок mag245/250/wr320 выдернул протокол управления на будущее

В планах попробовать добавить управление этими приставками
СпойлерПоказать
Это регистрозависимый текстовый протокол.
Все передаваемые сообщения являются JSON объектами.

-------------------------------------------------------
Клиентское приложение при нажатии на клавишу поиска устройств в сети начинает отправлять 1 раз в секунду broadcast message на порт(<указать порт>) на протяжении всего времени поиска.
Формат сообщения:
----------------------------------------------
BroadcastMSG
----------------------------------------------
{
"protocol":"remote_stb_1.0" //название протокола
"port":6777 //порт
}

В свою очередь приставка слушает <указать порт> в ожидании сообщения(BroadcastMSG)
После каждого полученного такого сообщения приставка отправляет сообщение с информацией о себе на клиентское приложение(смартфон) на указанный в BroadcastMSG порт.

Структура объекта DeviceInfo
----------------------------------------------
DeviceInfo
----------------------------------------------
{
"msgType": "Info"
"name":"My Device A20" //имя устройства
"type":"MAG260-A20", //тип\модель устройства
"port": 7776, //порт, на котором устройство готово принимать комманды
"serialNumber":"23436478", //серийный номер устройства
"screenHeight":720, //Размер разрешения изображения устройства по вертикали в пикселях
"screenWidth":1280, //Размер разрешения изображения устройства по горизонтали в пикселях
"modes":["TOUCHSCREEN", "MOUSE", "KEYBOARD"] //массив строк. Имена режимов управления в которых устройство может работать
"protocolVersion":"1.0" //строка. Номер версии протокола
}


После опроса сети на наличие готовых для работы устройств(приставок) в клиентском приложении формируется список(приставок).
У пользователя есть возможность выбрать для управления одну из приставок.
После того как пользователь выбрал конкретную приставку для удаленного управления происходит этап авторизации.

Авторизация происходит при помощи процедуры - ping.
Перед началом отправки команд мобильное приложение посылает pingRequest объект на приставку и ожидает pingResponse.
Если расшифровать pingResponse, который пришел с приставки на мобильное приложение удалось - авторизация прошла успешно. Если не удалось, то мобильное приложение уведомляет об этом пользователя и блокирует возможность работы с выбранным устройством(приставкой).
На любое сообщение которое приставка не смогла расшифровать отправляется зашифрованный объект pingResponse.

Шифрование производится по алгоритму AES-256-CBC.
Если пользователь ввел пароль меньше необходимой длины ключа(исходя из требований алгоритма), то все недостающие символы заполняются нулями(null).


----------------------------------------------
pingRequest
----------------------------------------------
{
"msgType": "pingRequest"
}

----------------------------------------------
pingResponse
----------------------------------------------
{
"msgType": "pingResponse"
}

В случае удачной авторизации пользовательское приложение получает возможность предоставить пользователю функционал по управлению устройством.
Управление устройством(приставкой) осуществляется при помощи команд. Каждая команда - объект.
Каждая команда шифруется!

Список команд:
----------------------------------------------
Commands
----------------------------------------------
КАЖДЫЙ объект должен обязательно содержать поле - msgType.

----------------------------------------------
mouseMove
----------------------------------------------
//х,у значения сдвига мышки по оси Х и У соответственно
{
"msgType": "mouseMove"
"y":0,
"x":-50
}

{"msgType": "mouseMove", "y":0, "x":-50}

----------------------------------------------
keyboardKey
----------------------------------------------
http://code.metager.de/source/xref/andr ... Event.java
{
"msgType": "keyboardKey"
"metaState":0, //битовая маска зажатых клавиш(например: SHIFT+CTRL)
"keycode":20, //код клавиши
"unicode": "f" //название клавиши
"action": "press", "release" //строка. нажата\отжата клавиша(тип события)
}

----------------------------------------------
motion
----------------------------------------------
{
"msgType": "motion"
"action":0, //http://code.metager.de/source/xref/andr ... Event.java
"y":430,
"x":910
}

----------------------------------------------
mouseClick
----------------------------------------------
{
"msgType": "mouseClick"
button : "left", "right" //имя кнопки
"action": "press", "release" //строка. тип события
}

----------------------------------------------
mouseRoll
----------------------------------------------
{
"msgType": "mouseRoll"
"value": 5 //число. значение на которое осуществили скролл
"orientation": "horizontal", "vertical" //строка. тип скролла.
}

Так же принимающее устройство может запросить вызов клавиатуры на клиентском устройстве при помощи команды :
Это нужно например при попадании курсора в поле ввода.
----------------------------------------------
keyboardRequest
----------------------------------------------
{
"msgType": "keyboardRequest";
}

На каждую полученную команду "pingRequest" (вне зависимости от стороны) необходимо ответить командой pingResponse.
----------------------------------------------
pingRequest
----------------------------------------------
{
"msgType": "pingRequest"
}

----------------------------------------------
pingResponse
----------------------------------------------
{
"msgType": "pingResponse"
}

Устройство(приставка) может запросить смену языка ввода на мобильном приложении отправкой команды "setLanguage".
Если на мобильном устройстве такого языка не окажется - приложение должно уведомить об этом пользователя диалоговым окном и предложить установить необходимый язык ввода в системе.(если возможно).
----------------------------------------------
setLanguage
----------------------------------------------
{
"msgType": "setLanguage"
"value": "EN" //Двухсимвольное обозначение языка
}

Re: приставка mag250

Добавлено: Пт июн 30, 2017 8:18 am
dmw
Это для какой прошивки? Заводской от Инфомира или Ростелекомовской?

И вот это:
directman66 писал(а):Шифрование производится по алгоритму AES-256-CBC...
Каждая команда шифруется!...
Из описания не ясно как получить ключи. Или я не внимательно прочитал?

Re: приставка mag250

Добавлено: Пт июн 30, 2017 12:57 pm
directman66
Протокол взял из приложения для андройд, полагаю оно работает со всеми прошивками.

Re: приставка mag250

Добавлено: Ср дек 13, 2017 10:54 pm
directman66
Пока у меня руки не дошли, но вроде протокол ничего сложного не представляет. Вообще народу интересна эта тема? Что нам в итоге даёт цифровой пульт? Мне бы картинку с приставки получать.

Re: приставка mag250

Добавлено: Чт дек 14, 2017 10:39 am
dimavoron
Тема интересная, у меня тоже есть такая приставка, эта модель очень распространенная думаю многим пригодиться.

Re: приставка mag250

Добавлено: Пт дек 15, 2017 8:12 am
directman66
Может кто просканировать приставку и понять, какой порт она слушает? Мне приходится заниматься ковырянием в основном с работы, а доступ к железу есть только из морды мажордомо.

Широковещательный пакет отправляю сценарием:

СпойлерПоказать

Код: Выделить всё

$ip = "255.255.255.255";
$port = 6777;

//$str  = "protocol:remote_stb_1.0\r\n";
//$str .= "port:6777\r\n";

$arr=array('protocol'=>'remote_stb_1.0','port'=>6777);
print_r($arr);
echo "<br>";
$post_data = json_encode($arr);
echo $post_data;

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
socket_sendto($sock, $post_data, strlen($post_data), 0, $ip, $port);

while(true) {
  $ret = @socket_recvfrom($sock, $buf, 20, 0, $ip, $port);
  if($ret === false) break;
  echo "Messagge : < $buf > , $ip : $port <br>";
}

socket_close($sock);
обновил немного сценарий

Re: приставка mag250

Добавлено: Пт дек 15, 2017 9:51 am
dimavoron
Смогу после обеда глянуть

Re: приставка mag250

Добавлено: Пт дек 15, 2017 11:24 am
dmw
directman66 писал(а):Может кто просканировать приставку и понять, какой порт она слушает?
А че ее сканировать то?
Заходиш через ssh и смотриш:

Код: Выделить всё

# netstat -ltun
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:8282            0.0.0.0:*               LISTEN
netstat: no support for 'AF INET6 (tcp)' on this system
udp        0      0 233.99.61.33:5000       0.0.0.0:*
udp   104512      0 0.0.0.0:137             0.0.0.0:*
udp        0      0 0.0.0.0:6000            0.0.0.0:*
udp        0      0 0.0.0.0:7666            0.0.0.0:*
netstat: no support for 'AF INET6 (udp)' on this system
(правда у меня альтернативная прошивка стоит)

Re: приставка mag250

Добавлено: Пт дек 15, 2017 11:33 am
directman66
У меня прошивка от планеты, в этой прошивке доступ к телнету я получить не смог. Провайдер явки пароли не дает ни при каких обстоятелствах.Если знаете как сбросить, с удовольствием сброшу. Стандартные инфомировские пароли не подходят. Другую прошивку ставить не могу, так как на их софте завязан отложенный просмотр.

Re: приставка mag250

Добавлено: Пт дек 15, 2017 11:41 am
directman66
Пришел какой-то ответ, видимо от приставок:

Код: Выделить всё


$ip = "255.255.255.255";
$host = "192.168.1.35";
$port = 6777;
$rport  = 7666;
//$str .= "port:6777\r\n";

$arr=array('protocol'=>'remote_stb_1.0','port'=>6777);
print_r($arr);
echo "<br>";
$post_data = json_encode($arr);
echo $post_data;
echo "<br>";
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); 
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
socket_sendto($sock, $post_data, strlen($post_data), 0, $ip, $rport);



$response = array();
        do {
            $buf = null;
    @socket_recvfrom($sock, $buf, 1024, MSG_WAITALL, $host, $port);

            if (!is_null($buf)) {
$response[] =$buf;
$hex=bin2hex ($buf);
             
$decript=decript($buf, $password);
         
//  echo "<br>Messagge : < $buf > , hex: < $hex > , decript < $decript >  $host : $port <br>";                         
echo "<br>Messagge : < $buf > , decript < $decript >  $host : $port <br>";                                     
            }
        } while (!is_null($buf));


echo "<br>";
echo $response;
echo "<br>";
print_r($response);
/////////////////
echo "<br>---------------------<br>";
echo "pingRequest $host <br>";

$arr=array('msgType'=>'pingRequest');
print_r($arr);
echo "<br>";
$post_data = json_encode($arr);
echo $post_data;


socket_sendto($sock, $post_data, strlen($post_data), 0, $host, $rport);



$response = array();
        do {
            $buf = null;
    @socket_recvfrom($sock, $buf, 1024, MSG_WAITALL, $host, $port);

            if (!is_null($buf)) {
$response[] =$buf;
$hex=bin2hex ($buf);
$decript=decript($buf, $password);
         
//  echo "<br>Messagge : < $buf > , hex: < $hex > , decript < $decript >  $host : $port <br>";                         
echo "<br>Messagge : < $buf > , decript < $decript >  $host : $port <br>";                                     
            }
        } while (!is_null($buf));


echo "<br>";
echo $response;
echo "<br>";
print_r($response);



socket_close($sock);


echo "<br>---------------------<br>";
echo "<br>---------------------<br>";

$password = '3sc3RLrpd17';
$password = substr(hash('sha256', $password, true), 0, 32);



$phrase="тестовая фраза";
$dphrase=decript($phrase,$password);
$ephrase=encript($phrase,$password);
echo "<br>$phrase :::: $dhrase :::: $ephrase <br>";







function decript($phrase, $password){
$method = 'aes-256-cbc';
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
$encrypted = base64_encode(openssl_encrypt($phrase, $method, $password, OPENSSL_RAW_DATA, $iv)); 
 return $encrypted;
}

function encript($phrase, $password){
$method = 'aes-256-cbc';
$iv = chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0) . chr(0x0);
$decrypted = openssl_decrypt(base64_decode($phrase), $method, $password, OPENSSL_RAW_DATA, $iv);
 return $decrypted;
}
 

получили ответ от приставок, но формат ответа непонятен

Код: Выделить всё

Messagge : < �6R�V�3�b(d`���i�;����R-�T� > , 192.168.1.218 : 7666 
Messagge : < �6R�V�3�b(d`���i�;����R-�T� > , 192.168.1.36 : 7666

Код: Выделить всё

На любое сообщение которое приставка не смогла расшифровать отправляется зашифрованный объект pingResponse. 
Видимо мы получаем зашифрованный PingResponce. Уже что-то!