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
}
}
}