• Lv0
    粉丝0

积分26 / 贡献0

提问0答案被采纳0文章8

作者动态

[经验分享] Java使用Dbus介绍

liubo-688 显示全部楼层 发表于 2024-12-14 09:26:16

介绍

Dbus官网如下

dbus (www.freedesktop.org)

D-Bus 是一种 IPC 机制,它在低级别使用通过 Unix 套接字或 IP 传递的消息,将其消息建模为对远程对象的函数调用或从它们发出的信号。

关键词

Bus Names

总线上的程序由总线发出一个唯一的标识符。这保证在总线的一次运行中是唯一的,但会按顺序分配给每个新连接。 也有所谓的知名的总线名称,设备可以在总线上申请。这些名字的形式是 "org.freedesktop.DBus"。

Interfaces

所有的方法调用和信号都是用一个接口来指定的,类似于Java中的接口。当执行一个方法或发送一个信号时,你指定该方法所属的接口。这些接口的形式是 "org.freedesktop.DBus"。

Object Paths

一个程序可以公开一个以上的对象,实现一个接口。格式为"/org/freedesktop/DBus"的对象路径

Member Names

方法和信号都有名字,在一个接口中识别它们。D-Bus不支持方法重载,每个名称只应存在一个方法或信号

Java中重要的dbus相关类

DBusConnection

该类为dbus的连接类,封装了dbus的连接信息

MethodCall

该类为java-dbus的基础的低级api类,用于承载调用method和signal的相关信息

Message

该类为java-dbus的基础的低级api类,在发起method和signal调用后,dbus总线的返回信息

DBusInterface

该类为java-dbus的高级api类,用于屏蔽不同进程间的差异,对dbus发起调用就跟调用本地函数一样,且其所有public的函数都会被封装成对dbus发起调用的member

其中实现改接口的类的全类名为“接口名”,函数名为“Member Name”,参数和返回值为通过dbus的被调用方的的参数和返回值

DBusInterfaceName

该类为java-dbus的高级api类,用于给上述的dbusInterface的“接口名”起一个别名

Java连接dbus

前期准备工作

  1. 首先需要在linux系统中保证dbus安装成功
  2. 添加DBUS_SESSION_BUS_ADDRESS环境变量,值为dbus的连接地址,格式如下

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-L2A1ul3pAv,guid=1012674c13c82faf43de7b9e632412d5 DBUS_SESSION_BUS_PID=516

  1. 在java中添加相应的包,一下列出来maven的例子
<dependency>

    <groupId>com.github.hypfvieh</groupId>

    <artifactId>dbus-java</artifactId>

    <version>相应版本</version>

</dependency>

发起一个dbus的简单调用

DBusConnection conn = null;

try {
// 创建session连接

    conn = DBusConnection.getConnection(DBusConnection.DBusBusType.SESSION);

// 创建一个用于发起调用的函数的抽象,其中busName为连接的总线名称,objectPath为对象路径,integerfaceName为接口名,methodName为函数名,sig为参数的格式,params为参数   
 MethodCall call = new MethodCall(busName, objectPath, interfaceName, methodName, (byte) 0, sig, (Object) params);
// 发起调用

    conn.sendMessage(call);
// 等待回复,改方法会阻塞

    Message reply = call.getReply();
// 获取返回的参数

    return reply.getParameters();

} catch (Exception e) {

 // 错误处理

} finally {
// 关闭连接

    if (conn != null && !conn.isConnected()) {

        conn.disconnect();

    }

}

©著作权归作者所有,转载或内容合作请联系作者

您尚未登录,无法参与评论,登录后可以:
参与开源共建问题交流
认同或收藏高质量问答
获取积分成为开源共建先驱

Copyright   ©2023  OpenHarmony开发者论坛  京ICP备2020036654号-3 |技术支持 Discuz!

返回顶部