首页 > 解决方案 > 使用 Python 通过 dbus 从 BLE 模块解析数据

问题描述

目前我正在努力使用这个 sdk 与蓝牙模块进行交互:https ://github.com/LairdCP/igsdk/blob/master/python/igsdk/bt_module.py

目的是使用蓝牙模块扫描范围内的所有设备,并连接到以某个设备名称开头的任何设备(例如“dev001”、“dev002”,设备将在其中查找“dev”)。我有这样一个脚本的开始,我可以在其中扫描设备并查看传入的数据,我只是不知道如何解析每个设备产生的 dbus 字典。

脚本开头:

def discoveryCallback(x, y): 
    print("found a device!")
    print(str(x))
    print(":")
    global lastDevice
    lastDevice = y

def propertyChanged():
    print("a property has changed")

manager = bt_module.BtMgr(discoveryCallback, propertyChanged)
manager.start_discovery()

作为测试,我将scan回调的输出存储在lastDevice中,内容如下:

dbus.Dictionary({dbus.String('org.freedesktop.DBus.Introspectable'): dbus.Dictionary({}, signature=dbus.Signature('svluez.Device1'): dbus.Dictionary({dbus.String('Address'): dbus.String('4A:AA:2D:FF:48:87', variant_level=1), dbus.Stri.String('random', variant_level=1), dbus.String('Alias'): dbus.String('4A-AA-2D-FF-48-87', variant_level=1), dbus.Strlean(False, variant_level=1), dbus.String('Trusted'): dbus.Boolean(False, variant_level=1), dbus.String('Blocked'): dant_level=1), dbus.String('LegacyPairing'): dbus.Boolean(False, variant_level=1), dbus.String('RSSI'): dbus.Int16(-10us.String('Connected'): dbus.Boolean(False, variant_level=1), dbus.String('UUIDs'): dbus.Array([], signature=dbus.Sigvel=1), dbus.String('Adapter'): dbus.ObjectPath('/org/bluez/hci0', variant_level=1), dbus.String('ManufacturerData'):UInt16(76): dbus.Array([dbus.Byte(16), dbus.Byte(5), dbus.Byte(93), dbus.Byte(28), dbus.Byte(31), dbus.Byte(107), dbu=dbus.Signature('y'), variant_level=1)}, signature=dbus.Signature('qv'), variant_level=1), dbus.String('TxPower'): dbvel=1), dbus.String('ServicesResolved'): dbus.Boolean(False, variant_level=1)}, signature=dbus.Signature('sv')), dbusp.DBus.Properties'): dbus.Dictionary({}, signature=dbus.Signature('sv'))}, signature=dbus.Signature('sa{sv}'))

要连接,我需要从该对象中提取设备名称和 MAC 地址,但我无法解析它。任何人都可以帮忙吗?

标签: pythondictionaryparsingbluetoothdbus

解决方案


SyntaxError: invalid syntax当我尝试使用您发布的值时,我得到一个lastDevice。复制和粘贴中是否有问题?

通常可以将这些值视为 python 字典。这是一个例子:

def new_iface(path, iface_props):
    """If a new dbus interfaces is a device, add it to be  monitored"""
    device_addr = iface_props.get('org.bluez.Device1', {}).get('Address')
    if device_addr:
        DeviceMonitor(path)

这是发布在以下位置的示例的一部分: https ://stackoverflow.com/a/62917686/7721752


推荐阅读