【发布时间】:2022-08-16 11:21:29
【问题描述】:
最近我开始使用通过 D-BUS 公开的 API 开发蓝牙应用程序。经过一番研究,我选择使用 sd-bus 库与 D-Bus 进行通信。 这是我的代码:
#include <systemd/sd-bus.h>
sd_bus* bus_;
if (sd_bus_open_system(&bus_) < 0)
{
throw std::runtime_error(\"sd_bus_open_system\");
}
sd_bus_error sd_error;
bool powered = true;
if (sd_bus_set_property(bus_,
\"org.bluez\",
\"/org/bluez/hci0\",
\"org.bluez.Adapter1\",
\"Powered\",
&sd_error,
\"b\", &powered) < 0)
{
throw std::runtime_error(\"Bluetooth Power On\");
}
上面的代码抛出“Bluetooth Power On”,sd_bus_set_property 的返回值为 -22 (EINVAL)。我从sd_error 无法理解,但对于谁可能感兴趣,以下是详细信息:
name:0x7fffffffdce8 \"И\\277UUU\"
message:0x5555555d6fbd <handler::handler(std::span<door, 18446744073709551615ul>)+191> \"\\220H\\213E\\350dH+\\004%(\"
_need_free:1439044320
- 我已经使用 D-Feet 应用程序检查了文字字符串,一切似乎都是正确的。
- 我尝试过以 root 或不使用 root 身份运行。
- 我已尝试将用户添加到蓝牙组。
这段代码有什么问题?
source code of sd_bus_set_property 表明,它在内部调用 \"Set\" 从 \"org.freedesktop.DBus.Properties\"。我见过的大多数蓝牙示例都没有使用“sd_bus_set_property”,但我很想知道如何通过“sd_bus_set_property”来完成。
谢谢阅读。