使用DBus守护程序将消息从C应用程序交换到python应用程序

时间:2016-09-19 16:08:31

标签: python linux dbus

您好我是DBus守护程序的新手,并希望在C应用程序和python应用程序之间完成简单的消息交换,这些应用程序运行在类似自定义Linux的环境中。我的理解是

  1. 首先,从init文件启动dbus-daemon
  2. 将C应用程序和python应用程序注册到D-BUS
  3. 发送消息 (这只是一个简单的字符串)在这两个应用程序之间的总线上。
  4. 我的问题是关于上面的(2)和(3)。 C应用程序和python应用程序如何注册到同一总线?

    此外,需要调用哪些API来在这两个应用程序之间发送字符串消息?

2 个答案:

答案 0 :(得分:1)

[您要求简单传递消息]

你真的需要DBus吗?

如果您要求在C应用程序和Python之间传递简单的消息,为什么不使用像Rabbit / ZeroMQ这样的消息传递库?那些已经解决了与传递/接收消息相关的所有问题。

而且,如果要将依赖关系保持在最低限度,可以使用UNIX套接字甚至是一些简单的TCP / UDP数据报。

编辑:因为我试图说服你研究ZeroMQ作为你的IPC平台,它是多么简单,这里有一个示例C“客户端”向服务器发送一个完整的数据报,然后回复。

ZeroMQ Client Example in C:

// Hello World client
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>

int main ( void )
{
    printf ( "Connecting to hello world server…\n" );
    void *context   = zmq_ctx_new ();
    void *requester = zmq_socket ( context, ZMQ_REQ );
    zmq_connect ( requester, "tcp://localhost:5555" );

    int request_nbr;
    for ( request_nbr = 0; request_nbr != 10; request_nbr++ ) {
        char buffer [10];
        printf ( "Sending Hello %d…\n", request_nbr );
        zmq_send ( requester, "Hello", 5, 0 );
        zmq_recv ( requester, buffer, 10, 0 );
        printf ( "Received World %d\n", request_nbr );
    }
    zmq_close (requester);
    zmq_ctx_destroy (context);
    return 0;
}

服务器也很简单:

ZeroMQ Server Example in C

// Hello World server

#include <zmq.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

int main ( void )
{
    // Socket to talk to clients
    void *context   = zmq_ctx_new ();
    void *responder = zmq_socket ( context, ZMQ_REP );
    int rc = zmq_bind ( responder, "tcp://*:5555" );
    assert ( rc == 0 );

    while ( 1 ) {
        char buffer [10];
        zmq_recv ( responder, buffer, 10, 0 );
        printf ( "Received Hello\n" );
        sleep ( 1 );                                // Do some 'work'
        zmq_send ( responder, "World", 5, 0 );
    }
    return 0;
}

答案 1 :(得分:0)

每个Linux系统上有两个默认总线 - 系统总线(为所有用户共享,用于系统服务)和会话总线。所有DBus库都可以让您轻松连接到其中一个总线。

然后,在接收者进程中,您需要获取总线名称(将允许其他进程找到您的字符串)的所有权,并注册提供某些方法的对象。然后,您将能够从另一个进程调用这些方法。

C的最佳DBus API为https://developer.gnome.org/gio/stable/GDBusConnection.html,Python的最佳API为https://github.com/LEW21/pydbus