Nemo Mobile D-Bus QML 플러그인을 사용하면 시스템 및 세션 버스의 서비스에 액세스하고 자체 서비스를 제공할 수 있다. D-Bus는 프로세스 간 통신에 사용된다.
저장소: https://github.com/sailfishos/nemo-qml-plugin-dbus
이 모듈에는 다음 QML 유형이 제공된다.
세션 버스 개체에서 함수 호출
import QtQuick 2.0
import Nemo.DBus 2.0
Item {
    DBusInterface {
        id: profiled
        service: 'com.nokia.profiled'
        iface: 'com.nokia.profiled'
        path: '/com/nokia/profiled'
    }
    Component.onCompleted: {
        // Call the "set_profile" method here
        profiled.call('set_profile', ['silent']);
    }
}
함수 호출 및 반환 값 얻기
import QtQuick 2.0
import Nemo.DBus 2.0
Item {
    DBusInterface {
        id: profiled
        service: 'com.nokia.profiled'
        iface: 'com.nokia.profiled'
        path: '/com/nokia/profiled'
    }
    Component.onCompleted: {
        // Call the "get_profile" method without arguments, and
        // when it returns, call the passed-in callback method
        profiled.typedCall('get_profile', [], function (result) {
            // This will be called when the result is available
            console.log('Got profile: ' + result);
        });
    }
}
D-Bus 객체의 시그널 수신
import QtQuick 2.0
import Nemo.DBus 2.0
Item {
    DBusInterface {
        id: profiled
        service: 'com.nokia.profiled'
        iface: 'com.nokia.profiled'
        path: '/com/nokia/profiled'
        signalsEnabled: true
        function profile_changed(changed, active, profile, values) {
            if (changed && active)
                console.log("Profile changed to:", profile)
        }
    }
}
ConnMan 의 D-Bus 제어 인터페이스를 통해 네트워크 연결 상태 감지
ConnMan은 Linux 를 실행하는 임베디드 장치에 중점을 둔 인터넷 연결 관리자다. 인터넷 연결을 관리하기 위한 연결 관리 데몬(connmand)이 있고 이 데몬은 D-Bus 제어 인터페이스를 제공한다. 따라서 응용프로그램은 D-Bus를 사용하여 ConnMan 서비스를 이용할 수 있다.
다음은 DBusInterface 개체를 통해 QML에서 간단하게 connmand 과 연결하고 인터넷 연결 상태가 바뀔 때마다 UI에 표시하는 방법을 보여준다.
import QtQuick 2.15
import QtQuick.Window 2.15
import Nemo.DBus 2.0
Window {
    width: 640
    height: 480
    visible: true
    title: qsTr("Network State")
    DBusInterface {
        id: connmanManager
        // Connman on the D-Bus system bus
        bus: DBus.SystemBus
        service: 'net.connman'
        iface: 'net.connman.Manager'
        path: '/'
        signalsEnabled: true
        // Will be called when the "PropertyChanged" signal is received.
        function propertyChanged(p, v) {
            console.log("Property Changed:", p, v)
            if ( p === 'State' ) {
                state.text = v
            }
        }
    }
    Column {
        anchors.centerIn: parent
        Text {
            id: stateLabel
            text: "네트워크 상태"
            font.pixelSize: 28
            horizontalAlignment: Text.AlignHCenter
        }
        Text {
            id: state
            width: parent.width
            font.pixelSize: 22
            horizontalAlignment: Text.AlignHCenter
        }
    }
}
