问题标签 [gdbus]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
634 浏览

c++ - 使用 gdbus-codegen 生成的代码时如何堵塞内存泄漏?

我有一个以 DBus Introspection XML 格式描述的接口:

我像这样运行 gdbus-codegen:

我使用这样的代码:

但是应用程序最终泄漏了一个生成的信号dbus_foo_default_init(),如下所示:

我的问题:

使用 gdbus-codegen 生成的代码后如何清理?

0 投票
1 回答
234 浏览

c++ - 在 gdbus 自省 xml 中添加元组

如何接收多个 int32 值,即当我收到一个值时,我需要将其指定为 type=i ,

但它不允许我指定为,当我这样做时,我收到错误,因为期望值为 null

然后我试过了

错误信息是:

错误 org.freedesktop.DBus.Error.InvalidArgs:消息类型“(ii)”与预期类型“((ii))”不匹配

它给出了错误,因为预期值为((ii)),我需要得到的是我需要将预期值更改为(ii)..请给我答案提前谢谢

0 投票
1 回答
434 浏览

c++ - GDBus 自省 xml 中的多个完整类型

如何在 gdbus introspection xml 中传递多个完整类型。例子,

当我尝试这种格式时,我得到的错误是

错误 org.freedesktop.DBus.Error.InvalidArgs:消息类型“(ii)”与预期类型“(null)”不匹配

当我使用

错误变为,

错误 org.freedesktop.DBus.Error.InvalidArgs:消息类型“(ii)”与预期类型“((ii))”不匹配

0 投票
0 回答
293 浏览

c - 将 GDBus 与使用 fork() 的代码一起使用

我被要求为使用 SocketCAN 与汽车上的一组控制单元通信的程序创建一个 dbus 接口(这只是背景信息,与问题无关)。最初的概念是使用一个侦听器接口,该接口为汽车中被询问的每个控制单元生成一个新的“节点”。这将导致com.acme.myservice总线上出现以下对象:

这个想法是从已经从命令行与单个 ECU 进行通信的 C 程序中接管代码。该代码依赖于 fork()ing 以便循环运行部分通信并出于时间原因并行运行其他部分。

我曾计划使用GDBusObjectManager模型,为侦听器使用新代码,并为每个节点实例重用 fork()ing 代码。不幸的是,我遇到了麻烦,因为我仍然需要处理 DBus 消息并将信息传递给(现在分叉的)孩子,并且不支持:

在 UNIX 上,GLib 主循环与 fork() 不兼容。任何使用主循环的程序都必须从子程序执行 exec() 或 exit() 而不返回到主循环。

我可以重构分叉代码,使其在主循环迭代之间的单个进程中执行,而不是使用 g_main_loop_run,但是如果有大量数据和多个节点正在运行,这可能会导致太多延迟。

解决这个问题的最佳方法是什么?是否有可能使用内置的 glib 机制以某种方式处理这些并行项目,或者有没有办法解决 mainloop/forking 问题?在使用 DBus 的单个进程和执行实际工作的分叉子进程之间使用不同的 IPC 机制是唯一的解决方案吗?(这可能与 gdbus 接口所需的代码一样多,因此它有点多余)

0 投票
1 回答
2747 浏览

dbus - 使用 gdbus-codegen 连接到 systemd DBUS 信号

使用 gdbus-codegen 生成的管理器代理时,我无法接收 systemd DBus 信号。但我能够通过 DBus 成功调用 systemd 提供的方法。

我在网上搜索并查看了这些链接,但没有成功。当 gdbus-codegen 用于 systemd API 时,没有太多关于如何做到这一点的示例。

这是我与代码片段一起做的事情。

1) 我生成了 systemd 内省并将该 XML 用作 gdbus-codegen 的输入。

...剪辑

...剪辑

2) 编写我的客户端代码以使用由 gdbus-codegen 生成的 C API 并创建了一个管理器代理。(一切都在系统总线上)。

3) 定义信号处理程序

4) 将信号处理程序连接到 JobRemoved 信号的代理。

5)使用代理启动systemd服务。这将返回成功,我可以看到该单元启动并运行一两秒钟并终止。

6) systemd 生成一个 JobRemoved 信号。dbus-monitor 显示它。

7) 我的信号处理程序永远不会被调用。(一切都使用系统总线,没有其他总线)。我已经为detailed_signal第二个参数尝试了各种字符串g_signal_connect(例如:JobRemoved, job_removed, ::job-removed, 有些不被 接受g_signal_connect)。

任何帮助是极大的赞赏!

0 投票
1 回答
1605 浏览

c - 有没有办法检查是否有人收听 dbus 信号?

有没有办法检查 DBus 中的监听客户端?

甚至有可能做到吗?我正在使用gdbus。

背景

我正在创建与串行端口接口的服务,如果有人在监听,我想隐式打开串行端口,如果最后一个客户端断开连接,我想自动关闭它。我可以使用打开/关闭方法来做到这一点,但存在一个客户端在其他客户端仍在侦听时关闭连接的风险。

我的问题的另一个解决方案是连接计数,但也存在客户端忘记关闭端口或崩溃的风险。

您还有其他想法如何实现吗?

我的代码(缩短)

基于: https ://github.com/bratsche/glib/blob/master/gio/tests/gdbus-example-server.c

编译使用:

谢谢

0 投票
2 回答
12384 浏览

bluetooth-lowenergy - BlueZ 5.30:D-Bus GATT API - 用 C 语言轻松发现并连接到 BLE 设备

在 BlueZ (5.30) 的最后一个版本中,亮点是 GATT D-Bus api 的完成。我的目标是以编程方式(在 C 中)作为 BLE 客户端:

  1. 扫描 ble 设备(我可以使用 hci 层)
  2. 连接到广告 BLE 设备
  3. 获取 UUID
  4. 对句柄执行读写操作

BlueZ 社区强烈建议使用 GATT-Dbus api 来完成此操作。经过多次搜索和挠头后,我没有成功找到通过 GATT-DBUs api 执行此操作的正确方法或示例。这似乎比直接使用 GATT 层更复杂。不幸的是,BlueZ 删除了调用 gatt 的直接访问权限。

我非常接近从 Bluez 中提取 GATT 源文件,将其编译为它自己的独立库,并直接使用 GATT 层和调用来连接和执行对 ble 设备服务器的读/写操作。我知道与 DBUS-GATT api 相比,这不是建议的方式,但我没有选择。

如果有人对此或建议(带有一些示例代码)有任何意见,请告知。

先感谢您!

0 投票
1 回答
301 浏览

arm - Bluez 的 C 代码生成器

我即将在ARM平台上用C语言开发我的蓝牙程序,它应该能够通过dbus接口与bluez交换信息。我已经成功地交叉编译了 Bluez,但 C 中的“客户端”部分对我来说始终是一项艰巨的工作。幸运的是,几个月前,我看到一段代码提供了一种非常相似的解决方案,其中提到了“由 gdbus-codegen 生成。请勿编辑”。因此,根据这些信息,我可以 99% 确定这种代码是开放的。但是我对这个生成器知之甚少,我设法搜索了有关它的更多信息,但是经过数周/数月的所有网站的大量挖掘工作后,我发现的东西很少。我唯一知道的是可能是翻译一些“xml”的“gdbus-codegen” 文件到“C”程序。但是我在哪里可以得到这个xml?任何人都可以给我一些关于它的信息吗?非常感谢。

0 投票
1 回答
6376 浏览

dbus - 使用 gdbus 启动 systemd 服务

我创建了一个新的 systemd 服务,我希望能够通过 dbus 调用来激活它。该服务只是执行一个 shell 脚本。

我在这里定义了服务:

我还在这里为它定义了一个 D-Bus 服务:

我正在尝试使用 gdbus 启动它,这是我尝试使用的命令:

如果我像上面那样使用 --system 命令返回一个未知方法错误,如果我使用 --session 它从子进程返回一个退出代码 1。当我用 --session 和 --system 查看 journalctl 时,我可以看到该命令,但除此之外没有其他信息。

感谢任何想法或建议,谢谢!

0 投票
1 回答
2561 浏览

gnome - Replacing Gnomes virtual keyboard with Onboard -> Hide/Show via DBus doesn't work

I'm using Gnome on a tablet as a daily driver. The integrated virtual keyboard doesn't serve as a replacement for a real keyboard, but I need exactly that. Thus I want to replace it with Onboard, and started to write an extension for Gnome Shell. The goal is to hide and show Onboard when the integrated virtual keyboard would be hidden/shown.

I can show/hide Onboard through DBus like this:

I adapted the example at https://wiki.gnome.org/Gjs/Examples/DBusClient to test showing/hiding Onboard through DBus:

Sadly it doesn't show Onboard, instead throws this error:

I have no clue why it talks about services when all I wan't to do is sending a message trough DBus? It's probably a rather stupid mistake as I don't have any experience with either Gnome Shell extensions nor DBus..

Version of Gnome is 3.18.0