Python Forum
QtDBus: how to call GetManagedObjects from bluez
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
QtDBus: how to call GetManagedObjects from bluez
#1
I want to list and extract all trusted bluetooth device by using QtDbus. With the qdbusviewer tool, I can see and call the method GetManagedObjects() just fine. Then I tried to do it in python, but the method cannot be found. The script below output ['Method "GetManagedObjects" with signature "" on interface "org.freedesktop.DBus.ObjectManager" doesn\'t exist']. What am I doing wrong?

#!/usr/bin/python3
import sys
from PyQt5 import QtWidgets, QtDBus

class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        bus = QtDBus.QDBusConnection.systemBus()
        interface = QtDBus.QDBusInterface("org.bluez", "/org/bluez", "org.freedesktop.DBus.ObjectManager", bus)
        result = interface.call("GetManagedObjects")
        print(result.arguments())


if __name__== '__main__':
    app = QtWidgets.QApplication([])
    gui = Main()
    sys.exit(app.exec_())
Reply
#2
In case anyone would like to do something similar, here is how I've done it. It list all bluetooth nodes and it's trusted devices. As read here, the trick was to use freedesktop interface to use the Get method on org.bluez.Device1.

#!/usr/bin/python3
import sys
import xml.etree.ElementTree as ET
from PyQt5 import QtCore, QtGui, QtWidgets, QtDBus

class Main(QtCore.QObject):
    def __init__(self):
        super().__init__()
        self._bluezEnumerate()

    def _bluezEnumerate(self):
        service = "org.bluez"
        root = "/org/bluez"
        interface = "org.freedesktop.DBus.Properties"
        bus = QtDBus.QDBusConnection.systemBus()
        nodes = self._bluezNodes()
        for hci in nodes:
            print(hci)
            for node in nodes[hci]:
                path = f"{root}/{hci}/{node}"
                connection = QtDBus.QDBusInterface(service, path, interface, bus)
                name = connection.call("Get", "org.bluez.Device1", "Name").arguments()[0]
                address = connection.call("Get", "org.bluez.Device1", "Address").arguments()[0]
                print(f"{address} {name}")

    def _bluezNodes(self):
        service = "org.bluez"
        path = "/org/bluez"
        interface = "org.freedesktop.DBus.Introspectable"
        bus = QtDBus.QDBusConnection.systemBus()
        connection = QtDBus.QDBusInterface(service, path, interface, bus)
        hciNodes = ET.fromstring(connection.call("Introspect").arguments()[0])

        nodes = {}
        for node in hciNodes.iter("node"):
            if node.attrib:
                hci = node.attrib["name"]
                connection = QtDBus.QDBusInterface(service, f"{path}/{hci}", interface, bus)
                devNodes = ET.fromstring(connection.call("Introspect").arguments()[0])
                nodes[hci] = []
                for device in devNodes.iter("node"):
                    if device.attrib:
                        nodes[hci].append(device.attrib["name"])
        return nodes


if __name__== '__main__':
    app = QtWidgets.QApplication([])
    daemon = Main()
    sys.exit(app.exec_())
Output:
hci0 00:1B:XX:DF:XX:A4 PLAYSTATION(R)3 Controller 04:FE:XX:86:XX:16 JBL Flip 4 05:21:XX:8E:XX:25 PLAYSTATION(R)3 Controller 98:D3:XX:40:XX:2C HC05
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020