Как использовать Bluez5 DBUS API на С++ для подключения и подключения новых устройств?

Я пишу драйвер bluetooth для Intel Edison. Программное обеспечение для платформ доступно последним, и я разрабатываю IDE на основе Eclipse. Номер версии Bluez в этом выпуске edison составляет 5.37.

Я проектирую систему, которая должна отвечать следующим требованиям:

  • Сканирование для устройств Bluetooth поблизости. [X]
  • Обнаружение сенсорных устройств на основе имени и MAC-адреса. [X]
  • Пара и подключите устройства датчиков автоматически. []

Последний элемент - проблема, поскольку я могу обнаружить сенсорные устройства, но я не могу их соединить с помощью интерфейса bluez5. До сих пор я пытался использовать интерфейс D-BUS, но он не работает, так как я продолжаю получать следующее сообщение об ошибке:

Метод "FindAdapter" с сигнатурой "s" на интерфейсе "org.bluez.Manager" не существует

Здесь представлен код. Обратите внимание:

  • DBusConnection * conn → DBUS_BUS_SYSTEM
  • const char * adapter → "hci0".

код:

DBusMessage *msg, *reply;
DBusError err;
const char *reply_path;
char *path;

msg = dbus_message_new_method_call("org.bluez", "/","org.bluez.Manager", "FindAdapter");
dbus_message_append_args(msg, DBUS_TYPE_STRING, &adapter,DBUS_TYPE_INVALID);
dbus_error_init(&err);
reply = dbus_connection_send_with_reply_and_block(conn, msg, -1, &err);
dbus_message_unref(msg);

Любые идеи?

Ответ 1

Чтобы дать вам anwser, Pair и Connect связаны с device-api.txt. Чтобы вызвать эти методы, вы можете отправлять сообщения dbus (например, вы сделали в приведенном выше коде) или создать объект Proxy со следующими параметрами (см. Документацию):

name: "org.bluez"

интерфейс "org.bluez.Device1"

path: "/org/bluez/dev_AA_BB_CC_DD_EE", где AA_BB_CC_DD_EE - это MAC-адрес вашего устройства.

Если вы решили создать прокси-объект, вы можете вызвать такие методы, как Pair или Connect через прокси-сервер.


Не могли бы вы объяснить, чего вы пытаетесь достичь в коде выше? Я понимаю, что вы хотите найти, какой адаптер использовать (я вижу метод "FindAdapter" ), но, похоже, вы уже знаете, что ваше имя адаптера "hci0".


Я недавно работал с API DBus, который был показан Bluez, и я не был знаком с интерфейсом "org.bluez.Manager".

После быстрого поиска в официальной документации (https://git.kernel.org/cgit/bluetooth/bluez.git/tree/doc) мне удалось найти следующее коммит, которое указывает, что интерфейс был упал в 2012 году: https://git.kernel.org/cgit/bluetooth/bluez.git/commit/doc?id=86a7b07c22f3a595ba3c48092359287905bf0878

Я также заметил, что вы использовали низкоуровневый API DBus, как советовали сами freedesktop (читайте внизу страницы здесь: https://dbus.freedesktop.org/doc/api/html/group__DBus.html), это очень сложный API, полезный для создания привязок на других языках. Если вы можете, переключитесь на GLib GDBus для гораздо более простого API.