我试图让dbus-send --address
使用地址127.0.0.1端口10010来处理我自己编写的自定义方法(com.example.Test.TestMethod
)。它本身并不是一件有用的事情,但我试图完成更多的事情,这是一个测试步骤。
首先,我确信自己的测试方法能够正常运行。在本地使用系统总线可以成功实现我的方法:
$ dbus-send --system --print-reply --type=method_call --dest=com.example.Test /com/example/Test com.example.Test.TestMethod string:foo
method return sender=:1.0 -> dest=:1.17 reply_serial=2
string "returning foo"
其次,使用--address
失败(我不明白为什么失败):
$ dbus-send --address=tcp:host=127.0.0.1,port=10010 --print-reply --type=method_call --dest=com.example.Test /com/example/Test com.example.Test.TestMethod string:foo
Error org.freedesktop.DBus.Error.NoReply: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.
dbus-monitor
绝对没有显示任何内容:
$ DBUS_VERBOSE=1 dbus-monitor --system
(nothing)
第三,在--address
上使用org.freedesktop.DBus.Hello
成功。我不知道为什么这会成功,而我的方法失败了:
$ dbus-send --address=tcp:host=127.0.0.1,port=10010 --print-reply --type=method_call --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.Hello
method return sender=org.freedesktop.DBus -> dest=:1.15 reply_serial=1
string ":1.15"
我对配置文件/etc/dbus-1/system.conf
进行了一些修改:
<auth>ANONYMOUS</auth>
<allow_anonymous/>
<listen>tcp:host=127.0.0.1,port=10010</listen>
<allow send_destination="com.example.Test"/>
<allow own="com.example.Test"/>
为了进行调试,我在DBUS_VERBOSE=1
上使用了dbus-send
,但我在输出中看不到任何用途。失败案例和成功案例的输出差异很小:
成功案例(org.freedesktop.DBus.Hello
):
[dbus/dbus-transport-socket.c(879):do_reading] read 89 bytes
[dbus/dbus-marshal-header.c(745):_dbus_header_have_message_untrusted] have 89 bytes, need body 9 + header 80 = 89
[dbus/dbus-marshal-validate.c(723):_dbus_validate_body_with_reason] validating body from pos 0 len 89 sig 'yyyyuua(yv)'
失败案例(com.example.Test.TestMethod
):
[dbus/dbus-transport-socket.c(873):do_reading] Disconnected from remote app
[dbus/dbus-transport.c(502):_dbus_transport_disconnect] start
[dbus/dbus-transport-socket.c(1017):socket_disconnect]
[dbus/dbus-transport-socket.c(76):free_watches] start
[dbus/dbus-watch.c(628):dbus_watch_set_data] Setting watch fd -1 data to data = (nil) function = (nil) from data = (nil) function = (nil)
[dbus/dbus-watch.c(628):dbus_watch_set_data] Setting watch fd -1 data to data = (nil) function = (nil) from data = (nil) function = (nil)
[dbus/dbus-transport-socket.c(98):free_watches] end
[dbus/dbus-transport.c(513):_dbus_transport_disconnect] end
我还使用dbus-daemon
启动了调试模式DBUS_VERBOSE=1
,但我无法在任何地方找到输出。它不在syslog中。我可能没有调试版本,但我发现不太可能dbus-send
和dbus-monitor
显然是调试版本。
我在会话总线上尝试了相同的实验,结果相同。
版本信息:
$ dbus-daemon --version
D-Bus Message Bus Daemon 1.6.8
$ cat /etc/debian_version
7.6
我的最终目标是使用D-bus在计算机之间传递消息。让dbus-send --address
为当地案件工作只是我迈出的第一步。
2014年10月16日更新:我能够让它发挥作用。解决方案是违反直觉的。
有两个要求。
您必须使用 SYSTEM 总线进行通信。 您必须设置 SESSION 总线地址环境变量。
$ DBUS_SESSION_BUS_ADDRESS=tcp:host=192.168.56.101,port=10010 dbus-send --print-reply --type=method_call --dest=com.example.Test /com/example/Test com.example.Test.TestMethod string:foo
答案 0 :(得分:0)
我认为这是因为dbus守护程序要求local secret并且您的客户端不知道如何阅读它。你能尝试用wireshirk转储整个握手吗? (或者,您可以使用我的dbus-dissect脚本,但可能需要一些源代码调整)