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


Messages In This Thread
RE: QtDBus: how to call GetManagedObjects from bluez - by Alfalfa - Sep-16-2018, 01:01 PM

Forum Jump:

User Panel Messages

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