приставка mag250

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

приставка mag250

Сообщение directman66 » Пт июн 30, 2017 6:33 am

Из недр приложениея 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" //Двухсимвольное обозначение языка
}
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

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

Сообщение dmw » Пт июн 30, 2017 8:18 am

Это для какой прошивки? Заводской от Инфомира или Ростелекомовской?

И вот это:
directman66 писал(а):Шифрование производится по алгоритму AES-256-CBC...
Каждая команда шифруется!...
Из описания не ясно как получить ключи. Или я не внимательно прочитал?
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

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

Сообщение directman66 » Пт июн 30, 2017 12:57 pm

Протокол взял из приложения для андройд, полагаю оно работает со всеми прошивками.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

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

Сообщение directman66 » Ср дек 13, 2017 10:54 pm

Пока у меня руки не дошли, но вроде протокол ничего сложного не представляет. Вообще народу интересна эта тема? Что нам в итоге даёт цифровой пульт? Мне бы картинку с приставки получать.
За это сообщение автора directman66 поблагодарили (всего 2):
dimavoron (Чт дек 14, 2017 10:40 am) • chimik (Пт дек 15, 2017 12:42 am)
Рейтинг: 2.33%
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
dimavoron
Сообщения: 24
Зарегистрирован: Пт окт 13, 2017 10:58 am
Откуда: Воронеж
Благодарил (а): 13 раз
Поблагодарили: 2 раза

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

Сообщение dimavoron » Чт дек 14, 2017 10:39 am

Тема интересная, у меня тоже есть такая приставка, эта модель очень распространенная думаю многим пригодиться.
Алиса живет под Ubuntu 16.04 LTS
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

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

Сообщение directman66 » Пт дек 15, 2017 8:12 am

Может кто просканировать приставку и понять, какой порт она слушает? Мне приходится заниматься ковырянием в основном с работы, а доступ к железу есть только из морды мажордомо.

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

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

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

$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);
обновил немного сценарий
Последний раз редактировалось directman66 Пт дек 15, 2017 11:08 am, всего редактировалось 1 раз.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
dimavoron
Сообщения: 24
Зарегистрирован: Пт окт 13, 2017 10:58 am
Откуда: Воронеж
Благодарил (а): 13 раз
Поблагодарили: 2 раза

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

Сообщение dimavoron » Пт дек 15, 2017 9:51 am

Смогу после обеда глянуть
Алиса живет под Ubuntu 16.04 LTS
dmw
Сообщения: 469
Зарегистрирован: Вт мар 12, 2013 1:22 am
Благодарил (а): 41 раз
Поблагодарили: 81 раз

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

Сообщение dmw » Пт дек 15, 2017 11:24 am

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
(правда у меня альтернативная прошивка стоит)
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

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

Сообщение directman66 » Пт дек 15, 2017 11:33 am

У меня прошивка от планеты, в этой прошивке доступ к телнету я получить не смог. Провайдер явки пароли не дает ни при каких обстоятелствах.Если знаете как сбросить, с удовольствием сброшу. Стандартные инфомировские пароли не подходят. Другую прошивку ставить не могу, так как на их софте завязан отложенный просмотр.
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
directman66
Сообщения: 2801
Зарегистрирован: Пн дек 26, 2016 9:51 am
Откуда: Екатеринбург
Благодарил (а): 380 раз
Поблагодарили: 694 раза
Контактная информация:

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

Сообщение directman66 » Пт дек 15, 2017 11:41 am

Пришел какой-то ответ, видимо от приставок:

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


$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. Уже что-то!
Если вам помогло данное сообщение, не поленитесь нажать кнопку "спасибо".
CONNECT | Оборудование | Блог | Дополнения | Email | Telegram
Ответить