在 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
我正在使用外部设备确认 Linux 机器充当 GATT 服务器,但未/org/bluez/example/service
列出。
为什么/org/bluez/example/service
在 下找不到作为对象org.bluez
?
我也对此感到困惑,我发现我们无法看到 dbus 对象,因为此示例未在 dbus 上为该服务定义众所周知的/请求的名称。
根据能够查询服务的busctl 文档,您需要有一个与之关联的名称。虽然此示例 Gatt 服务器没有。
尽管您可以使用 sudo dbus-monitor --system 来监视正在注册的对象,也可以通过在 gatt 服务器示例代码中创建 Application 对象之前在总线上调用 request_name 来从 dbus 请求名称。您可以在此处查看具有请求名称的示例服务。
您还需要通过编辑 /etc/dbus-1/system.conf 并添加您的服务名称来授予系统总线发布权限,如下所示: