Вопрос или проблема
У меня есть BLE-лампочка, которую я хотел бы контролировать программно. Подсматривая Bluetooth-пакеты между моим телефоном (на котором есть приложение для управления лампочками) и лампочкой, я выяснил следующую информацию:
MAC-адрес устройства: XX:XX:XX:XX:XX:XX
Хэндл, который управляет статусом лампочки: 0x0009
Значение для включения лампочки: c7e3f68520e8d5ae5acd17760a01459d
При изучении этого я наткнулся на (устаревшую) утилиту gatttool. Согласно их документации, я могу записывать данные на BLE-устройство следующим образом:
sudo gatttool –char-write-req -b XX:XX:XX:XX:XX:XX -a 0x0009 -n c7e3f68520e8d5ae5acd17760a01459d
Это работает в некоторой степени. Когда я подключен к лампочке с помощью своего телефона и выполняю указанную команду, я получаю следующий ответ:
connect error: Connection refused (111)
Это ожидаемо, так как я уже подключен к устройству с телефона. Когда я отключаю телефон, я получаю следующий ответ:
connect error: Device or resource busy (16)
К сожалению, это не то, что я надеялся увидеть. В Интернете я прочитал, что эта проблема может возникнуть из-за устаревания gatttool.
В заключение, что я ищу, это:
Некую информацию/мысли о том, как заставить gatttool работать в этой ситуации.
Другой подход (т.е. без gatttool). Я искал в bluetoothctl, но, похоже, я тоже не могу подключиться к устройству.
Буду благодарен за любую информацию.
connect error: Device or resource busy (16)
Означает, что ваш интерфейс занят, ваш ноутбук подключен к устройству или другой инструмент использует его? Например, вы не можете сканировать с bluetoothctl и использовать gatttool одновременно, если только у вас нет двух разных интерфейсов.
Используйте следующее, чтобы убедиться, что ваш Bluetooth работает, где hci0 – это hci-интерфейс, который вы используете.
$ hciconfig hci0 down && hciconfig hci0 up
$ service bluetooth restart
Чтобы проверить ваши интерфейсы, -a не является обязательным, но дает дополнительную информацию.
$ hciconfig -a
Чтобы автоматически преобразовывать hex в ascii при чтении значения:
$ gatttool -b [MAC] –char-read -a [characteristic] | awk -F’:’ ‘{print $2}’ | tr -d ‘ ‘ | xxd -r -p; printf ‘\n’
На моем опыте gatttool может быть очень полезным, другие инструменты для пробы: bettercap, ubertooth one.
Ответ или решение
Как отправить Bluetooth-пакеты/запросы на устройство BLE через командную строку
Ваша задачa заключается в том, чтобы программно управлять BLE-светильником, используя командную строку для отправки Bluetooth-пакетов. Вы уже собрали данные, необходимые для выполнения этой задачи. Давайте рассмотрим возможные подходы, включая решение через gatttool
и альтернативные инструменты.
Использование gatttool
gatttool
— это утилита для взаимодействия с BLE-устройствами, хотя она и была устаревшей, она все еще может работать в ряде случаев, как у вас с запрашиваемым светильником. Ошибка connect error: Device or resource busy (16)
указывает на то, что ваше устройство или ресурс заняты, что может происходить при одновременной работе нескольких приложений с Bluetooth.
Рекомендации по gatttool
-
Проверьте подключения: Убедитесь, что ни одно другое приложение (например,
bluetoothctl
или приложение вашего телефона) не подключено к вашему BLE-устройству. Для этого можете выполнить команду:sudo hciconfig hci0 up
Это перезагрузит ваш интерфейс Bluetooth и освободит его для
gatttool
. -
Проверка интерфейсов: Убедитесь, что ваш Bluetooth-интерфейс работает и свободен:
hciconfig -a
Это даст вам информацию об интерфейсах и их статусах.
-
Использование gatttool: После того, как вы удостоверитесь в том, что ваше устройство свободно, выполните команду для записи:
sudo gatttool --char-write-req -b XX:XX:XX:XX:XX:XX -a 0x0009 -n c7e3f68520e8d5ae5acd17760a01459d
Если все прошло успешно, ваше устройство должно включиться.
Альтернативные подходы
Если gatttool
по-прежнему не работает, есть и другие инструменты, которые вы можете использовать:
-
bluetoothctl: Этот инструмент также позволяет вам управлять BLE-устройствами. Чтобы подключиться и отправить команды, выполните:
bluetoothctl
- Введите
power on
для включения Bluetooth. - Используйте
scan on
, чтобы найти устройство, и найдите его MAC-адрес. - Подключитесь к устройству через
connect XX:XX:XX:XX:XX:XX
.
Однако, обратите внимание, что
bluetoothctl
может не поддерживать прямые команды на запись, как это делаетgatttool
. - Введите
-
python-bluepy: Библиотека
bluepy
для Python предоставляет API для работы с BLE-устройствами. Пример кода для включения светильника:from bluepy.btle import Peripheral mac_address = 'XX:XX:XX:XX:XX:XX' handle = 0x0009 value = bytes.fromhex('c7e3f68520e8d5ae5acd17760a01459d') device = Peripheral(mac_address) device.writeCharacteristic(handle, value)
Убедитесь, что у вас установлены все необходимые зависимости (
bluepy
). -
bettercap: Эта утилита предоставляет множество возможностей для работы с Bluetooth и может помочь вам в перехвате и манипуляциях с пакетами.
-
Ubertooth One: Для более продвинутого анализа и перехвата BLE-пакетов, рассмотрите использование этого оборудования.
Заключение
Для управления BLE-устройствами через командную строку существует несколько подходов. Если gatttool
не подходит, альтернативные инструменты, такие как bluetoothctl
, bluepy
, bettercap
или Ubertooth One
, могут стать отличной заменой. Важно следить за тем, чтобы устройство не было занято другими процессами во время отправки команд. Попробуйте позаботиться о том, чтобы ваш адаптер Bluetooth имел полный доступ к устройству, и вы без проблем сможете контролировать ваш светильник программно.