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

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

Модератор: immortal

sergeich
Сообщения: 2
Зарегистрирован: Пт окт 28, 2016 12:12 pm
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение sergeich » Пт окт 28, 2016 12:17 pm

Всем привет. Заметил, что при длительной команде, выполняемой RM Mini 3, примерно где-то 4 секунды, в HTTP Bridge 2.4 не выдается результат GET команды. То есть вместо 0 или 1 пустой ответ. Вопрос конечно к уважаемому Ultron, если он бывает здесь.
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение secbit » Сб окт 29, 2016 11:21 pm

Приветствую.
Заинтересовался я платформой majordomo, впервые с ней сталкиваюсь. Так как у меня есть некоторые устройства Broadlink, а именно RM2 Pro и SP 2 Mini Contros, решил поковыряться с отправкой команд, в начале пробовал ставить BroadlinkHTTPBrige, с этим ничего не вышло, как я не пытался запустить под разными эмуляторами, но все равно получал фиг. Потому плюнул и решил попробовать на прямую.
По описанию тут http://4pda.ru/forum/index.php?showtopi ... ry51074568
Поставил на телефон Packet Capture, в приложении e_control отправил команду на включение увлажнителя для начала, нашел по инструкции пакет, далее сохранил на компьютер файл с дампом пакета, с помощью прилагающейся программы из инструкции пробовал отправлять, все работало отлично!
Но когда я попытался то же самое сделать в Majordomo, срабатывало раз и все! Я очень долго анализировал WireShark сниффером что же происходит, но в упор не понятно было, все что делала программа из инструкции (исходник там тоже прилагается), это посылала в начале неверную комманду, чтоб разбудить девайс (RM2 Pro), а далее посылала правильный пакет.
Тогда я написал свой, небольшой UDP клиент для тестов, и там так же не хотело работать, как и в Majordomo. Опять же просидел с WireShark, полностью все повторял, но не работало! Тогда я залез снова в дампы Packet Capture, и увидел, что там по мимо каких-то технических пакетов, отсылается два, немного разных пакета, непосредственно команды которую нужно отправлять.
И выяснилось, что нужно поочередно отправлять эти два пакета, и только тогда! будет работать, с пакетом на включение увлажнителя, это было еще и удобно, так как один пакет включает, а другой выключает.
Так же работает и с 433Mhz сигналами, тестировал на выключателе Livolo (правда Broadlink не очень корректно работает с ними, но это другой вопрос).
А вот с розеткой SP 2 Mini Contros, все проще, работает один и тот же пакет, на включение и выключение.
В итоге я набросал простой код для 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);
}
Создается два свойства Svet и Svet_old и метод. Потом кидается выключатель в главное меню и все!
Возможно потом удастся понять, как отловить и разобрать ответы, хотя бы от розетки Contros, чтоб знать, включена она или нет, а вот считать данные с A2, конечно не получится.
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

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

Сообщение corpse » Пт ноя 04, 2016 12:13 pm

Суть в том, что пейлоад дампов пакетов одной и той же команды, отправленных на бродлинк каждый раз различается парой байт. Какой-то закономерности я выявить не смог. Думаю, с этой парой байт всё намного сложнее, чем может показаться изначально.
Одна и та же команда с одинаковым пейлоадом не обрабатывается устройством дважды. То есть, если я отправил некий пакет с пейлоадом, соответствующим команде ик пульта громкость вверх, то второй раз отправлять идентичный пакет бессмысленно, устройство его не обработает.
Если записать два пейлоада одной команды и отправлять их поочерёдно, то работать это будет. Либо есть ещё один не менее костыльный вариант - записать пейлоад пакета валидного, но неприменяющегося сигнала с какого-нибудь произвольного пульта и каждый раз отправлять его после текущей команды, но этот путь хуже.

В текущий момент имею на руках кроме rm pro ещё и MP1. Если кто-то может что-то подсказать о протоколе бродлинка, я был бы признателен.
Смотрел исходники бриджа v2.2, но в яве я не силён. Насколько я понимаю, уважаемому товарищу Ultron для добавления функционала MP1, нужен код устройства, прописанный в BroadlinkConstants.java, но я не знаю, как его добыть. С радостью готов сотрудничать, присылать дампы и т.п. - только предложите.
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Пт ноя 04, 2016 12:40 pm

corpse писал(а): В текущий момент имею на руках кроме rm pro ещё и MP1. Если кто-то может что-то подсказать о протоколе бродлинка, я был бы признателен.
Смотрел исходники бриджа v2.2, но в яве я не силён. Насколько я понимаю, уважаемому товарищу Ultron для добавления функционала MP1, нужен код устройства, прописанный в BroadlinkConstants.java, но я не знаю, как его добыть. С радостью готов сотрудничать, присылать дампы и т.п. - только предложите.
Не совсем так. И дело не в java....дело в закрытом sdk (набор библиотек предоставляемых производителем для разработки приложений). Последнее sdk которое я видел - обновили очень давно...поддержки MP1 там точно не было. Все то что было в sdk Ultron включил в бридж...
Нужно новое sdk достать где-то...Сейчас у бродлинка есть какой-то сервис (это вроде он https://dnakit.broadlink.com.cn) где можно зарегаться...я там регался - предоставляют нечто типа личного рабочего стола...но че там делать дальше, и как заполучить sdk не совсем понял))
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

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

Сообщение corpse » Пт ноя 04, 2016 2:44 pm

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

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

Сообщение corpse » Пт ноя 04, 2016 10:38 pm

Начало разработки
В общем, я тут посидел пару часов и набросал кое-что рабочее. Планирую развивать дальше. Когда закончу, можно будет поставить на любую машину (win/mac/*nix/*bsd). Пишу на пайтоне, апи планируется (что позволит использовать с мажордомо). Так же планируется создавать свою базу кодов в том же репозитории на гитхабе. Пока что работает в виде модуля.

Кому интересно, тут подробности: https://github.com/alive-corpse/esbroadlink

Для тех, кто в английском не силён, общая идея такова:
На текущий момент - это класс на пайтоне, у котрого есть метод для сохранения кода в файл, метод загрузки из файла и отправки кода на бродлинк. В текущий момент в качестве источника кодов использую httpbridge v2.2, потому как у меня там набор кодов для экспериментов широкий. Потом планирую перейти на нативное приложение, попробовать использовать со своим MP1, если у них логика работы не изменилась. Особенности - приложение ждёт повтора отправки одного кода дважды. Т.е. я запускаю метод storeCode('tvok') и этот метод активен, пока я два раза не дёрну соответствующий линк в бридже. После этого код сохраняется в файл. При вызове метода sendCode('tvok'), я получаю ту же реакцию, что и при нажатии соответствующей кнопки в нативном приложении или гет запросе линка из httpbridge.

В текущий момент всё это работает в chroot окружении на том же android tvbox, на котором у меня стоит httpbridge. Думаю, со временем то, что я пишу, его там заменит. Пока не знаю, получится ли запустить это с помощью QPYTHON (https://play.google.com/store/apps/deta ... python.qpy), но попытаюсь. Даже если не получится, планирую сделать поддержку импорта дампов из того же Packet Capture. Одним словом, решаемо. Сохранённые коды и модуль можно будет перенести на любую другую машину и запустить там.

Из отдалённых идей - написать модуль для коди, который позволит сделать ярлык в скине на какой-нибудь итем "погасить свет", например.

Предложения, идеи, замечания - очень приветствуются. Вдальнейшем готов помогать по мере сил всем желающим (например, сделать из такого-то пульта из облака бродлинка набор кодов).
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

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

Сообщение nick7zmail » Сб ноя 05, 2016 8:23 am

На счет родного приложения (недавно в соседней теме выяснили) - там оказывается есть кнопка поделится - которая формирует пакет с имеющимися командами из econtrol и расшаривает их в сеть wifi (скорее всего широковещательным пакетом. Пока не пробовал ловить его). Может как-то поможет в разработке))

И еще момент - в идеале бы это написать на php и превратить в модуль...ну если нет такого варианта, тогда да, хотя бы апи для общения сделать...
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

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

Сообщение corpse » Сб ноя 05, 2016 11:41 am

nick7zmail писал(а):На счет родного приложения (недавно в соседней теме выяснили) - там оказывается есть кнопка поделится - которая формирует пакет с имеющимися командами из econtrol и расшаривает их в сеть wifi (скорее всего широковещательным пакетом. Пока не пробовал ловить его). Может как-то поможет в разработке))
Идея интересная. Потом обдумаю. Но потом. Сначала доведу до конца текущую реализацию. Потому что знаю, как, потому что можно использовать как с httpbridge, так и с e-Control, потому что погоня за двумя зайцами ни к чему хорошему обычно не приводит и главное, потому что я сомневаюсь, что смогу разобрать формат того, что выгружает е-Control и сделать из этого пакеты. Поймать пакет в сети и завернуть его обратно - намного намного проще.
nick7zmail писал(а):И еще момент - в идеале бы это написать на php и превратить в модуль...ну если нет такого варианта, тогда да, хотя бы апи для общения сделать...
В php я полный ноль. Могу конечно просмотреть мануал по синтаксису и запилить что-то несложное, но во-первых, не уверен, что это будет правильно и качественно, а во-вторых, я не слышал о подобном супер-пупер инструменте для пхп, каким является scapy для python. С помощью scapy я могу сниффить пакеты, обращаться к ним как к кобъектам, оперировать с заголовками пакетов и, наконец, создавать новые пакеты. И если реализация отправки чего-то через сокет на php особых проблем не вызовет, как я думаю, то вот сниффинг пакетов, и их фильтрация как минимум будет не такой удобной. Ну и то, что пишется на php в 200 строк, на пайтоне занимает сто.

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

Ну и ещё один аргумент - python есть практически на любой линуксовой машине. Он есть даже в зависимостях у midnight commander (который mc). Так что особой проблемы вызывать не должно.
corpse
Сообщения: 26
Зарегистрирован: Пт ноя 04, 2016 11:56 am
Благодарил (а): 0
Поблагодарили: 2 раза

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

Сообщение corpse » Сб ноя 05, 2016 7:46 pm

Есть хорошие новости.
1. C e-Control работает.
2. MP1 через эту тулзу будет работать, возможность есть.
3. Я нашёл нормальный аналог tcpdump, который вроде как умеет сохранять полноценные pcap файлы.
4. Планирую на распродаже 11.11 заказать MP2 в личное пользование. Думаю, будет работать и с ним.

Что такое п.3 и чем это грозит? Могу сразу описать юзкейс (то как это будет выглядеть в конечном варианте). Включается программа, вбиваются нужные настройки и она начинает писать все пакеты, идущие на ваш бродлинк девайс в один большой файл. Вы заходите в e-Control, по очереди нажимаете два раза с паузой в полсекунды-скеунду все кнопки на вашем пульте, выходите из e-Control, сохраняете полученный файл, заливаете его через веб интерфейс, программа обрабатывает файл, находит в нём все отправленные коды, выводит их в том же вебинтерфейсе в виде, например, кнопок с названиями "act1", "act2", "act3" и т.п., где их можно будет сразу понажимать, отследить реакцию во внешнем мире и переименовать во что-нибудь более понятное, вида "tv-on-off", "tv-vol-up" и т.п..

Продолжаю пилить.
secbit
Сообщения: 12
Зарегистрирован: Сб окт 29, 2016 10:59 pm
Благодарил (а): 0
Поблагодарили: 0

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

Сообщение secbit » Сб ноя 05, 2016 9:58 pm

corpse писал(а):Суть в том, что пейлоад дампов пакетов одной и той же команды, отправленных на бродлинк каждый раз различается парой байт. Какой-то закономерности я выявить не смог. Думаю, с этой парой байт всё намного сложнее, чем может показаться изначально.
Одна и та же команда с одинаковым пейлоадом не обрабатывается устройством дважды. То есть, если я отправил некий пакет с пейлоадом, соответствующим команде ик пульта громкость вверх, то второй раз отправлять идентичный пакет бессмысленно, устройство его не обработает.
Если записать два пейлоада одной команды и отправлять их поочерёдно, то работать это будет. Либо есть ещё один не менее костыльный вариант - записать пейлоад пакета валидного, но неприменяющегося сигнала с какого-нибудь произвольного пульта и каждый раз отправлять его после текущей команды, но этот путь хуже.

В текущий момент имею на руках кроме rm pro ещё и MP1. Если кто-то может что-то подсказать о протоколе бродлинка, я был бы признателен.
Смотрел исходники бриджа v2.2, но в яве я не силён. Насколько я понимаю, уважаемому товарищу Ultron для добавления функционала MP1, нужен код устройства, прописанный в BroadlinkConstants.java, но я не знаю, как его добыть. С радостью готов сотрудничать, присылать дампы и т.п. - только предложите.
В том то и дело, что товарищ по этой ссылке http://4pda.ru/forum/index.php?showtopi ... ry51074568, сделал простое консольное приложение, которое при отсылке пакета, каждый раз срабатывает! А не через раз. Там есть исходник на C#, все что в нем делается программа, это пингует неправильными пакетами в начале, чтоб разбудить устройство, а потом отсылает правильный пакет, но то же самое воспроизвести не выходит почему-то, пытался ему писать, но ответа нет к сожалению.
Вся загвоздка как я понял с этими всеми костылями, в виде бриджей, это то, что команды шифруются AES шифром, поэтому и приходятся только так, если я не ошибаюсь.
Если использовать из Мажордомо вызов этого консольного приложения с параметрами, можно собственно прикрутить таким образом рабочий вариант, я пробовал, работает.
Закрыто