Подтвердить что ты не робот

Как реализовать Bluetooth LE с Bluez в Linux

Я работаю над настройкой двух Linux-систем для демонстрации BLE. Очевидно, что одна из систем будет периферийной, а одна из них будет центральными устройствами. У меня есть несколько вопросов, связанных с обеими этими конфигурациями.

Окружающая среда

Настройка периферийного устройства

Первый порядок бизнеса - настройка и настройка периферийной системы с помощью настроенного сервера GATT. В настоящее время не представляется возможным настроить сервер GATT из командной строки. Таким образом, хотя это простая задача, приносящая USB-ключ и рекламируя его, это не позволяет создавать пользовательские сервисы и характеристики. Единственным примером сервера GATT, который я мог найти, был файл gatt-example.c в пакете Bluez. Поэтому я загрузил и построил последний источник bluez-5.23. (http://www.linuxfromscratch.org/blfs/view/svn/general/bluez.html). Дополнительно настраивается с использованием флага --enable-maintainer-mode, чтобы принудительно построить плагин gatt-example.c в bluetoothd. И я проверил post-build из каталога ~/bluez-5.23/plugins, что был файл bluetoothd-gat-example.o. Который говорит мне, что пример gatt был, по крайней мере, успешно построен.

Затем я изменил файл конфигурации, чтобы включить LE и сервер атрибутов.

$ sudo vi /etc/bluetooth/main.conf
EnableLE = true           // Enable Low Energy support. Default is false.
AttributeServer = true    // Enable the GATT attribute server. Default is false.

Затем просто перезагрузите или перезапустите демон bluetooth...

Настройка центрального устройства

Поскольку центральному устройству не нужны никакие специальные плагины, построенные как периферийные устройства, я просто установил bluez с помощью apt-get. По-видимому, установлено значение v4.101 в соответствии с bluetoothd -v.

Настройка сеанса

Процесс подключения должен быть довольно простым. Я настраиваю периферийное устройство для рекламы, а затем подключаюсь к центральному устройству:

Периферийные:

$ sudo hciconfig hci0 up        // Make sure the interface is up
$ sudo hciconfig hci0 leadv     // Set the interface to advertise

Центральная:

$ sudo hcitool -i hci0 lescan   // Scan for nearby devices advertising
LE Scan ...
00:02:72:C9:5E:0F (unknown)     // Not sure why two of the same MAC are found?
00:02:72:C9:5E:0F (unknown)     // but I know this is my device...

$ sudo gatttool -i hci0 -b 00:02:72:C9:5E:0F -m 48 --interactive     // Connect interactively
[   ][00:02:72:C9:5E:0F][LE]> connect
[CON][00:02:72:C9:5E:0F][LE]> primary
attr handle: 0x0001, end grp handle: 0x0008 uuid: 00001800-0000-1000-8000-00805f9b34fb
attr handle: 0x0010, end grp handle: 0x0010 uuid: 00001801-0000-1000-8000-00805f9b34fb
[CON][00:02:72:C9:5E:0F][LE]> characteristics 
handle: 0x0004, char properties: 0x02, char value handle: 0x0006, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0007, char properties: 0x02, char value handle: 0x0008, uuid: 00002a01-0000-1000-8000-00805f9b34fb

И мы видим, что ни одна из услуг или характеристик из примера gatt не доступна.

Вопросы

- Периферийное устройство

  • Как мне создать собственный GATT-сервер? Может ли это быть автономным приложением C или нужно его встроить в bluetoothd в качестве плагина, такого как пример gatt? Ответ на этот вопрос (Создание сервера Gatt?) подразумевает, что вы выполните следующее: "начните с инициализации библиотеки GATT и дополнительных модулей", а затем "зарегистрируйте свою базу данных GATT". Но нет ни одного примера того, как реализовать эти общие инструкции, а предоставленная ссылка - это просто URL-адрес веб-сайта Bluetooth.
  • Спецификации GATT (https://developer.bluetooth.org/gatt/Pages/default.aspx) предоставляют множество "усыновленных" сервисов и характеристик, которые можно загрузить в формате XML. Но нет инструкций о том, как их использовать?!
  • Как проверить мой сервер GATT?

- Центральное устройство

  • Почему мое центральное устройство не видит сервисы и характеристики сервера GATT, работающего на периферии?

Я могу предоставить любую дополнительную информацию, необходимую. Спасибо.

4b9b3361

Ответ 1

Чтобы создать сервер GATT в отдельный процесс, у вас есть (по крайней мере) два случая:

  • Bluez v4.x: ваша служба GATT должна быть плагином Bluez.
  • Bluez v5.x: ваша служба GATT должна использовать новый API-интерфейс GATT DBus (но рекомендуется использовать, по крайней мере, Bluez v5.39 (с апреля 2016 г.), в противном случае это безопаснее (в терминах Bluez GATT Server API) для использования подхода плагина Bluez v4.x.

Если ваше центральное устройство не видит, что недавно экспортированная служба GATT, вероятно, проблема на перифале, а не проблема на центральном устройстве. Когда вам понадобится реализовать клиент GATT на центральном устройстве, у вас все еще есть два случая:

  • Bluez v4.x: Bluez не предоставляет API GATT. Либо вы используете оболочку script для запуска команд gatttool, либо используете библиотеку GATT, такую ​​как gattlib для взаимодействия с BLE устройство
  • Bluez v5.x: То же самое, если вы не можете перейти на Bluez v5.39, тогда лучше использовать методологию Bluez v4.x.