问题描述
我有一台要使用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秒。谢谢您的答复
, 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