fix: Correct D-Bus signal subscription for properties changed

Co-authored-by: aider (gemini/gemini-2.5-pro) <aider@aider.chat>
This commit is contained in:
2025-12-31 00:08:24 +00:00
parent b0b5905169
commit b5ee0b5df2

23
scan.py
View File

@@ -7,7 +7,7 @@ logging.basicConfig(stream=sys.stdout,
import asyncio
from dbus_next.aio import MessageBus
from dbus_next.constants import BusType
from dbus_next.constants import BusType, MessageType
from dbus_next import Message
BLUEZ_SERVICE = 'org.bluez'
@@ -55,6 +55,14 @@ def on_interfaces_added(path, interfaces):
# Log repeat discoveries only if they have a name
logging.info(f"Found: {alias} ({addr_str})")
def properties_changed_handler(message: Message):
"""Sync handler to dispatch async task for property changes."""
if message.message_type == MessageType.SIGNAL and \
message.member == 'PropertiesChanged' and \
message.interface == 'org.freedesktop.DBus.Properties':
# Further filtering is done in the async handler
asyncio.create_task(on_properties_changed(message))
async def on_properties_changed(message: Message):
"""Callback for when a device's properties change (e.g., Alias appears)."""
if not message.body or message.body[0] != DEVICE_IFACE:
@@ -103,13 +111,12 @@ async def main():
obj_manager_iface.on_interfaces_added(on_interfaces_added)
# Subscribe to PropertiesChanged signal to catch late-arriving device names
await bus.add_match(
on_properties_changed,
mtype='signal',
iface='org.freedesktop.DBus.Properties',
member='PropertiesChanged',
path_namespace='/org/bluez'
)
rule = "type='signal',interface='org.freedesktop.DBus.Properties',member='PropertiesChanged',path_namespace='/org/bluez'"
introspection = await bus.introspect('org.freedesktop.DBus', '/org/freedesktop/DBus')
proxy_obj = bus.get_proxy_object('org.freedesktop.DBus', '/org/freedesktop/DBus', introspection)
dbus_interface = proxy_obj.get_interface('org.freedesktop.DBus')
await dbus_interface.call_add_match(rule)
bus.add_message_handler(properties_changed_handler)
logging.info("Starting Bluetooth scan... Press Ctrl+C to stop.")
try: