标签: gdbus

GDbus信号的示例程序

我是GDbus编程的新手.我需要使用Dbus Glib实现简单的Dbus发送 - 接收消息(信号).我试图谷歌一些示例程序,但找不到.

任何人都可以发布任何这样的示例程序或指向一些示例程序教程吗?

提前致谢...

谢谢,SB

gdbus

11
推荐指数
2
解决办法
7755
查看次数

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

使用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)

dbus systemd gdbus

7
推荐指数
1
解决办法
2267
查看次数

使用 gdbus 启动 systemd 服务

我创建了一个新的 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 时,我可以看到命令,但除此之外没有其他信息。

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

dbus systemd gdbus

7
推荐指数
1
解决办法
5843
查看次数

使用GDBus在D-Bus上发送一个字节数组(类型`ay`)

我正在尝试使用GDBus绑定在D-Bus上的字节数组.能告诉我如何实现这一目标吗?我试过谷歌搜索,但没有帮助.

字节数组包含图像文件,因此无法转换为charbytearray

任何帮助都是适当的

c dbus gdbus

5
推荐指数
2
解决办法
7219
查看次数

BlueZ 5.30:D-Bus GATT API - 只需发现并连接到C语言的BLE设备

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

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

BlueZ社区强烈建议使用GATT-Dbus api来实现这一目标.经过多次搜索和头部刮擦后,我没有成功找到通过GATT-DBUs api执行此操作的正确方法或示例.看起来比直接使用GATT层更复杂.不幸的是,BlueZ删除了直接访问来调用gatt.

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

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

先感谢您!

dbus bluetooth-lowenergy bluez gatt gdbus

5
推荐指数
1
解决办法
1万
查看次数

使用 dbus-send 设置/获取属性

我制作了下面的示例 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)

dbus gdbus

5
推荐指数
1
解决办法
1万
查看次数

从 g_variant_new () 获取结果

我正在学习如何使用这个 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)

c gdbus

4
推荐指数
1
解决办法
2870
查看次数

Python 3 中从 dbus 迁移到 GDbus

我尝试使用 GDbus 在 python 中编写服务文件。但我找不到好的教程,除非我想使用 C。因为我想将 GDbus 包含在现有的 Python 代码中,所以我不知道该怎么做。

我可以使用 dbus 编写服务文件,并且可以使用 GDbus 客户端访问该服务文件。

如果有人能提供一个很好的 Python 示例,我会非常高兴。非常感谢,多米尼克

dbus python-3.x gdbus

4
推荐指数
1
解决办法
2316
查看次数

如何让 g_dbus_connection_signal_subscribe 函数告诉我有关预先存在的对象/接口的信息?

函数 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 …

c dbus bluez gdbus

1
推荐指数
1
解决办法
3084
查看次数

标签 统计

gdbus ×9

dbus ×7

c ×3

bluez ×2

systemd ×2

bluetooth-lowenergy ×1

gatt ×1

python-3.x ×1