快速蓝牙名称查找

2 投票
1 回答
3573 浏览
提问于 2025-04-16 11:13

我在快速检测附近蓝牙设备的名称(人类可读的名称,而不是蓝牙地址)时遇到了一些问题。我发现了一个很有趣的基于Python的项目,链接在这里 [http://code.google.com/p/python-bluetooth-scanner/],但问题是,虽然查找蓝牙地址和信号强度很快,但检测设备的“人类”名称却需要更长的时间(即使他们在代码中说应该能快)

我知道我可以通过以下方式查找名称:

  1. 简单的“hcitool scan”命令行,这个速度很慢
  2. 使用PyBlueZ模块中的bluetooth.lookup_name(address)方法
  3. 项目中写的其他方法,下面会提到

-

sock = bluetooth.bluez._gethcisock(device)
timeoutms = int(timeout * 1000)
try:
  name = bluetooth._bluetooth.hci_read_remote_name( sock, address, timeoutms )
except bluetooth._bt.error, e:
  print e
  logger.debug("Lookup Failed")
  name = None
sock.close()
return name

简单介绍一下:系统使用两个蓝牙适配器来检测附近的蓝牙设备。如果我让它们查找名称,它们会花更多的时间,因此会一直处于锁定状态。当发现新设备时,设备仍然在查找之前设备的名称,整个软件就会卡住。我在Windows XP环境下的VirtualBox中运行Ubuntu 10.10,并使用了几个蓝牙2.1适配器。

除了创建一个“未命名”设备的列表,以便在我的适配器完成之前的设备查找后立即进行查找外,你知道有什么方法可以更快地做到这一点吗?

1 个回答

2

要找到一个远程设备的友好名称,通常需要经过两个步骤。首先,你要进行一次扫描,去“发现”附近那些可以被找到的设备。接下来,你需要连接到这个远程设备,并“询问”它的友好名称。这个过程有点慢,主要是因为这两个步骤通常不是交替进行的(也就是说,先发现设备,然后再查询名称)。很多时候,你会先完成一次扫描(这需要一些时间),然后再向特定的设备询问它们的友好名称。为了让发现和名称查询交替进行,你可以先开始发现,等到“发现”到一个新设备后,取消发现,查询名称,然后再重新开始发现。这样重复进行,直到没有新设备被找到。有些系统会自动为你处理这个过程,有些则不会。

如果两个设备都支持扩展查询响应(这是在蓝牙2.1规范中增加的功能),那么友好名称会在发现过程中直接返回。这会大大加快速度,但这需要在更底层的系统中得到支持。

撰写回答