У меня есть устройство с несколькими пользовательскими службами GATT, и я хотел бы написать программу Linux для взаимодействия с ней. После некоторых поисков я узнал, что Linux использует BlueZ для обработки протокола Bluetooth LE. Я использую Ubuntu 15.10 с BlueZ 5.35, но я не могу понять, как использовать этот BlueZ из программы пользовательского пространства. Я не могу найти документацию по API где-нибудь, нет учебников, примеров, ничего. Возможно ли использовать этот стек BlueZ для чего-то другого, кроме как просто подключения к устройствам Bluetooth со службами по умолчанию? И если да, то где документация? (Предпочтительно, C/C++ API, но в этот момент все идет)Bluetooth Low-Enery в Linux API
ответ
Возможно, было бы проще и быстрее написать сценарий оболочки для Linux, чтобы сделать то, что вам нужно. Команды BlueZ относительно просты и понятны, и есть много учебников и вопросов о том, как их использовать.
Учебники: -
http://www.jaredwolff.com/blog/get-started-with-bluetooth-low-energy/ https://learn.adafruit.com/reverse-engineering-a-bluetooth-low-energy-light-bulb/control-with-bluez https://lilyhack.wordpress.com/2014/02/03/ble-read-write-arduino-raspberry-pi/ http://joost.damad.be/2013/08/experiments-with-bluetooth-low-energy.html
Вопросы: -
- Using Bluetooth low energy in linux command line
- Bluetooth Low Energy: listening for notifications/indications in linux
- How can I connect to the FitBit Zip over Bluetooth 4.0 LE on Linux with bluez?
Как только вы более знакомы с использованием команд вручную, вы можете написать минимальный сценарий оболочки, чтобы он был автоматизирован для вас.
Я использовал много этих команд для проверки возможностей BlueZ, и у него есть функции, которые мне нужны. Но мне нужно создать нечто более сложное, чем скрипт оболочки. – UnTraDe
У меня была аналогичная проблема, которая должна взаимодействовать с устройством BLE с помощью API GATT C/C++. Я понял, что такого API не существует. Как я исправился, проблема заключалась в том, чтобы написать мою собственную библиотеку GATT. Я нажал код на Github: https://github.com/labapart/gattlib
Я использую эту библиотеку в своем собственном проекте BLE, и это соответствует моим потребностям. Я создал несколько примеров https://github.com/labapart/gattlib/tree/master/examples, которые используют библиотеку, чтобы побуждать людей использовать ее и получать лучшую обратную связь.
Посмотрите на attrib/gatttool.c
в источниках bluez [1]. Gatttool - это утилита командной строки для подключения к устройствам BTLE с использованием C "API". Однако интерфейс GATT не отображается в libbluetooth. Более новая альтернатива gatttool и, следовательно, еще один пример для изучения - это btgatt-клиент, который вы можете найти в tools/btgatt-client.c
(чтобы включить компиляцию configure bluez с --enable-experimental
). Кроме того, интерфейс C bluez интегрировал интерфейс DBUS. bluetoothctl - это пример инструмента, использующего интерфейс DBUS. Код bluetoothctl можно найти в client/
[2]. Другой пример программы, использующей C-интерфейс bluez, - это SDK Anki Drive [3]. Он упаковал синий интерфейс GATT C в свою собственную библиотеку libbzle [4]. При использовании интерфейса C вам необходимо подключить сокет при установлении соединения BTLE. Gatttool делает это через интерфейс GATT, который, в свою очередь, использует glib iirc. Но вы также можете сделать это, используя syscalls (сокет, connect, ...), как объяснено, например. здесь [5]. В этом документе также объясняется:
К сожалению, на данный момент нет официальной ссылки на API для ссылки, поэтому более любопытным читателям рекомендуется загрузить и изучить исходный код BlueZ.
Гилберт Brault также извлек интерфейс ГАТТ от Bluez [6] и ссылок на рудиментарный Doxygen документацию интерфейса ГАТТ [7] со следующей оговоркой:
Это работа выполняется с цель документирования всех важных функций и структур данных
Также Шимон Джанк дал хороший обзор в своем разговоре «Bluetooth на современной Linux» на конференции Linux встраиваемых Linux 2016 [8]. Начиная с 42:00 он рассказывает о неэкспонированном интерфейсе C. Но в целом он, кажется, рекомендует API DBUS (см. «Подсказки» в 45:30). Некоторая документация DBUS может быть найдена в doc/gatt-api.txt
[9], а примеры Python с использованием интерфейса DBUS можно найти в test/
.
Надеюсь, это поможет.
[1] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/attrib/gatttool.c
[2] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/client/
[3] https://github.com/anki/drive-sdk/
[4] https://github.com/anki/drive-sdk/tree/master/deps/bzle/
[5] https://people.csail.mit.edu/albert/bluez-intro/c404.html
[6] https://github.com/gbrault/gattclient
[7] http://gbrault.github.io/gattclient/index.html
[8] https://www.youtube.com/watch?v=tclS9arLFzk
[9] http://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc/gatt-api.txt
Да, это возможно. Но есть кривая обучения. BlueIS APIS задокументированы в [синем дереве] (https://github.com/r10r/bluez/blob/master/doc/). Это все API-интерфейсы DBUS. Поэтому, чтобы использовать их, вам сначала нужно немного узнать о DBUS. Существуют различные привязки для использования DBUS. К ним относятся python, Glib и QT. Есть и другие. – kaylum