python实现c++中so库调用及dbus服务开发-CSDN博客
之前写的这篇博文介绍了如何创建一个dbus服务,但是注册的接口方法的入参还是比较简单的,实际上dbus的参数类型有很多种,调用方式也有多种,我们来逐一介绍下。
其实基础数据类型,如字符串、整型、浮点型、布尔型等大多数情况下可以直接输入value值,便不再重点介绍,本文着重讲解c++语言中的variant类型如何传参。
建议阅读此文章前,先阅读dbus签名类型;
前置准备
注册一个dbus服务,假设图中的方法入参是compare_data(Sting uuid, int32 num, Variant param);
python通过dbus库调用
def dbus_client_request(uuid, num, variant):"""通过dbus模块调用dbus接口variant:传参时通过以下方式定义,会自动转为variant类型基础类型:dbus.Boolean、dbus.Byte、dbus.Int16、dbus.Int32、dbus.Int64、dbus.UInt16、dbus.UInt32、dbus.UInt64、dbus.Double、dbus.String数组类型:dbus.ByteArray([1,2])、dbus.Array([1, 2], signature='q')结构体:dbus.Struct([(1, 2), (3,4)], signature='(ii)')Map类型:dbus.Dictionary({1.1:"hello", 2.3:"world"}, signature='ds')、嵌套Map类型:dbus.Dictionary({1.1:{1:"hello"}, 2.3:{2:"world"}}, signature='da{is}')Map包含variant类型:dbus.Dictionary({"name": "rose", "age": 10, "height": True}, signature='sv', variant_level=1)"""# 创建一个SessionBus对象连接一个会话总线session_bus = dbus.SessionBus()# 调用get_object方法来获取代理对象obj = session_bus.get_object('com.csdn.test.Test', '/com/csdn/test/Test').get_dbus_method()# 构造一个dbus.Interface的对象,通过这个对象调用方法inter = dbus.Interface(obj, 'com.example.sample')# 调用接口下的compare_data方法result = inter.compare_data(uuid, num, variant)# 返回接口方法的返回return result# val = dbus.Int16(56)
# val = dbus.String('test')
# val = dbus.Dictionary({
# 'artUrl': '',
# 'artist': ['None'],
# 'title': 'None',
# 'xalbum': 'None'
# }, signature='sv', variant_level=1)# res &