在 BlueZ 中定位 GATT 服务器的对象路径

The*_*eer 7 linux bluetooth bluez

在 Linux 机器上制作蓝牙 GATT 服务器是使用 BlueZ 完成的。使用现代 (5.50) BlueZ 的首选方法是通过 dbus API。

关于此主题的文档指出:

GATT 本地和远程服务共享相同的高级 D-Bus API。本地是指由 BlueZ 插件或外部应用程序导出的基于 GATT 的服务。远程是指对端导出的 GATT 服务。

我将其解释为:

无论本地服务和(Linux机器是服务器,其他设备通过蓝牙连接到它)远程服务(Linux机器是客户端,它通过蓝牙连接到其他设备)派代表参加了DBUS

这为问题设定了基本假设。

bluez 源代码提供了一个example-gatt-server。您可以执行一个示例,它会正常工作并将您的 Linux 机器置于 GATT 服务器中。

在该示例中,引用了任意命名的 dbus 对象。它的名字是/org/bluez/example/service

从文档中我希望一旦./example-gatt-server成功运行应该有一个/org/bluez/example/service地方。

事实并非如此:

~$ busctl tree org.bluez
??/org
  ??/org/bluez
    ??/org/bluez/hci0
Run Code Online (Sandbox Code Playgroud)

我正在使用外部设备确认 Linux 机器充当 GATT 服务器,但未/org/bluez/example/service列出。

为什么/org/bluez/example/service在 下找不到对象org.bluez

Ris*_*wal 2

我也对此感到困惑,我发现我们无法看到 dbus 对象,因为此示例没有在 dbus 上为该服务定义众所周知/请求的名称。

根据busctl 文档,为了能够查询服务,您需要有一个与其关联的名称。虽然本示例 Gatt 服务器没有。

显示一项或多项服务的对象树。如果指定了 SERVICE,则仅显示指定服务的对象树。否则,显示总线上至少获得一个众所周知的名称的所有服务的所有对象树。

尽管您可以使用 sudo dbus-monitor --system 来监视正在注册的对象,也可以在 gatt 服务器示例代码中创建应用程序对象之前通过在总线上调用 request_name 来向 dbus 请求名称。您可以在此处查看具有请求名称的示例服务。

bus.request_name(BUS_NAME)
named_bus = dbus.service.BusName(BUS_NAME, bus=bus)
Run Code Online (Sandbox Code Playgroud)

您还需要通过编辑 /etc/dbus-1/system.conf 授予系统总线发布权限,并添加您的服务名称,如下所示:

<policy user="root">
  <allow own="com.example.gattServer"/>
</policy>
Run Code Online (Sandbox Code Playgroud)