BlueZ: Как настроить сервер GATT из командной строки

Я хотел бы знать, есть ли способ настроить gatt-сервер из командной строки Linux. Я знаю, что команда BlueZ gatttool позволяет вам действовать как gatt-клиент и опросить удаленный сервер gatt, однако я не думаю, что этот инструмент можно использовать для настройки сервера.

То, что я хочу достичь, - это gatt-сервер, , созданный из командной строки, и может быть опрошен любым центральным устройством (например, iOS или Android-устройством) для подключения к серверу GATT, услуг и характеристик, а также манипулировать данными в характеристиках.

Пример:

Сервер Gatt с 1 службой, которая содержит 3 характеристики.

  • Сервис uuid = 0xFFFF
  • Char 1 uuid = 0xAAAA, value = 01, properties = readable
  • Char 2 uuid = 0xBBBB, value = 00, properties = readable и writeable
  • Char 3 uuid = 0xCCCC, value = 02, properties = notifiable

Я использую версию ядра 3.11.0 и BlueZ 5.19

Ответ 1

Так что теперь это обрабатывается с помощью нового инструмента bluetoothctl. С помощью этого инструмента можно настроить таблицу Гатт следующим образом:

#bluetoothctl
[bluetoothctl] menu gatt
[bluetoothctl] register-service 0xFFFF # (Choose yes when asked if primary service)
[bluetoothctl] register-characteristic 0xAAAA read       # (Select a value of 1 when prompted)
[bluetoothctl] register-characteristic 0xBBBB read,write # (Select a value of 0 when prompted)
[bluetoothctl] register-characteristic 0xCCCC read       # (Select a value of 2 when prompted)
[bluetoothctl] register-application # (This commits the services/characteristics and registers the profile)
[bluetoothctl] back
[bluetoothctl] advertise on

Я попробовал это с несколькими комбинациями сервис/характеристика и смог заставить его работать. Службы GAP (0x1800) и GATT (0x1801) доступны по умолчанию и будут частью таблицы GATT при размещении рекламы. Вы также можете использовать следующую команду для просмотра доступных служб: -

[bluetoothctl] show
Controller 00:AA:BB:CC:DD:EE (public)
    Name: MyMachine
    Alias: MyMachine
    Class: 0x000c0000
    Powered: yes
    Discoverable: no
    Pairable: yes
    UUID: Headset AG                (00001112-0000-1000-8000-00805f9b34fb)
    UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control        (0000110e-0000-1000-8000-00805f9b34fb)
    UUID: Generic Access Profile    (00001800-0000-1000-8000-00805f9b34fb)
    UUID: PnP Information           (00001200-0000-1000-8000-00805f9b34fb)
    UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
    UUID: Audio Source              (0000110a-0000-1000-8000-00805f9b34fb)
    UUID: Audio Sink                (0000110b-0000-1000-8000-00805f9b34fb)
    **UUID: Unknown                   (0000ffff-0000-1000-8000-00805f9b34fb)**
    UUID: Headset                   (00001108-0000-1000-8000-00805f9b34fb)
    Modalias: usb:v1D6Bp0246d0532
    Discovering: no

Ответ 2

Я также столкнулся с одной и той же проблемой, но мог найти любое правильное решение, что лучше всего использовать, используя стек bluez на машине Ubuntu, использует некоторые команды hci для рекламы пакетов LE. Эти пакеты будут постоянно рекламироваться, так как это сервер LE. Если вы отправитесь на сканирование с помощью GATT Client, вы получите имя своего синего устройства в списке сканирования.

Используйте следующие команды ниже:

Установите рекламные пакеты LE следующей командой:

sudo hcitool -i hcix cmd 0x08 0x0008 1E 02 01 1A 1A FF 4C 00 02 15 E2 0A 39 F4 73 F5 4B C4 A1 2F 17 D1 AD 07 A9 61 00 00 00 00 C8 00

. Теперь рекламируйте пакеты LE следующей командой:

sudo hciconfig hcix leadv

Ответ 3

Я считаю, что установить GattServer из CLI невозможно. Главным образом потому, что это функциональность верхнего уровня, поэтому для этого нет инструмента (поскольку большинство инструментов обеспечивают функции нижнего уровня).

Но вы можете использовать mimic, как bluez создает сервис, используя dbus.

Нам понадобился GattService с двумя характеристиками (R, W, N)

То, что мы закончили, было следующим:  1. используйте libgdbus (из источника bluez). Он имеет всю оболочку dbus для регистрации служб bluez.

  1. Создал переводчик (сокет IPC) для разделения проблемы лицензирования (GPL)

  2. Отправьте команду регистратору услуг для создания службы e, g - op_code = create_service, uuid = 'service_uuid'

op_code = create_charac, uuid = 'charac_uuid' flags = 'rwn'

Надеюсь, что это поможет.