dbus-glib和gdbus通信

dbus-glib和gdbus通信

参考

https://blog.csdn.net/fddnihao/article/details/130402719
dbus-glib 和 GDBus 的区别
https://blog.csdn.net/billxin2012/article/details/46347789
https://dbus.freedesktop.org/doc/dbus-specification.html#stability
https://docs.gtk.org/gio/migrating-gdbus.html
https://www.systutorials.com/docs/linux/man/1-gdbus-codegen/#lbAK

DBUS-GLIB 说明文档

DBus 入门与应用 -- DBus 的 C 编程接口
https://www.cnblogs.com/muxue/archive/2012/12/02/2798876.html
DBus 入门与应用--基本概念 上(C API 级别的使用观点)
https://www.cnblogs.com/muxue/archive/2012/12/06/2806305.html
通信数据的设置和获取
DBus 入门与应用--基本概念 下(C API 级别的使用观点)
https://www.cnblogs.com/muxue/archive/2012/12/09/2810638.html

https://dbus.freedesktop.org/doc/dbus-glib/index.html
https://www.freedesktop.org/wiki/Software/DBusBindings/
https://dbus.freedesktop.org/doc/dbus-glib/index.html
http://maemo.org/maemo_training_material/maemo4.x/html/maemo_Platform_Development_Chinook/Chapter_03_Using_the_GLib_wrappers_for_DBus.html#UsingtheGLibDBuswrapperfromaclient

dbus-glib编程3:消息和消息总线 dbus-send的使用
https://blog.csdn.net/cyf15238622067/article/details/108357007
https://blog.csdn.net/cyf15238622067/article/details/108345373
https://cgit.freedesktop.org/dbus/dbus-python/tree/examples/example-client.py
dbus-python指南
https://blog.csdn.net/chuangjinweilai/article/details/52033952

https://dbus.freedesktop.org/doc/dbus-python/tutorial.html

/usr/include/dbus-1.0/dbus
grep -r “org_freedesktop_DBus_request_name”

dbus-glib-bindings.h:org_freedesktop_DBus_request_name (DBusGProxy *proxy, const char * IN_arg0, const guint IN_arg1, guint* OUT_arg2, GError **error)
dbus-glib-bindings.h:typedef void (*org_freedesktop_DBus_request_name_reply) (DBusGProxy *proxy, guint OUT_arg2, GError *error, gpointer userdata);
dbus-glib-bindings.h:org_freedesktop_DBus_request_name_async_callback (DBusGProxy *proxy, DBusGProxyCall *call, void *user_data)
dbus-glib-bindings.h:  (*(org_freedesktop_DBus_request_name_reply)data->cb) (proxy, OUT_arg2, error, data->userdata);
dbus-glib-bindings.h:org_freedesktop_DBus_request_name_async (DBusGProxy *proxy, const char * IN_arg0, const guint IN_arg1, org_freedesktop_DBus_request_name_reply callback, gpointer userdata)
dbus-glib-bindings.h:  return dbus_g_proxy_begin_call (proxy, "RequestName", org_freedesktop_DBus_request_name_async_callback, stuff, _dbus_glib_async_data_free, G_TYPE_STRING, IN_arg0, G_TYPE_UINT, IN_arg1, G_TYPE_INVALID);

static inline gboolean
org_freedesktop_DBus_request_name (DBusGProxy *proxy, const char * IN_arg0, const guint IN_arg1, guint* OUT_arg2, GError **error)
{
    
    
  return dbus_g_proxy_call (proxy, "RequestName", error, G_TYPE_STRING, IN_arg0, G_TYPE_UINT, IN_arg1, G_TYPE_INVALID, G_TYPE_UINT, OUT_arg2, G_TYPE_INVALID);
}


二、DBus API
glib API中有两种可以用的,分别是dbus-glib和gdbus,dbus-glib是一种老的API,现在不推荐使用了,gdbus是从glib2.26开始添加的,目前推荐使用。gdbus和glib-dbus都是GNU组织开发的,gdbus可以认为是dbus-glib的升级版,其编程过程比起dbus-glib来要简单得多。

三、DBus 开发
多进程之间需要通信,可能有一对一,可能有一对多,多对多的通信方式。为简单起见,我们假设某个系统中就只有两个进程需要通信——我们称之为Server和Client。基于GDBus的进程间通信,首先就是要定义好Server和Client之间的通信接口。在GDBus编程框架下,我们使用xml文件来描述接口,然后通过GDbus提供的工具生成对应的C/C++代码。
通常应用的组织形式如下,服务端发布的时候同时提供接口库供其他客户端程序调用,客户端连接接口库即可,像正常的接口调用,如下图,下面我们通过一个设置、获取一个人姓名和年龄,并且设置完姓名和年龄后会广播给所有客户端的程序来学习一下GDBus。

dbus-glib中导出对象的典型方法是使用dbus-binding-tool根据XML内省数据生成代码,GDBus也提供了一个类似的工具叫做gdbus-codegen,这个工具也可以生成Docbook D-Bus接口文件.
GDBus提供API来解析、生成 和 工作的内省XML,dbus-glib不提供。
dbus-glib使用 libdbus reference implementation,GDBus不使用,而是依赖GIO流作为传输层,并且拥有一套自己实现的D-Bus连接设置和授权的方法.暂且不说GDBus使用流传输,
不使用libdbus可以使GDBus避免一些多线程方面的问题.

DBUS是个3层架构的进程间通信系统,包括:

  1. 函数库libdbus,用于两个应用程序呼叫联系和交互消息。

  2. Message bus daemon,总线守护进程可同时与多个应用程序相连,并能把来自一个应用程序的消息路由到0或者多个其他程序。

  3. 一系列基于特定应用程序框架的Wrapper库。 比如libdbus-glib, libdbus-python.

那么使用DBUS无非就这几种方式:

1.使用low-level APIs,即C API,libdus库。官方给出的说法是不建议直接使用C API做开发,很多的C API 只是用来binding更高层的接口而设计的,如果要使用它来做开发测试,可以参考http://www.cnblogs.com/liyiwen/archive/2012/12/02/2798876.html

2.使用特定应用程序框架库,或者说DBusBindings

官方文档是[http://www.freedesktop.org/wiki/Software/DBusBindings/](http://www.freedesktop.org/wiki/Software/DBusBindings/)

2.1 dbus-glib

这个DBUS接口封装,官方文档上已经明确说明废弃了,网上有大量资料都是关于这个接口封装的介绍。

http://www.csdn123.com/html/topnews201408/90/1190.htm

这篇文章对dbus-glib的使用做了详细的介绍,如果要使用dbus-glib做开发,可以参考。

http://blog.csdn.net/fmddlmyy/article/details/3585730

这篇文章使用dbus-glib,提供了一个method call 的完成例子,参考价值较大。

2.2 GDBus

这是官方推荐的使用DBUS的接口封装,使用方法后续补上。

2.3 dbus-python

使用python调试DBUS比较简单,具体安装及使用见官方文档

sudo apt-get install libdbus-1-dev
sudo apt-get install libdbus-glib-1-dev
sudo apt-get install libdbus-glib-1-dev
pip install dbus-python
pip3 install dbus-python==1.2.18

https://dbus.freedesktop.org/doc/dbus-python/

在这里插入图片描述

dbus服务端与客户端开发(python)
https://arv000.blog.csdn.net/article/details/120521766

open-fprintd-0.6

from binascii import hexlify, unhexlify
from binascii import hexlify
from struct import pack, unpack

在这里插入图片描述
11
python-validity-0.14/scripts
在这里插入图片描述

#!/usr/bin/env python3

import sys

import dbus.mainloop.glib

dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)

bus = dbus.SystemBus()
o = bus.get_object('net.reactivated.Fprint', '/net/reactivated/Fprint/Manager', introspect=False)
o = o.GetDefaultDevice()
o = bus.get_object('net.reactivated.Fprint', o, introspect=False)
o = dbus.Interface(o, 'net.reactivated.Fprint.Device')
print(o.RunCmd(sys.argv[1]))

猜你喜欢

转载自blog.csdn.net/wowocpp/article/details/131090259