DBus 在Qt和C++中的利用Demo

郭卫东  金牌会员 | 2024-6-19 21:09:12 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 565|帖子 565|积分 1695

一、DBus
DBus(D-Bus)是一种跨历程通讯机制,是一种消息总线体系。DBus提供了一种在应用程序之间进行通讯和交互的方式,可以在不同的历程之间传递消息,并提供了一套API供开发者利用。


二、Qt中利用
功能:先获取当前用户的路径,在根据路径,通过属性获取用户的昵称。
   在 .pro 文件中添加 QtDBus 模块:
QT += core gui dbus
    QDBusInterface 参数:
  

  • D-Bus 服务的名称
  • DBus接口的对象路径
  • 接口名称(一个对象可以实现多个接口,每个接口提供不同的功能)
  • 指定利用哪个 D-Bus 总线进行通讯,体系总线是全局的,所有效户和服务都可以访问,而会话总线则特定于每个用户会话。
  1. #include <QtDBus/QDBusInterface>
  2. #include <QtDBus/QDBusReply>
  3. QString getUserPath()
  4. {
  5.         QString userName = qgetenv("USER");
  6.         const char* server = "org.freedesktop.Accounts";
  7.         const char* path = "/org/freedesktop/Accounts";
  8.         const char* interface = "org.freedesktop.Accounts";
  9.         QDBusInterface dbusInterface(server, path, interface, QDBusConnection::systemBus());
  10.         // 参数指定调用的方法,以及方法的参数
  11.         QDBusReply<QDBusObjectPath> reply = dbusInterface.call("FindUserByName", userName);
  12.         return reply.error().type() == QDBusError::NoError ? reply.value().path() : "";
  13. }
  14. void getNickName(const QString &userPath)
  15. {
  16.         const char* server = "org.freedesktop.Accounts";
  17.         const char* path = userPath.toLatin1().data();
  18.         const char* interface = "org.freedesktop.Accounts.User";
  19.         QDBusInterface dbusInterfaceTwo(server, path, interface, QDBusConnection::systemBus());  
  20.         QString nickName = dbusInterfaceTwo.property("RealName").toString();
  21.         qDebug() << "NickName:" << nickName;
  22. }
  23. int main()
  24. {
  25.         getNickName(getUserPath());
  26.         return 0;
  27. }
复制代码


三、C++中利用
实现上述同样的功能。
   

  • 安装DBus
    sudo apt-get install libdbus-1-dev
  • 编译(头文件大写i,链接库小写L)
    gcc two.c -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include/ -ldbus-1
  • 执行
    ./a.out
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dbus-1.0/dbus/dbus.h>
  4. DBusConnection *getDBusConnect()
  5. {
  6.     DBusError error;
  7.     dbus_error_init(&error);
  8.     DBusConnection *connect = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
  9.     if (dbus_error_is_set(&error)) {
  10.         fprintf(stderr, "Error connecting to system bus: %s\n", error.message);
  11.         dbus_error_free(&error);
  12.         return NULL;
  13.     }
  14.     return connect;
  15. }
  16.   
  17. void call_find_user_by_name(DBusConnection *connect, char **userPath) {
  18.     DBusMessage *message = dbus_message_new_method_call(
  19.         "org.freedesktop.Accounts",
  20.         "/org/freedesktop/Accounts",  
  21.         "org.freedesktop.Accounts",  
  22.         "FindUserByName"  
  23.     );
  24.     const char *userName = getenv("USER");
  25.     dbus_message_append_args(message, DBUS_TYPE_STRING, &userName, DBUS_TYPE_INVALID);
  26.     DBusError error;
  27.     dbus_error_init(&error);
  28.     DBusMessage *reply = dbus_connection_send_with_reply_and_block(connect, message, -1, &error);
  29.     // Failed
  30.     if (dbus_error_is_set(&error)) {
  31.         fprintf(stderr, "Error: %s\n", error.message);
  32.         dbus_error_free(&error);
  33.         return;
  34.     }
  35.     // Success
  36.     dbus_message_get_args(reply, NULL, DBUS_TYPE_OBJECT_PATH, userPath, DBUS_TYPE_INVALID);
  37.    
  38.     if (message)
  39.         dbus_message_unref(message);  
  40.     if (reply)
  41.         dbus_message_unref(reply);  
  42. }  
  43. void call_real_name(DBusConnection *connect, char *userPath) {
  44.     DBusMessage *message = dbus_message_new_method_call(  
  45.         "org.freedesktop.Accounts",  
  46.         userPath,
  47.         "org.freedesktop.DBus.Properties",  
  48.         "Get"
  49.     );  
  50.     const char *interface = "org.freedesktop.Accounts.User";
  51.     const char *property = "RealName";
  52.     if (!dbus_message_append_args(message, DBUS_TYPE_STRING, &interface, DBUS_TYPE_STRING, &property, DBUS_TYPE_INVALID)) {  
  53.         fprintf(stderr, "Out of memory\n");
  54.         dbus_message_unref(message);
  55.         return;
  56.     }  
  57.       
  58.     DBusError error;
  59.     dbus_error_init(&error);
  60.     DBusMessage *reply = dbus_connection_send_with_reply_and_block(connect, message, -1, &error);
  61.       
  62.     if (dbus_error_is_set(&error)) {  
  63.         fprintf(stderr, "Error getting property: %s\n", error.message);  
  64.         dbus_error_free(&error);
  65.         return;
  66.     }
  67.     DBusMessageIter args;
  68.     if (dbus_message_iter_init(reply, &args) && dbus_message_iter_get_arg_type(&args) == DBUS_TYPE_VARIANT) {  
  69.         DBusMessageIter variant;  
  70.         dbus_message_iter_recurse(&args, &variant);  
  71.   
  72.         // VARIANT is a string
  73.         if (dbus_message_iter_get_arg_type(&variant) == DBUS_TYPE_STRING) {
  74.             char *nickName = NULL;
  75.             dbus_message_iter_get_basic(&variant, &nickName);
  76.             printf("Nickname: %s\n", nickName);
  77.         }
  78.     }  
  79.     if (message)
  80.         dbus_message_unref(message);
  81.     if (reply)
  82.         dbus_message_unref(reply);
  83. }
  84.   
  85. int main()
  86. {
  87.     DBusConnection *connect = getDBusConnect();
  88.     char *userPath = NULL;
  89.     call_find_user_by_name(connect, &userPath);  // 二级指针:可以用来返回多个值,作为输出型参数
  90.     call_real_name(connect, userPath);
  91.     dbus_connection_unref(connect);
  92.     return 0;  
  93. }  
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

郭卫东

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表