Getting Started with D-Bus on Raspberry Pi 4B
Table of contents
The purpose of this post is initial testing of c / c++ applications using D-Bus on Raspberry Pi.
D-Bus is a message-oriented middleware mechanism that allows communication between multiple processes running concurrently on the same machine.
I found a few examples. The goal is to attempt these basic applications to ensure proper build and configuration prior to moving on to something more real.
dbus-test
This example demonstrates the introspection capabilities of D-Bus.
D-Bus services publish their interfaces. This can be retrieved and analyzed during runtime, in order to understand the used implementation.
pi@raspberrypi:~ $ ./dbus-test
Connected to D-Bus as ":1.89".
Introspection Result:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.freedesktop.DBus">
<method name="Hello">
<arg direction="out" type="s"/>
</method>
<method name="RequestName">
<arg direction="in" type="s"/>
<arg direction="in" type="u"/>
<arg direction="out" type="u"/>
</method>
<method name="ReleaseName">
<arg direction="in" type="s"/>
<arg direction="out" type="u"/>
</method>
<method name="StartServiceByName">
<arg direction="in" type="s"/>
<arg direction="in" type="u"/>
<arg direction="out" type="u"/>
</method>
<method name="UpdateActivationEnvironment">
<arg direction="in" type="a{ss}"/>
</method>
<method name="NameHasOwner">
<arg direction="in" type="s"/>
<arg direction="out" type="b"/>
</method>
<method name="ListNames">
<arg direction="out" type="as"/>
</method>
<method name="ListActivatableNames">
<arg direction="out" type="as"/>
</method>
<method name="AddMatch">
<arg direction="in" type="s"/>
</method>
<method name="RemoveMatch">
<arg direction="in" type="s"/>
</method>
<method name="GetNameOwner">
<arg direction="in" type="s"/>
<arg direction="out" type="s"/>
</method>
<method name="ListQueuedOwners">
<arg direction="in" type="s"/>
<arg direction="out" type="as"/>
</method>
<method name="GetConnectionUnixUser">
<arg direction="in" type="s"/>
<arg direction="out" type="u"/>
</method>
<method name="GetConnectionUnixProcessID">
<arg direction="in" type="s"/>
<arg direction="out" type="u"/>
</method>
<method name="GetAdtAuditSessionData">
<arg direction="in" type="s"/>
<arg direction="out" type="ay"/>
</method>
<method name="GetConnectionSELinuxSecurityContext">
<arg direction="in" type="s"/>
<arg direction="out" type="ay"/>
</method>
<method name="ReloadConfig">
</method>
<method name="GetId">
<arg direction="out" type="s"/>
</method>
<method name="GetConnectionCredentials">
<arg direction="in" type="s"/>
<arg direction="out" type="a{sv}"/>
</method>
<property name="Features" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<property name="Interfaces" type="as" access="read">
<annotation name="org.freedesktop.DBus.Property.EmitsChangedSignal" value="const"/>
</property>
<signal name="NameOwnerChanged">
<arg type="s"/>
<arg type="s"/>
<arg type="s"/>
</signal>
<signal name="NameLost">
<arg type="s"/>
</signal>
<signal name="NameAcquired">
<arg type="s"/>
</signal>
</interface>
<interface name="org.freedesktop.DBus.Introspectable">
<method name="Introspect">
<arg direction="out" type="s"/>
</method>
</interface>
<interface name="org.freedesktop.DBus.Peer">
<method name="GetMachineId">
<arg direction="out" type="s"/>
</method>
<method name="Ping">
</method>
</interface>
<node name="org/freedesktop/DBus"/>
</node>
dbus-test2
This example demonstrates sending and receiving signals between two processes.
Note: I haven’t yet looked into the error message in the output below… TBD.
Sender
pi@raspberrypi:~ $ sudo ./dbus-test2 send testmsg1
Sending signal with value testmsg1
Signal Sent
dbus[3872]: Applications must not close shared connections - see dbus_connection_close() docs. This is a bug in the application.
D-Bus not built with -rdynamic so unable to print a backtrace
Aborted
pi@raspberrypi:~ $ sudo ./dbus-test2 send testmsg2
Sending signal with value testmsg2
Signal Sent
dbus[3874]: Applications must not close shared connections - see dbus_connection_close() docs. This is a bug in the application.
D-Bus not built with -rdynamic so unable to print a backtrace
Aborted
pi@raspberrypi:~ $
Receiver
pi@raspberrypi:~ $ sudo ./dbus-test2 receive
Listening for signals
Match rule sent
Got Signal with value testmsg1
Got Signal with value testmsg2