[Модуль] Broadlink HTTP Bridge (dev_httpbrige) Устарело!

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение corpse » Сб ноя 05, 2016 11:13 pm

secbit писал(а): В том то и дело, что товарищ по этой ссылке http://4pda.ru/forum/index.php?showtopi ... ry51074568, сделал простое консольное приложение, которое при отсылке пакета, каждый раз срабатывает! А не через раз. Там есть исходник на C#, все что в нем делается программа, это пингует неправильными пакетами в начале, чтоб разбудить устройство, а потом отсылает правильный пакет, но то же самое воспроизвести не выходит почему-то, пытался ему писать, но ответа нет к сожалению.
Вся загвоздка как я понял с этими всеми костылями, в виде бриджей, это то, что команды шифруются AES шифром, поэтому и приходятся только так, если я не ошибаюсь.
Если использовать из Мажордомо вызов этого консольного приложения с параметрами, можно собственно прикрутить таким образом рабочий вариант, я пробовал, работает.
Если это тот товарищ, о котором я думаю, то там логика была такая - он отправлял на бродлинк несуществующий код, а затем отправлял нужный ему код. Несуществующий - это валидный код для бродлинка, насколько я понимаю, но тот код, который вызывает действие, на которое не срабатывает ни одно его устройство. Например, ик код включения телевизора, которого физически у этого человека нет. Если я конечно, правильно всё понял. Либо он отправляет каким-то образом модифицированный код, который не приводит вообще к выполнению какого-либо действия. Это не лучший вариант на мой взгляд, потому что на обработку этого "левого" кода тратится некоторое время, то есть, паузы между отправкой валидных и полезных кодов будут больше. Единственная проблема - это то, что нельзя отправлять код, идентичный отправленному. Поэтому я записываю два валидных кода на одно и то же действие и отправляю их по очереди. Фактически, у меня работает каждый отправленный код. А вот по той логике, что описываешь ты, код как раз работает через раз. Шлётся по очереди один валидный, один невалидный.

По поводу шифрования - никаким aes шифром тут и не пахнет. Потому как два кода для одного и того же действия отличаются двумя парами байт. Если бы код был зашифрован, то он отличался бы полностью, кроме каких-то определённых заголовков. Так что шифрования тут нет. Закономерности изменения тех двух байт я пытался выявить, но не преуспел в этом.

Мой вариант так же можно будет прикрутить консольно. Либо через апи, это лишь вопрос времени.
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение secbit » Вс ноя 06, 2016 12:26 am

corpse писал(а): Если это тот товарищ, о котором я думаю, то там логика была такая - он отправлял на бродлинк несуществующий код, а затем отправлял нужный ему код. Несуществующий - это валидный код для бродлинка, насколько я понимаю, но тот код, который вызывает действие, на которое не срабатывает ни одно его устройство. Например, ик код включения телевизора, которого физически у этого человека нет. Если я конечно, правильно всё понял. Либо он отправляет каким-то образом модифицированный код, который не приводит вообще к выполнению какого-либо действия. Это не лучший вариант на мой взгляд, потому что на обработку этого "левого" кода тратится некоторое время, то есть, паузы между отправкой валидных и полезных кодов будут больше. Единственная проблема - это то, что нельзя отправлять код, идентичный отправленному. Поэтому я записываю два валидных кода на одно и то же действие и отправляю их по очереди. Фактически, у меня работает каждый отправленный код. А вот по той логике, что описываешь ты, код как раз работает через раз. Шлётся по очереди один валидный, один невалидный.

По поводу шифрования - никаким aes шифром тут и не пахнет. Потому как два кода для одного и того же действия отличаются двумя парами байт. Если бы код был зашифрован, то он отличался бы полностью, кроме каких-то определённых заголовков. Так что шифрования тут нет. Закономерности изменения тех двух байт я пытался выявить, но не преуспел в этом.

Мой вариант так же можно будет прикрутить консольно. Либо через апи, это лишь вопрос времени.
Не совсем верно.
У меня так же, я беру два кода верных и поочередно их отправляю, так работет и прямо в Majordomo, о чем я и писал, можно просто на PHP написать логику, что если прошлый раз использовался этот код, то в этот раз использовать вот этот. Но так можно допустим на включение ТВ или включение Увлажнителя по ИК, как я и делал. Но если к примеру переключать каналы, то естественно это не прокатывает.
А вот у PlusPlusPlus с 4PDA, работает как раз все очень даже хорошо, никаких задержек нет и работает куда быстрее, чем с e-Control, вообщем-то мгновенно работает, так же быстро работает, если вызывать эту программу из Mahordomo на PHP

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

$string="C:\\_majordomo\\apps\\broadlink\\packet1192.168.1.109";
shell_exec("C:\\_majordomo\\apps\\broadlink\\Command.exe$string"); 
Но вот повторить то же самое на PHP или чем-то другом, не выходит, я долго отслеживал пакеты с разными условиями, но все одинаково, почему не получается то же самое сделать на PHP, я не понимаю. Вообщем-то так работает нормально, но хотелось обойтись без костылей в виде сторонней программы.
Да, логика у него такая, отправляется левый пакет, но правильной структуры для того чтоб разбудить устройство, а затем отсылается нужный пакет.
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение corpse » Вс ноя 06, 2016 12:39 am

За сегодня:

протестировал работу с оффициальным приложением - кое-что подправил, теперь сканирует коды с e-Control так же, как с httpbridge
протестировал с MP1 (собственно то, ради чего всё в первую очередь затевалось) - работает, получается включать/выключать как отдельные розетки, так и все сразу
сделал возможность добавлять устройство как по айпишнику, так и по маку, в случае передачи айпишника, самостоятельно проводит arping и достаёт нужный мак
исправил несколько небольших косяков и оптимизировал код



Что в ближайших планах:
1. Возможность подгружать pcap дампы. Нашёл сниффер для андроид - sniffer15.4, можно найти в гуглплей. Сам пока ещё не тестировал, но планирую. Если всё получится, то сценарий будет следующий: запускаем сниффер, заходим в e-Control, нажимаем по очереди дважды все интересующие нас кнопки. Возвращаемся в сниффер, сохраняем дамп, дамп скармливаем моей утилите через cli, либо (в дальнейшем) загружаем через веб интерфейс. Приложение анализирует дамп, достаёт из него нужные пакеты и выдаёт список полученных действий в виде act1, act2, act3 и т.п., которые можно тут же запустить на выполнение, либо переименовать.
2. Передача параметров через командлайн. Примеры:

./esbl add 10.11.12.13
./esbl rename 10.11.12.13 rmpro
./esbl add 10.11.12.13 rmpro
./esbl rmpro scancodes
./esbl rmpro listcodes
./esbl rmpro exec act1
./esbl rmpro exec act1:act3:act4
./esbl rmpro rename act1 tvonoff
./esbl rmpro importdump lg_tv.pcap
./esbl rmpro export rmpro.bk
./esbl rmpro import rmpro.bk


Естественно, само приложение может работать на любом другом хосте, в случае, если ему передаётся дамп.
3. Апи с аналогичным функционалом.
4. Возможно, вебинтерфейс, вероятно на бутстрапе. Параллельно апи.

После доработки до пункта 2, можно будет уже пользоваться.
Последний раз редактировалось corpse Вс ноя 06, 2016 12:44 am, всего редактировалось 1 раз.
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение corpse » Вс ноя 06, 2016 12:42 am

secbit писал(а):Но так можно допустим на включение ТВ или включение Увлажнителя по ИК, как я и делал. Но если к примеру переключать каналы, то естественно это не прокатывает.
Собственно, какая разница в том, какое действие посылать - переключение каналов или включение/выключение? Не понимаю. Разъясни, что ты имеешь в виду под переключением каналов и какие с этим могут быть проблемы?

P.S.: У меня всё работает пока в 100% случаев и тоже без задержек. По ощущениям - так же быстрее, чем e-Control.
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение secbit » Вс ноя 06, 2016 12:45 am

К тому же с ИК сигналами и RF работает по разному
А к примеру с розеткой SP2 работает по алгоритму, отослать

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

5AA5AA555AA5AA55000000000000000000000000000000000000000000000000D5D1000033276A001680ABBFAF0D43B401000000B0BE0000BAFD59A54C596A80A8BE4EF844AEE280
Этот код всегда почти одинаковые, меняется по порядку только D1 D2, D3 и.т.д и еще парочка.
А далее пакет с включением или выключением, это два разных пакета и так поочередно.
Почему при этом
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение secbit » Вс ноя 06, 2016 12:51 am

corpse писал(а):
secbit писал(а):Но так можно допустим на включение ТВ или включение Увлажнителя по ИК, как я и делал. Но если к примеру переключать каналы, то естественно это не прокатывает.
Собственно, какая разница в том, какое действие посылать - переключение каналов или включение/выключение? Не понимаю. Разъясни, что ты имеешь в виду под переключением каналов и какие с этим могут быть проблемы?

P.S.: У меня всё работает пока в 100% случаев и тоже без задержек. По ощущениям - так же быстрее, чем e-Control.
Я в данном случае говорю именно про RM2 Pro, с теми же розетками все просто, один код на включение, другой на выключение.
Разница в том, что когда я отлавливал кнопку включения, там идет два разных кода почему-то, а вот если просто включить канал какой-то, идет один пакет и естественно поочередно отсылать нечего, тут я и завис, потому меня и интересовал алгоритм той программы что я говорил, чтоб понять, как удается отослать один код каждый раз и он работает.
Работает на прямую в любом случае быстрее, потому что через приложение e-Control если отдавать комманды, то идет ведь через облачный сервис в начале, а потом только на устройство. Последняя версия программы вообще по 10-30 секунд первый раз может отсылать сигнал, что вообще уже никуда
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение secbit » Вс ноя 06, 2016 1:06 am

Блин до меня дошло наконец! Во всяком случае с увлажнителем, и я так понимаю с остальными ИК коммандами.
Нужно просто в двух местах рандомно менять значения!
К примеру
5AA5AA555AA5AA5500000000000000000000000000000000000000000000000039F0000012276A00EA8281DD9B0D43B403000000E9C60000CA858F645CBDF00E06E181600DE2D21D91400C1E57C391ACCC19AD85A589BA5996678CDCA03D77BF079E99FE34B07D90F0F3991710E1ED4A419213AE5C201E12C4072EBB674A5A2E71C304E176B6E570
И тогда будет работать одна и та же комманда! Вот что в исходнике и было написано.
И можно просто в Majordomo запихнуть на выключатель такой код, но это на включение/выключение (но правда нужно еще реализовать замену рандомных символов в этих местах)

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

$this->setProperty("svet", $this->getProperty("svet_old"));
if ($this->getProperty("svet")== 0) {
getURL("localhost/objects/?script=BroadLinkCommand&ip=192.168.1.103&cmd=5AA5AA555AA5AA5500000000000000000000000000000000000000000000000073E2000012276A00A48181DD9B0D43B40300000058C10000E576F5FF97E936EE8D3E65554DD3A676D369426F6D68F64E7F3B7330DA0F6F6ACC6BA0B26C4888960E92B2B3C2C95DC6");
say("Увлажнитель включен");
$this->setProperty("svet_old",1);
}

else if ($this->getProperty("svet")== 1){
getURL("localhost/objects/?script=BroadLinkCommand&ip=192.168.1.103&cmd=5AA5AA555AA5AA55000000000000000000000000000000000000000000000000E0E1000012276A00108281DD9B0D43B40300000058C10000E576F5FF97E936EE8D3E65554DD3A676D369426F6D68F64E7F3B7330DA0F6F6ACC6BA0B26C4888960E92B2B3C2C95DC6");
say("Увлажнитель выключен");
$this->setProperty("svet_old",0);
} 
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение corpse » Вс ноя 06, 2016 1:14 am

secbit писал(а):Разница в том, что когда я отлавливал кнопку включения, там идет два разных кода почему-то, а вот если просто включить канал какой-то, идет один пакет и естественно поочередно отсылать нечего, тут я и завис, потому меня и интересовал алгоритм той программы что я говорил, чтоб понять, как удается отослать один код каждый раз и он работает.
Работает на прямую в любом случае быстрее, потому что через приложение e-Control если отдавать комманды, то идет ведь через облачный сервис в начале, а потом только на устройство. Последняя версия программы вообще по 10-30 секунд первый раз может отсылать сигнал, что вообще уже никуда
Может быть мне повезло так с моими кодами, но у меня вроде бы везде один код идёт.
Про облако тоже уже подумал.
Ладно, будем решать проблемы по мере их поступления.

С рандомными символами я пробовал ещё месяц назад - у меня не сработало. Там есть какая-то логика изменения этих символов. То ли ко времени что-то привязано, то ли они друг от друга как-то зависят, но просто рандом не прокатил.
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение secbit » Вс ноя 06, 2016 1:28 am

Да! Все же так и работает, я сделал посимвольное сравнение многих дампов и меняется только в двух местах, именно рандомно, ну конечно не на 1234, а HEX типа 5DC6.
Работает эта система как с ИК так и с RF, вот почему в той программе все работало как часы, так заменяется эта часть на рандомный HEX.
А вот розетка работает по алгоритму, послать

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

5AA5AA555AA5AA55000000000000000000000000000000000000000000000000D5[b]D1[/b]000033276A00[b]16[/b]80ABBFAF0D43B401000000B0BE0000BAFD59A54C596A80A8BE4EF844AEE280
с рандомной заменой указанных мест.
А потом два разных кода, на включение и выключение

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

5AA5AA555AA5AA5500000000000000000000000000000000000000000000000099D2000033276A00D180ABBFAF0D43B401000000B1BE0000FFEE8CABB12A48ED8038DF7D77E56543
5AA5AA555AA5AA5500000000000000000000000000000000000000000000000032D2000033276A00FC81ABBFAF0D43B401000000B2BE000096A0F9C1ADAB125B4BFF7390BB2F2AA2
Это во всяком случае что у меня есть, я проверил. У меня подозрение что с удлинителем так же работает, но я конечно не знаю, в наличии нет.
Еще хорошо бы разобраться с ответами, чтоб знать состояние...вот это конечно сложнее, хотя может и нет.
Проверил работает на самописной программе и на PHP

corpse

Спасибо за наводки, так я наконец допер в чем дело)) а то так и дальше бы тупил
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

Re: Модуль Broadlink (для приложения BroadlinkHTTPBrige)

Сообщение secbit » Вс ноя 06, 2016 3:07 am

Вот накидал код, на включение выключение, я далеко не спец по PHP, потому сделал как смог
Код методаПоказать

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

$commanda = dechex(rand(40000, 49999));

$this->setProperty("svet", $this->getProperty("svet_old"));
if ($this->getProperty("svet")== 1) {
getURL("localhost/objects/?script=BroadLinkCommand&ip=192.168.1.103&cmd=5AA5AA555AA5AA55000000000000000000000000000000000000000000000000{$commanda}000012276A00{$commanda}81DD9B0D43B40300000058C10000E576F5FF97E936EE8D3E65554DD3A676D369426F6D68F64E7F3B7330DA0F6F6ACC6BA0B26C4888960E92B2B3C2C95DC6");
sayReply("Свет включен");
$this->setProperty("svet_old",0);
}

 else if ($this->getProperty("svet")== 0){
getURL("localhost/objects/?script=BroadLinkCommand&ip=192.168.1.103&cmd=5AA5AA555AA5AA55000000000000000000000000000000000000000000000000{$commanda}000012276A00{$commanda}81DD9B0D43B40300000058C10000E576F5FF97E936EE8D3E65554DD3A676D369426F6D68F64E7F3B7330DA0F6F6ACC6BA0B26C4888960E92B2B3C2C95DC6");
sayReply("Свет выключен");
$this->setProperty("svet_old",1);
} 
Закрыто