如何使用BlueZero快速发现设备?

问题描述

我有一台要使用python连接到广告微控制器(nrf52840)的Ubuntu PC。

当PC使用诸如bluetoothctl之类的命令行工具发现微控制器时,它们的连接就很好。问题是设备第一次互动时。

根据Bluezero docs,似乎near_discovery()只是工作的功能。问题是,除非我将超时设置为非常长的时间(如〜45秒),否则无法创建中央数据库,因为尚未发现中央数据库

我现在要采取的步骤:

from bluezero import adapter,central

dongles = adapter.list_adapters()
dongle = adapter.Adapter(dongles[0])

dongle.nearby_discovery(timeout=45)

myCentral = central.Central(adapter_addr=dongle.address,device_addr="AA:BB:CC:DD:EE:FF")

是否有更可靠的发现/连接新设备的方法

对于它的价值,bluetoothctl scan on几乎可以立即发现设备。

解决方法

结果证明该解决方案与bluezero无关。我正在使用JTAG来获取MAC地址,并且该功能重置了板上的CPU,这意味着重新启动并再次开始广告花费了大约30秒。谢谢您的答复

,

Bluezerobluetoothctl之间应该没有太大的时间差来发现设备,因为它们正在对bluetoothd进行相同的API调用。

一旦某个设备位于BlueZ的已知列表中,那么由于BlueZ会忽略“重复项”,因此它不会在扫描结果中非常频繁地报告该设备。 这就是导致大多数脚本不使用nearby_discovery()的原因,因为一旦设备进入已知列表,您就可以直接连接它而无需发现。

bluetoothctl中,您可以输入devices来获取列表。在Bluezero中,没有一个整齐的选项可以做到这一点(只是我以前从未想过要提供的东西)。如果您想进行测试以查看要连接的设备是否已在列表中,那么以下是我的初步想法:

from bluezero import dbus_tools

def known_devices():
    """Get a list of devices Bluez already knows about"""
    device_list = []
    mng_objs = dbus_tools.get_managed_objects()
    for path in mng_objs:
        address = mng_objs[path].get('org.bluez.Device1',{}).get('Address')
        if address:
            device_list.append(str(address))
    return device_list

def is_known_device(mac_addr):
    """Is the given Bluetooth address already a known device"""
    found_devices = known_devices()
    return mac_addr in found_devices

print(f'Device list: {known_devices()}')
look_list = ['DC:DB:16:6B:8C:5F','DC:DB:16:6B:8C:xx']
for look_up in look_list:
    print(f'{look_up} is known? {is_known_device(look_up)}')

在测试中,我得到以下输出:

Device list: ['DC:DB:16:6B:8C:5F','DE:82:35:E7:43:BE']
DC:DB:16:6B:8C:5F is known? True
DC:DB:16:6B:8C:xx is known? False