寻找一个简单的教程。
我需要通过DBus(纯C)发送和接收二进制数据。
我找到的所有教程都使用DBUS_TYPE_STRING,但我有一个二进制数据块。
这样思考用法:
void write_msg(DbusConnection *conn, void *data, size_t datasize) {
DBusMessage *msg = dbus_message_new(DBUS_TYPE_ARRAY); // Is it DBUS_TYPE_ARRAY?
// how to convert data of datasize into msg?
dbus_connection_send(conn, msg, NULL);
dbus_free(msg); // there is no dbus_message_free() function?
}
void read_msg(DbusConnection *conn, void *data, size_t datasize) {
DBusMessage *msg = dbus_connection_pop_message(conn);
// how to convert msg to data of datasize?
dbus_free(msg);
}
// And to use it as:
struct my_struct st;
write_msg(conn, &st, sizeof(st));
那么,如何将一个非类型化的内存块写入/读取到DBusMessage中呢?让它像在套接字中写/读数据报一样简单?
1条答案
按热度按时间9jyewag01#
不,这是 message 类型,不是数据类型。D-Bus有“方法调用”和“信号”作为两种主要的消息类型-如果您通过D-Bus调用函数(方法),您应该指定
DBUS_MESSAGE_TYPE_METHOD_CALL
,或使用dbus_message_new_method_call()
函数。那么,如何将一个非类型化的内存块写入/读取到DBusMessage中呢?
D-Bus中的二进制数据通常以
ay
类型传输-“字节数组”。虽然我对dbus-glib不是很熟悉,但我查看了wpa_supplicant的源代码(hostap.git)作为示例,我认为您正在寻找:
1.数组以
dbus_message_iter_open_container(&val, DBUS_TYPE_ARRAY, "y", &iter)
开始,1.使用
dbus_message_iter_append_fixed_array()
写入数据(或者,您可以为内存块的每个字节循环
dbus_message_iter_append_basic(&iter, DBUS_TYPE_BYTE, &(val[i]))
),1.使用
dbus_message_iter_close_container(&iter)
完成让它像在套接字中写/读数据报一样简单?
如果您所需要的只是通过套接字传输数据报,那么D-Bus可能不适合您。你不能完全摆脱它的结构(方法调用/返回格式和对象和接口系统)--如果你这样做了,那么使用D-Bus的意义何在?
但是,请尝试使用GLib 2(GDBus)或systemd的“sd-bus”作为更易于使用的C库。(您正在使用的dbus-glib库大多被认为是不推荐使用的,而倾向于通过GLib使用GDBus;它将永远保持工作,但不再真正维护。)
此外,请记住,D-Bus并不适用于大容量流量。通过私有套接字是可以的,但是共享系统(或会话)总线将对可接受的内容有限制。
如果你真的需要一个原始的Unix套接字,那么 * 使用套接字 * -例如,你可以创建一个socketpair(),通过D-Bus调用传递一个文件描述符(使用
h
值),然后通过套接字继续所有通信。一些程序已经做到了这一点,甚至dbus-daemon维护人员也建议需要高通信量或非结构化通信的程序这样做。