GLIB D-BUS Bluetooth - 如何获取文件描述符?
GLIB D-BUS Bluetooth - How to get the file descriptor?
我正在使用 BLUEZ 和 GLIB/D-BUS 连接 2 Raspberry Pi(还有一台笔记本电脑和一台 Raspberry Pi)。
到目前为止,我可以取得不错的进步。
编辑:根据@ukBaz 的好建议,我在我的笔记本电脑上使用 python client,我的 C 代码服务器在 Raspberry Pi.
在“服务器”上,我可以使用自定义服务 UUID 和串行 RFCOMM 配置文件 UUID 注册设备,并等待连接。与 python 客户端的连接工作正常,我可以看到有一个可用的处理程序(请参阅下面的代码以获取调试输出)
我正在使用这段代码(在 dbus 循环中,为了便于阅读而简化了代码):
static void new_connection(GDBusMethodInvocation *inv)
{
g_log(LOG_SERVER, G_LOG_LEVEL_MESSAGE, "New connection.");
GDBusMessage *msg = g_dbus_method_invocation_get_message(inv);
// This prints the output below this code snippet
gchar *content = g_dbus_message_print(msg, 2);
g_log(LOG_SERVER, G_LOG_LEVEL_INFO, "Message is:\n%s", content);
g_free(content);
GVariant *params = g_dbus_method_invocation_get_parameters(inv);
const char *object;
GVariant *properties;
gint32 *handle;
g_variant_get(params, "(oha{sv})", &object, &handle, &properties);
// Problem here, 'handle' is NULL
g_log(LOG_SERVER, G_LOG_LEVEL_INFO, "Object is [%s]\nHandle is [%ls]", object, handle);
GVariantIter iter;
g_variant_iter_init(&iter, properties);
display_properties(&iter);
}
这是输出:
New connection.
Message is:
Type: method-call
Flags: none
Version: 0
Serial: 32
Headers:
path -> objectpath '/org/bluez/jscturret'
interface -> 'org.bluez.Profile1'
member -> 'NewConnection'
destination -> ':1.18'
sender -> ':1.11'
signature -> signature 'oha{sv}'
num-unix-fds -> uint32 1
Body: (objectpath '/org/bluez/hci0/dev_00_AA_AA_AA_AA_AA', handle 0, @a{sv} {})
UNIX File Descriptors:
fd 7: dev=0:8,mode=0140777,ino=41101,uid=0,gid=0,rdev=0:0,size=0,atime=0,mtime=0,ctime=0
Object is [/org/bluez/hci0/dev_00_AA_AA_AA_AA_AA]
Handle is [(null)]
它显示有一个文件描述符 fd 7
但是当我读取 GVariant 参数时我得到 NULL
.
如何访问文件描述符?我的理解是我需要它才能 read/write from/to 客户。
我使用 https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt and https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt 作为参考,这里还有一些其他帖子。
在 https://www.linumiz.com/.
中也得到了很多信息
此处提供当前完整代码:btservice
哦!我很确定你应该发送一个指向整数的指针(而不是指向它的指针)。
你可以做到
gint32句柄; // 而不是 gint32 *handle;
它应该可以工作。
这个 API 的设计非常糟糕(依赖可变参数,带有格式说明符……人们不喜欢 C 的原因)。
我正在使用 BLUEZ 和 GLIB/D-BUS 连接 2 Raspberry Pi(还有一台笔记本电脑和一台 Raspberry Pi)。 到目前为止,我可以取得不错的进步。
编辑:根据@ukBaz 的好建议,我在我的笔记本电脑上使用 python client,我的 C 代码服务器在 Raspberry Pi.
在“服务器”上,我可以使用自定义服务 UUID 和串行 RFCOMM 配置文件 UUID 注册设备,并等待连接。与 python 客户端的连接工作正常,我可以看到有一个可用的处理程序(请参阅下面的代码以获取调试输出) 我正在使用这段代码(在 dbus 循环中,为了便于阅读而简化了代码):
static void new_connection(GDBusMethodInvocation *inv)
{
g_log(LOG_SERVER, G_LOG_LEVEL_MESSAGE, "New connection.");
GDBusMessage *msg = g_dbus_method_invocation_get_message(inv);
// This prints the output below this code snippet
gchar *content = g_dbus_message_print(msg, 2);
g_log(LOG_SERVER, G_LOG_LEVEL_INFO, "Message is:\n%s", content);
g_free(content);
GVariant *params = g_dbus_method_invocation_get_parameters(inv);
const char *object;
GVariant *properties;
gint32 *handle;
g_variant_get(params, "(oha{sv})", &object, &handle, &properties);
// Problem here, 'handle' is NULL
g_log(LOG_SERVER, G_LOG_LEVEL_INFO, "Object is [%s]\nHandle is [%ls]", object, handle);
GVariantIter iter;
g_variant_iter_init(&iter, properties);
display_properties(&iter);
}
这是输出:
New connection.
Message is:
Type: method-call
Flags: none
Version: 0
Serial: 32
Headers:
path -> objectpath '/org/bluez/jscturret'
interface -> 'org.bluez.Profile1'
member -> 'NewConnection'
destination -> ':1.18'
sender -> ':1.11'
signature -> signature 'oha{sv}'
num-unix-fds -> uint32 1
Body: (objectpath '/org/bluez/hci0/dev_00_AA_AA_AA_AA_AA', handle 0, @a{sv} {})
UNIX File Descriptors:
fd 7: dev=0:8,mode=0140777,ino=41101,uid=0,gid=0,rdev=0:0,size=0,atime=0,mtime=0,ctime=0
Object is [/org/bluez/hci0/dev_00_AA_AA_AA_AA_AA]
Handle is [(null)]
它显示有一个文件描述符 fd 7
但是当我读取 GVariant 参数时我得到 NULL
.
如何访问文件描述符?我的理解是我需要它才能 read/write from/to 客户。
我使用 https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/device-api.txt and https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc/adapter-api.txt 作为参考,这里还有一些其他帖子。 在 https://www.linumiz.com/.
中也得到了很多信息此处提供当前完整代码:btservice
哦!我很确定你应该发送一个指向整数的指针(而不是指向它的指针)。
你可以做到
gint32句柄; // 而不是 gint32 *handle;
它应该可以工作。
这个 API 的设计非常糟糕(依赖可变参数,带有格式说明符……人们不喜欢 C 的原因)。