Я новичок в BLUEZ, а также в Linux. Я обнаружил, что Bluez продвигает использование API DBUS. Я также хочу знать, что такое DBUS API с точки зрения BLUEZ, в чем преимущество их использования вместо прямого C APIS? Насколько он отличается от C API?
API-интерфейсы DBUS в BLUEZ
Ответы (3)
Из моего собственного опыта:
- API-интерфейсы DBUS являются официально опубликованными, поэтому они, скорее всего, будут стабильными, поддерживаемыми и документированными.
- API-интерфейсы C немного более низкого уровня, и не всегда очевидно, как их можно использовать (кроме простого обнаружения).
- API-интерфейсы C более легкие, тогда как API-интерфейсы DBUS требуют больше времени как во время сборки, так и во время выполнения (glib, dbus, bluetoothd, чтобы назвать несколько вещей).
Так что это зависит от того, чего вы пытаетесь достичь. Если вам просто нужно базовое обнаружение и соединения rfcomm/l2cap, то API C, вероятно, подойдет. Если вы хотите чего-то большего, и если ваша платформа способна выдержать дополнительные накладные расходы на DBUS/bluetoothd/и т. д., то вы, вероятно, захотите использовать API DBUS.
Обновление: bluez теперь поддерживает gatt API через dbus. Только что завершено в 5.28 (хотя я думаю, что в более ранних версиях это было немного).
Bluez продвигает использование интерфейса DBUS по сравнению с остальными. К сожалению, не все возможно через интерфейс DBUS.
Я не смотрел на это в последнее время, но раньше BLE плохо поддерживался через DBUS. Вы могли взаимодействовать только с официально опубликованными профилями BLE, такими как мониторы сердечного ритма. Если вы хотели что-то сделать с атрибутами, не являющимися частью какого-либо профиля Bluetooth BLE, вы застряли. Так, например, к акселерометрам нельзя было получить доступ через интерфейс DBUS.
Это могло быть изменено в ветке 5.X (я не смотрел на это, потому что это не работает с ядром 3.4, которое я должен использовать). Ветвь Bluez 4.X не изменилась, и это определенно тот случай, когда у вас возникнут проблемы с BLE через DBUS для непрофильных атрибутов.
Просто предупреждаю: если вы используете ядро 3.4 или старше, у вас возникнут проблемы с открытием более одного сокета L2CAP. В ядре есть ошибка, которую никто не хочет исправлять. (происходит то, что все данные поступают в один сокет, независимо от того, с какого устройства они поступили)