Как отправить Bluetooth-пакеты/запросы на запись на устройство BLE через командную строку?

Вопрос или проблема

У меня есть 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
  1. Проверьте подключения: Убедитесь, что ни одно другое приложение (например, bluetoothctl или приложение вашего телефона) не подключено к вашему BLE-устройству. Для этого можете выполнить команду:

    sudo hciconfig hci0 up

    Это перезагрузит ваш интерфейс Bluetooth и освободит его для gatttool.

  2. Проверка интерфейсов: Убедитесь, что ваш Bluetooth-интерфейс работает и свободен:

    hciconfig -a

    Это даст вам информацию об интерфейсах и их статусах.

  3. Использование gatttool: После того, как вы удостоверитесь в том, что ваше устройство свободно, выполните команду для записи:

    sudo gatttool --char-write-req -b XX:XX:XX:XX:XX:XX -a 0x0009 -n c7e3f68520e8d5ae5acd17760a01459d

    Если все прошло успешно, ваше устройство должно включиться.

Альтернативные подходы

Если gatttool по-прежнему не работает, есть и другие инструменты, которые вы можете использовать:

  1. bluetoothctl: Этот инструмент также позволяет вам управлять BLE-устройствами. Чтобы подключиться и отправить команды, выполните:

    bluetoothctl
    • Введите power on для включения Bluetooth.
    • Используйте scan on, чтобы найти устройство, и найдите его MAC-адрес.
    • Подключитесь к устройству через connect XX:XX:XX:XX:XX:XX.

    Однако, обратите внимание, что bluetoothctl может не поддерживать прямые команды на запись, как это делает gatttool.

  2. 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).

  3. bettercap: Эта утилита предоставляет множество возможностей для работы с Bluetooth и может помочь вам в перехвате и манипуляциях с пакетами.

  4. Ubertooth One: Для более продвинутого анализа и перехвата BLE-пакетов, рассмотрите использование этого оборудования.

Заключение

Для управления BLE-устройствами через командную строку существует несколько подходов. Если gatttool не подходит, альтернативные инструменты, такие как bluetoothctl, bluepy, bettercap или Ubertooth One, могут стать отличной заменой. Важно следить за тем, чтобы устройство не было занято другими процессами во время отправки команд. Попробуйте позаботиться о том, чтобы ваш адаптер Bluetooth имел полный доступ к устройству, и вы без проблем сможете контролировать ваш светильник программно.

Оцените материал
Добавить комментарий

Капча загружается...