Реверсивный инжиниринг управления Bluetooth контроллером светодиодной ленты
Друзья, совсем недавно я перевёл все девайсы моего умного дома на управление через Home Assistant, а также привязал к нему голосовое управление через две Яндекс Станции Макс, одну Sonos One и Amazon Echo Dot 3. На прошлой неделе я сделал для своей супруги вот такой мини-кабинет на нашей лоджии, а на монитор я установил RGB подсветку с контроллером, который управляется как по Bluetooth, так и через дистанционный ИК-пульт управления.
Возникла идея включать и выключать данную подсветку голосом, а также использовать несколько автоматизаций в Home Assistant, чтобы автоматически включать подсветку при работе ноутбука после заката солнца, а также автоматически выключать её при выключении ноутбука. Кстати, включение и выключение ноутбука я также перевёл на голосовое управление. В данной инструкции я покажу вам, как найти команду управления включения и выключения подсветки через Bluetooth, а в дальнейшем использовать её в Home Assistant.
Что вам понадобится
- Подсветка с Bluetooth-контроллером (APP with remote)
- Смартфон с ОС Android
- Приложение Triones
- Программа WireShark
- Устройство на Linux c Home Assistant и Bluetooth адаптером (в моем случае это одноплатный компьютер Raspberry Pi 3b с операционной системой Debian 11, Home Assistant работающий в docker-контейнере и Bluetooth адаптер Buro BU-BT40С)
Шаг 1 : Установка приложения Triones и включение записи Bluetooth пакетов
Включаем Bluetooth на смартфоне, устанавливаем приложение Triones, находим наш контроллер светодиодной ленты и пробуем к нему подключиться.
Затем, используя серую кнопку включения в приложении пробуем включить и выключить нашу светодиодную ленту.
Если все работает, то в нашем смартфоне идём в настройки разработчика и активируем строку Enable Bluetooth HCI snoop log.
После этого выключаем и снова включаем Bluetooth на смартфоне. Возвращаемся в приложение Triones и раз пять пробуем включить и выключить светодиодную ленту.
Далее, возвращаемся в настройки разработчика, деактивируем строку Enable Bluetooth HCI snoop log, а также активируем строку USB debugging.
Шаг 2 : Копирование файла Bluetooth пакетов и их анализ в WireShark
Подключаем телефон к компьютеру с помощью data-кабеля. В моем случае это операционная система на Linux. Открываем терминал и вводим команду
adb bugreport bugreportfolder
Команда скопирует файл bugreportfolder.zip в домашнюю директорию /home/username/.
Распаковываем файл и в папке /home/username/bugreportfolder/FS/data/misc/bluetooth/logs находим файл с расширением .cfa.
Устанавливаем программу WireShark на компьютер и открываем с помощью нее указанный выше файл.
Находим строку с соединением от нашего смартфона к Bluetooth контроллеру.
Внизу окна программы открываем выпадающее меню Bluetooth Attribute Protocol и видим, что значение поля value равно cc2433. Далее находим подобную строку с соединением от нашего смартфона к Bluetooth контроллеру и видим, что значение поля value сменилось на cc2333.
Это 3 байта на выключение (cc2433) и включение контроллера (cc2333) светодиодной ленты! У вас эти значения будут другими. Также в столбце info видим следующую информацию Handle: 0x0014. Данное значение нам потребуется для управления контроллером из терминала.
Шаг 3 : Включение контроллера светодиодной ленты из терминала
Открываем терминал устройства (в моем случае это Raspberry Pi 3b), на котором расположен Bluetooth адаптер и вводим следующие команды:
bluetoothctl scan on pair XX:XX:XX:XX:XX:XX
Где XX:XX:XX:XX:XX:XX – MAC-адрес контроллера светодиодной ленты.
Вам будет предложено ввести ключ (passkey) для сопряжения, введите 0000.
После сопряжения выходим из bluetoothctl:
scan off exit
Далее, вводим команду на включение контроллера светодиодной ленты:
gatttool -i hci0 -b XX:XX:XX:XX:XX:XX --char-write-req -a 0x0014 -n cc2333
где hci0 имя bluetooth адаптера.
XX:XX:XX:XX:XX:XX – MAC-адрес контроллера светодиодной ленты.
0x0014 – значение Handle.
cc2333 – 3 байта записываемые в Bluetooth характеристику на включение светодиодной ленты.
Светодиодная лента должна включиться.
Команда на выключение будет, соответственно, следующей:
gatttool -i hci0 -b XX:XX:XX:XX:XX:XX --char-write-req -a 0x0014 -n cc2433
Шаг 4 : Включение контроллера светодиодной в Home Assistant
Заходим в файл конфигурации /config/configuration.yaml и создаём виртуальный выключатель:
switch: - platform: command_line switches: laptop_monitor_backlight: command_on: gatttool -i hci0 -b XX:XX:XX:XX:XX:XX --char-write-req -a 0x0014 -n cc2333 command_off: gatttool -i hci0 -b XX:XX:XX:XX:XX:XX --char-write-req -a 0x0014 -n cc2433 friendly_name: 'Laptop Monitor Backlight'
Перезагружаем Home Assistant и создаём Lovelace карточку с виртуальным выключателем, которым можно управлять из админки Home Assistant.
Из минусов можно отметить то, что из данной Bluetooth характеристики нельзя прочитать записанное значение и использовать его в Home Asssistant для определения текущего состояния светодиодной ленты (т.е. либо включена, либо выключена). Если вы знаете как это сделать, напишите в комментариях.
Если у вас также настроена интеграция Yandex Smart Home,
то данный выключатель у вас появится в Квазаре, которым можно управлять голосом через Яндекс Станцию, но об этом в следующей инструкции.
Profit :)
Понравилась инструкция? Тогда поделитесь ей со своими друзьями или попробуйте написать свою собственную!