bluez-tools bt-adapter -d 需要在下次使用前重置 USB 加密狗

bluez-tools bt-adapter -d requires usb dongle reset before next use

我正在编写一个 BLE 应用程序 read/write 到外围特性,并以 bluez-tools 为例。其中一项要求是发现附近的 BLE 设备,如果此过程适用于每次应用程序启动,那将是首选。

然而,在第一次使用 bt-adapter -d 之后,像这样

$ bt-adapter -d
Searching...
[69:F6:C6:1E:2F:B2]
  Name: 69E90E1E
  Alias: 69E90E1E
  Address: 69:F6:C6:1E:2F:B2
  Icon: (null)
  Class: 0x0
  LegacyPairing: 0
  Paired: 0
  RSSI: -63

^C
$

然后第二次我没有得到任何结果。

$ bt-adapter -d
Searching...
^C
$

同时 hcitool lescan 成功找到外围设备。

如果我拔下并重新插入我的蓝牙加密狗,我会收到此错误:

$ bt-adapter -d
Searching...
Error: GDBus.Error:org.bluez.Error.NotReady: Resource Not Ready
$

然后在我重置 hci0

$ sudo hciconfig hci0 down
$ sudo hciconfig hci0 up

发现又起作用了。

如何让 bt-adapter -d 正常工作而无需在每次应用程序启动后重置 ble dongle?

我在 mac 和 Ubuntu 15.10

上使用 Parallels 11

不使用 ctrl + c

关闭它

您使用它强制停止扫描,这会使适配器处于不良状态。您应该允许扫描自行停止,停止前的时间等是在扫描参数中定义的内容。对于设备发现,我会使用 btmgmt 和 GATT 相关功能 gatttoolbtgatt-client.

现在我对 bluez 进行了更多调查,我了解到它将之前发现的设备保留在缓存中,因此不会在 ObjectManager 上调用 InterfacesAdded 信号。

我遵循了 this 示例,该示例在 StartDiscovery 之前使用 g_dbus_object_manager_get_objects 检查 bluez 是否已缓存设备。