OpenHarmony开发者论坛

标题: Java使用Dbus介绍 [打印本页]

作者: liubo-688    时间: 2024-12-14 09:26
标题: Java使用Dbus介绍
[md]## 介绍

Dbus官网如下

[dbus (www.freedesktop.org)](https://www.freedesktop.org/wiki/Software/dbus/)

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

![](file:///C:/Users/zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg)

3. 在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();

    }

}
```

![](file:///C:/Users/zhang/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg)
[/md]




欢迎光临 OpenHarmony开发者论坛 (https://forums.openharmony.cn/) Powered by Discuz! X3.5