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