python - 使用 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 地址,但我无法解析它。任何人都可以帮忙吗?
解决方案
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
推荐阅读
- css - 如何在css伪元素中添加fontawesome字体
- javascript - 如果使用谷歌脚本从 forEach 达到限制结果,则检查值
- java - 如何使用同一工作簿读取和写入 Excel 文件 (.xlsx)?
- python - 覆盆子托管机器人
- node.js - zuora 搜索产品的 API
- apache-flink - 如何在 flink 1.7.0 中只启动一个任务管理器,如果它以某种方式被杀死?
- swift - iOS 13 自定义字体下载和安装
- spring-boot - 如何简化 keycloak REST API 服务
- ios - 如何从 MKClusterAnnotation 获取具有相同坐标的注释?
- javascript - 如何防止odoo 10中的异步执行?