C++ 如何使用dbus接收作为信号发送的结构?
我创建了一个可以发送信号字符串的程序和一个可以读取该字符串的ohter应用程序。我使用dbusapi。现在我需要发送一个struct对象作为信号。以下是代码发送过程中最重要的部分:C++ 如何使用dbus接收作为信号发送的结构?,c++,c,ubuntu-12.04,dbus,C++,C,Ubuntu 12.04,Dbus,我创建了一个可以发送信号字符串的程序和一个可以读取该字符串的ohter应用程序。我使用dbusapi。现在我需要发送一个struct对象作为信号。以下是代码发送过程中最重要的部分: struct x { int a; char *b; int c; } obj; DBusMessageIter myMsgItrA, myMsgItrB; dbus_message_iter_init_append(msg, &myMsgItrA); dbus_message_ite
struct x
{
int a;
char *b;
int c;
} obj;
DBusMessageIter myMsgItrA, myMsgItrB;
dbus_message_iter_init_append(msg, &myMsgItrA);
dbus_message_iter_open_container(&myMsgItrA, DBUS_TYPE_STRUCT, NULL, &myMsgItrB);
dbus_message_append_basic(&myMsgItrB, DBUS_TYPE_INT32, &obj.a);
dbus_message_append_basic(&myMsgItrB, DBUS_TYPE_STRING, &obj.b);
dbus_message_append_basic(&myMsgItrB, DBUS_TYPE_INT32, &obj.c);
dbus_message_close_container(&myMsgItrA, &myMsgItrB);
如何接收该信号?我已经使用dbus_message_iter_get_basic作为基本类型初始化迭代器到消息并使用它解析dbus签名的各个元素。使用dbus_message_iter_next移动到dbus message的下一个单独元素,使用dbus_message_iter_recurse进入一个复杂的单独元素
EG:考虑签名SIUA{IS }。单个元素是s和iua{is}。 使用dbus_message_iter_init初始化顶级迭代器
使用dbus_message_iter_next从s移动到iua{is} 一旦将迭代器指向iua{is},使用dbus_message_iter_recurse将子迭代器初始化到此元素,并使用子迭代器进一步解析 对于签名isi,解析如下所示DBusMessageIter rootIter;
dbus_message_iter_init(msg, &rootIter);
if (DBUS_TYPE_STRUCT == dbus_message_iter_get_arg_type(&rootIter))//Get type of argument
{
//Initialize iterator for struct
DBusMessageIter structIter;
dbus_message_iter_recurse(&rootIter, &structIter);
//Argument 1 is int32
if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&structIter))
{
int a;
dbus_message_iter_get_basic(&structIter, &a);//Read integer
dbus_message_iter_next(&structIter);//Go to next argument of structiter
//Arg 2 should be a string
if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&structIter))
{
char* str = NULL;
dbus_message_iter_get_basic(&structIter, &str);//this function is used to read basic dbus types like int, string etc.
dbus_message_iter_next(&structIter);//Go to next argument of root iter
//Argument 3 is int32
if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&structIter))
{
int c;
dbus_message_iter_get_basic(&structIter, &c);//Read integer
//PARSING SHOULD END HERE ON SUCCESS
}
}
}
}
初始化消息的迭代器&使用它解析dbus签名的各个元素。使用dbus_message_iter_next移动到dbus message的下一个单独元素,使用dbus_message_iter_recurse进入一个复杂的单独元素
EG:考虑签名SIUA{IS }。单个元素是s和iua{is}。 使用dbus_message_iter_init初始化顶级迭代器
使用dbus_message_iter_next从s移动到iua{is} 一旦将迭代器指向iua{is},使用dbus_message_iter_recurse将子迭代器初始化到此元素,并使用子迭代器进一步解析 对于签名isi,解析如下所示DBusMessageIter rootIter;
dbus_message_iter_init(msg, &rootIter);
if (DBUS_TYPE_STRUCT == dbus_message_iter_get_arg_type(&rootIter))//Get type of argument
{
//Initialize iterator for struct
DBusMessageIter structIter;
dbus_message_iter_recurse(&rootIter, &structIter);
//Argument 1 is int32
if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&structIter))
{
int a;
dbus_message_iter_get_basic(&structIter, &a);//Read integer
dbus_message_iter_next(&structIter);//Go to next argument of structiter
//Arg 2 should be a string
if (DBUS_TYPE_STRING == dbus_message_iter_get_arg_type(&structIter))
{
char* str = NULL;
dbus_message_iter_get_basic(&structIter, &str);//this function is used to read basic dbus types like int, string etc.
dbus_message_iter_next(&structIter);//Go to next argument of root iter
//Argument 3 is int32
if (DBUS_TYPE_INT32 == dbus_message_iter_get_arg_type(&structIter))
{
int c;
dbus_message_iter_get_basic(&structIter, &c);//Read integer
//PARSING SHOULD END HERE ON SUCCESS
}
}
}
}
我假设您在信号接收器端到端上有一些解组代码,并以与封送相同的方式解释内容。我假设您在信号接收器端到端上有一些解组代码,并以与封送相同的方式解释内容。