当我重复发现时,Bluez不会重新发现设备

问题描述 投票:0回答:1

我正在Ubuntu和Raspian上通过DBus使用the Bluez API。为此,我正在使用npm's dbus package,但是我99%的确定这不是这里的问题。它所做的只是通过C++将Linux的DBus API桥接到Node.js。但这就是为什么我的代码是用JavaScript编写的。

我基本上要做的是加载system busbluez adapterobject manager并开始发现,就像这样(简化的半伪代码

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();

当我调用此脚本时,会看到许多设备的列表。当我停止脚本并重新启动它时,没有任何显示。或者也许像一两个。如果我等待几分钟,我可以再次看到我的设备。

在我看来,我在这里缺少一个步骤,也许我需要重置适配器,也许发现仍在后台运行,我必须等待才能开始新的适配器?或者,也许我知道managed objects存储在某个地方,也许不会被重新发现?但是加载这些managed objects会返回undefined

bluetooth dbus bluez
1个回答
0
投票

[仅当Bluez向dbus添加新设备时,您才会在Interface Attached上收到信号。如果设备未使用,则将在180秒后将其从dbus中删除。...然后您将收到InterfacesRemoved信号。

因此,在您的情况下,您会在首次添加设备时看到该设备,但是由于该设备已经存在,因此您不会再收到它!如果等待时间超过180秒,您将再次开始看到它,除非已将设备绑定在一起,否则它将永远停留在dbus上。

您需要做的是监听PropertiesChanged。每次设备的属性(例如RSSI)更改时,都会得到回调。如果这样做,您还将“查看” dbus上已经存在的设备。

© www.soinside.com 2019 - 2024. All rights reserved.