我是GDbus编程的新手.我需要使用Dbus Glib实现简单的Dbus发送 - 接收消息(信号).我试图谷歌一些示例程序,但找不到.
任何人都可以发布任何这样的示例程序或指向一些示例程序教程吗?
提前致谢...
谢谢,SB
使用gdbus-codegen生成的管理器代理时,我无法接收系统DBus信号.但我能够成功调用systemd提供的方法而不是DBus.
我在线搜索并查看这些链接但没有取得多大成功.当gdbus-codegen用于systemd API时,没有太多关于如何做的例子.
这是我和代码片段一起做的.
1)我生成了systemd内省并使用该XML作为gdbus-codegen的输入.
...略
<interface name="org.freedesktop.systemd1.Manager">
<signal name="JobRemoved">
<arg type="u"/> <arg type="o"/> <arg type="s"/> <arg type="s"/>
</signal>
Run Code Online (Sandbox Code Playgroud)
...略
2)写了我的客户端代码以使用gdbus-codegen生成的C API并创建了一个管理器代理.(一切都在系统总线上).
SystemdManager *systemdProxy = systemd_manager_proxy_new_for_bus_sync(
G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE,
"org.freedesktop.systemd1", "/org/freedesktop/systemd1",
NULL, error);
Run Code Online (Sandbox Code Playgroud)
3)定义信号处理程序
static void on_done(GDBusProxy *proxy,
gchar *sender_name,
gchar *signal_name,
GVariant *parameters,
gpointer user_data)
{
LOG_ERROR("on_done");
}
Run Code Online (Sandbox Code Playgroud)
4)将一个信号处理程序连接到JobRemoved信号的代理.
if (g_signal_connect(systemdProxy, "job-removed",
G_CALLBACK(on_done), NULL) <= 0 )
{
LOG_ERROR("Failed to connect to signal job-removed");
}
Run Code Online (Sandbox Code Playgroud)
5)使用代理启动systemd服务.这会返回成功,我可以看到设备启动并运行一两秒并终止.
ret = systemd_manager_call_start_unit_sync(
systemdProxy, unit_name, unit_mode, &job_obj,
NULL, &error);
Run Code Online (Sandbox Code Playgroud)
6)systemd生成JobRemoved信号.dbus-monitor显示它.
signal sender=:1.0 …Run Code Online (Sandbox Code Playgroud) 我创建了一个新的 systemd 服务,我希望能够通过 dbus 调用激活它。该服务只是执行一个 shell 脚本。
我在这里定义了服务:
/lib/systemd/system/testamundo.service
[Unit]
Description=Testamundo
[Service]
Type=dbus
BusName=org.freedesktop.testamundo
ExecStart=/home/test/systemd/testamundo.sh
Run Code Online (Sandbox Code Playgroud)
我还在这里为它定义了一个 D-Bus 服务:
/usr/share/dbus-1/system-services
[D-BUS Service]
Name=org.freedesktop.testamundo
Exec=/usr/sbin/console-kit-daemon --no-daemon
User=root
SystemdService=testamundo.service
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用 gdbus 启动它,这是我尝试使用的命令:
sudo gdbus call --system --dest org.freedesktop.systemd1 --object-path /org/freedesktop/systemd1 --method org.freedesktop.systemd1.StartUnit "org.freedesktop.testamundo"
Run Code Online (Sandbox Code Playgroud)
如果我像上面那样使用 --system 命令返回一个未知方法错误,如果我使用 --session 它从子进程返回退出代码 1。当我使用 --session 和 --system 查看 journalctl 时,我可以看到命令,但除此之外没有其他信息。
感谢您的任何想法或建议,谢谢!
我正在尝试使用GDBus绑定在D-Bus上的字节数组.能告诉我如何实现这一目标吗?我试过谷歌搜索,但没有帮助.
字节数组包含图像文件,因此无法转换为charbytearray
任何帮助都是适当的
随着BlueZ(5.30)的最后一个版本,亮点是GATT D-Bus apis的完成.我的目标是以编程方式(在C中)作为BLE客户端:
BlueZ社区强烈建议使用GATT-Dbus api来实现这一目标.经过多次搜索和头部刮擦后,我没有成功找到通过GATT-DBUs api执行此操作的正确方法或示例.看起来比直接使用GATT层更复杂.不幸的是,BlueZ删除了直接访问来调用gatt.
我非常接近将GATT源文件从Bluez中取出,将其编译为它自己的独立库并直接使用GATT层并调用连接并执行对ble设备服务器的读/写操作.我知道与DBUS-GATT api相比,它不是建议的方式,但我没有选择.
如果有人对此或建议有任何意见(有一些示例代码),请告知.
先感谢您!
我制作了下面的示例 xml,需要一些帮助来形成 dbus-send 命令来设置/获取属性“状态”。我知道如何调用方法,但无法使用 dbus-send 读取/写入属性。
xml:
<node>
<interface name="com.pgaur.GDBUS">
<method name="HelloWorld">
<arg name="greeting" direction="in" type="s"/>
<arg name="response" direction="out" type="s"/>
</method>
<signal name="Notification">
<arg name="roll_number" type="i"/>
<arg name="name" type="s"/>
</signal>
<property name="Status" type="u" access="readwrite"/>
</interface>
</node>
Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用这个 g_variant_new() ,这真的让我很困惑。我已阅读https://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-new但我无法轻松理解它。
我有一个代码:
#define MM_DBUS_SERVICE "org.freedesktop.ModemManager1"
#define MM_DBUS_PATH "/org/freedesktop/ModemManager1/Modem/0"
#define MM_DBUS_GET_PROPERTIES "org.freedesktop.DBus.Properties"
....
int i;
GError *error = NULL;
GVariant *ret;
char **paths;
ret = g_dbus_proxy_call_sync (proxy,
"org.freedesktop.DBus.Properties.Get",
g_variant_new ("(ss)",
"org.freedesktop.ModemManager1.Modem",
"SignalQuality"),
G_DBUS_CALL_FLAGS_NONE, -1,
NULL, &error);
if (!ret) {
g_dbus_error_strip_remote_error (error);
g_print ("failed: %s\n", error->message);
g_error_free (error);
return;
}
g_variant_get (ret, "(v)", &paths);
g_variant_unref (ret);
for (i = 0; paths[i]; i++) {
g_print ("Printing \n");
g_print ("%s\n", paths[i]);
}
g_strfreev (paths);
Run Code Online (Sandbox Code Playgroud)
它编译得很好,但是当它运行时我得到了 seg_fault。测试打印
打印分段错误
我期望这次通话的结果是:
dbus-send --system …Run Code Online (Sandbox Code Playgroud) 我尝试使用 GDbus 在 python 中编写服务文件。但我找不到好的教程,除非我想使用 C。因为我想将 GDbus 包含在现有的 Python 代码中,所以我不知道该怎么做。
我可以使用 dbus 编写服务文件,并且可以使用 GDbus 客户端访问该服务文件。
如果有人能提供一个很好的 Python 示例,我会非常高兴。非常感谢,多米尼克
函数 g_dbus_connection_signal_subscribe 非常适合告诉我新的 DBus 对象何时出现(或消失)并带有 InterfacesAdded 信号(或 InterfacesRemoved 信号)。但我需要了解预先存在的对象/接口。
我编写了以下 C 代码片段,以便在从总线添加/删除 DBus 对象时提供回调。为了简单起见,省略了错误检查。
#include <stdio.h>
#include <stdlib.h>
#include <gio/gio.h>
static void signal_cb(GDBusConnection *connection,
const gchar *sender_name,const gchar *object_path,
const gchar *interface_name,const gchar *signal_name,
GVariant *parameters,gpointer user_data)
{
printf("%s: %s.%s %s\n",object_path,interface_name,signal_name,
g_variant_print(parameters,TRUE));
}
int main(int argc,char *argv[])
{
GDBusConnection *c;
GMainLoop *loop;
int filter_id;
c = g_bus_get_sync(G_BUS_TYPE_SYSTEM,NULL,&err);
loop = g_main_loop_new(NULL,0);
filter_id = g_dbus_connection_signal_subscribe(c,
"org.bluez",NULL,NULL,NULL,NULL,
G_DBUS_SIGNAL_FLAGS_NONE,signal_cb,NULL,NULL);
g_main_loop_run (loop);
g_main_loop_unref (loop);
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
所以我想做的是跟踪树的 org.bluez 分支下存在的所有 DBus 对象。(这些代表可插拔蓝牙控制器和每个控制器发现的设备)。我需要了解程序启动之前已经存在的 DBus 对象,并且需要了解程序启动后出现的新对象。
上面的代码告诉我有关新对象的信息,但没有告诉我有关已存在对象的信息。gdbus API …