【问题标题】:How to discover a device quickly with BlueZero?如何使用 BlueZero 快速发现设备?
【发布时间】:2021-02-16 16:56:11
【问题描述】:

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

当 PC 已经使用 bluetoothctl 等命令行工具发现微控制器时,它们就可以正常连接。问题在于设备第一次交互的时间。

根据Bluezero docs,似乎 near_discovery() 只是这项工作的功能。问题是,除非我将超时设置得非常长,比如约 45 秒,否则无法创建 Central,因为它尚未被发现。

我现在正在采取的步骤:

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 似乎几乎可以立即发现设备。

【问题讨论】:

  • 使用 bluetoothctl 发现需要多长时间? nrf52840上的广告间隔是多少?

标签: bluetooth bluetooth-lowenergy bluez pybluez


【解决方案1】:

Bluezero 和 bluetoothctl 之间不应该有任何明显的时间差来发现设备,因为它们对 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      • 2013-07-24
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多