Bluetooth Bluez没有';重复查找时,请不要重新查找设备

Bluetooth Bluez没有';重复查找时,请不要重新查找设备,bluetooth,dbus,bluez,Bluetooth,Dbus,Bluez,我在Ubuntu和Raspian上使用超过DBus。为此,我正在使用,但我99%确信这不是问题所在。它所做的只是通过C++将Linux的DBus API连接到Node.js。但这就是为什么我的代码是用JavaScript编写的 我基本上要做的是加载系统总线、bluez适配器和对象管理器,然后启动一个发现,就像这样(简化的半伪代码): 当我调用这个脚本时,我看到了很多设备的列表。当我停止脚本并再次启动它时,我看不到任何内容。或者是一两个。如果我等几分钟,我可以再次看到我的设备 在我看来,我错过了一

我在Ubuntu和Raspian上使用超过DBus。为此,我正在使用,但我99%确信这不是问题所在。它所做的只是通过
C++
将Linux的DBus API连接到Node.js。但这就是为什么我的代码是用JavaScript编写的

我基本上要做的是加载
系统总线
bluez适配器
对象管理器
,然后启动一个发现,就像这样(简化的半伪代码):

当我调用这个脚本时,我看到了很多设备的列表。当我停止脚本并再次启动它时,我看不到任何内容。或者是一两个。如果我等几分钟,我可以再次看到我的设备


在我看来,我错过了一个步骤,可能我需要重置适配器,可能发现仍在后台运行,我必须等待,然后才能开始一个新的?或者,我知道有
托管对象
存储在某个地方,也许它们不会被重新发现?但是加载这些
托管对象
会返回
未定义

只有在Bluez向DBU添加新设备时,才会在添加的接口上收到信号。如果设备未使用,180秒后将从DBU中删除…然后您将收到InterfacesRemoved信号

因此,在您的情况下,您在第一次添加设备时会看到它,但您不会再次收到它,因为它已经在那里了!如果您等待的时间超过180秒,您将再次看到它,除非设备已绑定,在这种情况下,它将永远留在DBU上


你需要做的是倾听财产的变化。每次设备的属性(如RSSI)发生更改时,您都会收到一个回调。如果这样做,您还将“看到”DBU上已经存在的设备。

您可能需要使用
GetManagedObjects
获取现有设备。如回答中所述,Bluetooth将在180秒后自动删除新出现的设备。您可以在这里引用示例:,但这是使用glib gdbus用C编写的。奇怪的是,当我查询托管对象时,它们似乎没有定义,但可能是我做错了什么。谢谢你的回答,这很有道理。我仍在调查,一旦查明真相,我将接受你的答复。
const systembus = DBus.getBus("system");
const adapter = systembus.getInterface("org.bluez", "/org/bluez/hci0", "org.bluez.Adapter1");
const manager = systembus.getInterface("org.bluez", "/", "org.freedesktop.DBus.ObjectManager");

manager.on("InterfacesAdded", (path, interfaces) => {
  const device = interfaces["org.bluez.Device1"];
  if (device) console.log("Found", device);
});

adapter.StartDiscovery();