我一直在尝试制作一个简单的程序,该程序可以自动执行bluetoothctl的功能。它不必经过GPL认证,因此我不能仅复制bluetoothctl的源代码。最大的绊脚石只是让一个简单的D-Bus程序起作用。由于我的目标是嵌入式系统(虽然功能相当强大),所以我无法运行Python或仅使用任何编程语言。
我在这里看到了几个问题,并且有大量指向obsolete things或断开的链接或documentation的指针的网站,它们表明我“报名参加”。没有一个简单的最小示例建立D-Bus连接吗?
答案 0 :(得分:3)
这是一个Makefile:
LIBS=gio-2.0
CFLAGS=-O0 -ggdb3 `pkg-config --cflags $(LIBS)`
LDFLAGS=`pkg-config --libs $(LIBS)`
.PHONY: clean
default: gdbus-example
gdbus-example: gdbus-example.o
gcc $^ $(LDFLAGS) -o $@
%.o: %.c
gcc $(INCLUDE) $(CFLAGS) -o $@ -c $^
clean:
rm -f *.o gdbus-example
这是一个用于构建的最小C文件,用于连接并监视bluez:
#include <stdio.h>
#include <gio/gio.h>
void name_appeared(GDBusConnection *connection,
const gchar *name,
const gchar *name_owner,
gpointer user_data)
{
printf("Name appeared: %s\n", name);
printf("Owned by: %s\n", name_owner);
}
void name_vanished(GDBusConnection *connection,
const gchar *name,
gpointer user_data)
{
printf("Name vanished: %s\n", name);
}
int main(void)
{
GMainLoop *loop;
GError *error;
guint name;
loop = g_main_loop_new(NULL, FALSE);
name = g_bus_watch_name(G_BUS_TYPE_SYSTEM,
"org.bluez", //
G_BUS_NAME_WATCHER_FLAGS_NONE,
name_appeared,
name_vanished,
NULL,
NULL);
g_main_loop_run(loop);
}
这是一个示例终端会话,我在其中重新启动了蓝牙服务:
$ ./gdbus-example
Name appeared: org.bluez
Owned by: :1.16
Name vanished: org.bluez
Name appeared: org.bluez
Owned by: :1.1152
这里是gio documentation,其中包括GDBus。它涵盖了如何构建和初始化GDBus程序。 DBus项目指向high level和low level API文档。