通过 TCP 连接到 DBus 服务

Posted

技术标签:

【中文标题】通过 TCP 连接到 DBus 服务【英文标题】:Connect to DBus service via TCP 【发布时间】:2018-01-11 02:02:28 【问题描述】:

我是处理进程间通信的新手。我需要你的帮助和清晰的解释。我有 2 个应用程序。其中一个是服务,一个是客户端。我使用 QT/C++ 编写它们。当他们在一台本地 PC 上工作时 - 一切都很好。但我需要将它们分开。

所以,我有一个 IP 为 192.30.82.101 的 PC 上的服务。 我使用下一个代码将它连接到总线:

QDBusConnection connection = QDBusConnection::sessionBus();
connection.registerObject("/my/service/MyService", mySvc);
connection.registerService("my.service.MyService");

另外,我在另一台 IP 为 192.30.82.40 的 PC 上有一个客户端。 我使用下一个代码连接我的客户端:

QDBusServiceWatcher serviceWatcher = new QDBusServiceWatcher(); 
serviceWatcher->setConnection(QDBusConnection::sessionBus());
serviceWatcher->addWatchedService("my.service.MyService");     

.....

    myServiceProxy = new local::MyService("my.service.MyService", 
                   "/my/service/MyService", QDBusConnection::sessionBus(), this);

我需要将 IP 为 192.30.82.40 的 PC 上的客户端连接到 PC 192.30.82.101 上的服务。我不知道该怎么做。我在论坛上找到了一些主题,但我仍然不明白该怎么做。

所以,我发现了什么:

    在我的服务所在的 PC 上,我必须向 /etc/dbus-1/session.conf 添加额外的行:

<listen>tcp:host=<host>,port=<port></listen>

<listen>unix:tmpdir=/tmp</listen>

<auth>ANONYMOUS</auth>

<allow_anonymous/>

这里我有一个问题:我必须在这里使用哪个 IP 地址(服务器或客户端)?哪个端口用于 DBUS(它是默认端口还是我如何检查它)?我尝试设置客户端 PC、服务 PC 和不同端口以及端口 0 的 IP 地址,但出现错误:无法绑定套接字“172.30.82.40:0”:无法分配请求的地址。

    在客户端,我必须将 DBUS_SESSION_BUS_ADDRESS 设置为相同的地址:export DBUS_SESSION_BUS_ADDRESS=tcp:host=<host>,port=<port>

我尝试使用不同的端口(使用 0 端口)来执行此操作,因为这意味着 - 使用任何空闲端口。但我无法使用任何端口+IP 配置启动总线守护程序。

我还尝试使用以下代码将客户端 QDBusServiceWatcher 连接到总线:

serviceWatcher->setConnection(QDBusConnection::connectToBus("tcp:host=<host>,port=<port>", "session"));

没有成功。 我不知道如何将它们相互连接。 请任何人解释一下它应该是怎样的,它是如何工作的? 我想清楚地了解它是如何工作的?

如果有任何帮助,我将不胜感激。我希望你的好意。

更新 我找到了如何通过 TCP 将我的客户端连接到 DBus 总线:

    在我的服务所在的 PC 上,我必须向 /etc/dbus-1/session.conf 添加额外的行:

&lt;listen&gt;tcp:host=localhost,bind=*,port=6667,family=ipv4&lt;/listen&gt;

&lt;listen&gt;unix:tmpdir=/tmp&lt;/listen&gt;

&lt;auth&gt;ANONYMOUS&lt;/auth&gt;

&lt;allow_anonymous/&gt;

这里我们应该添加 PORT。我们可以在 dbus 配置文件中找到它。

    在客户端,我必须设置 DBUS_SESSION_BUS_ADDRESS 和相应的地址(服务所在的 PC 的 IP): export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4

仅此而已。我们可以检查一下刚刚启动的 dbus-monitor。

但现在我有另一个问题:如何将我的客户端连接到我的服务? 我需要做更多的事情来连接到我的服务。 我想这是这样的:

QDBusConnection::connectToBus("tcp:host=<host>,port=<port>","connectionName");

我尝试使用任何随机名称进行连接,但这是不正确的。 所以,我的问题是 - 在哪里可以获得正确的连接名称?

【问题讨论】:

嗨Елена)))D-Bus Chat Example 或QtDbus项目乒乓球) 对不起,我在这里找不到任何关于 TCP DBus 通信的信息。在这里,客户端和服务在同一台 PC 上工作,并且肯定在一个总线会话上注册。 Please read this 【参考方案1】:

我的问题的正确答案是:

    在有一个应用程序的 PC 上添加额外的行 /etc/dbus-1/session.conf: &lt;listen&gt;tcp:host=localhost,bind=*,port=6667,family=ipv4&lt;/listen&gt;

    &lt;listen&gt;unix:tmpdir=/tmp&lt;/listen&gt;

    &lt;auth&gt;ANONYMOUS&lt;/auth&gt;

    &lt;allow_anonymous/&gt;

    您可以在 dbus 配置文件中找到正确的端口。

    在客户端需要设置 DBUS_SESSION_BUS_ADDRESS 对应地址(服务所在PC的IP):export DBUS_SESSION_BUS_ADDRESS=tcp:host=192.50.88.10,port=6667,family=ipv4.

    要连接到远程应用程序处于活动状态的会话,请使用下一个 连接字符串:

    DBusConnection::connectToBus("tcp:host=192.50.88.10,port=6667", "qt_default_session_bus")); 
    

    如何知道会话名称?我已经在我的服务中添加了登录:

    qDebug() << "Connection name: " << connection.name(); 
    

    然后启动应用程序,复制打印的名称并将其设置在我的客户端中。

现在可以了!

【讨论】:

Intercomunicate processes in different(remote) machines through DBus Connect to session DBus on different computer

以上是关于通过 TCP 连接到 DBus 服务的主要内容,如果未能解决你的问题,请参考以下文章

连接到不同计算机上的会话 DBus

无法从 ubuntu 中的服务连接到会话 dbus

systemd 服务无法连接到会话 d-bus

PyQt 5.6:连接到 DBus 信号挂起

如何通过 TCP 使用 ADB 连接到 Android? [关闭]

如何使用 Perl 通过 TCP 和 UDP 连接到远程机器?