我正在编写Raspberry Pi程序,需要在用户插入USB驱动器时收到通知。我使用Qt的D-Bus支持来收听InterfacesAdded from org.freedesktop.UDisks2,这在我的x86 Linux桌面上运行良好。
这是我的代码,它将D-Bus信号设置到我班级的位置:
auto bus = QDBusConnection::systemBus();
auto monitor = new UsbMonitor(&app); // my class
if (!bus.connect("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "InterfacesAdded",
monitor, SLOT(handleit(QDBusObjectPath, QMap<QString,QVariant>)))) {
qFatal("FATAL Couldn't connect USB monitor to D-Bus signal");
}
它不适用于Pi。我追踪到udisksd没有运行的事实,即使它应该在需要时自动启动。
我猜这是因为我引导到控制台(不是GUI)并且只添加了一个信号处理程序,这还不足以让D-Bus自动启动udisksd。
如果我添加
auto msg = QDBusMessage::createMethodCall("org.freedesktop.UDisks2", "/org/freedesktop/UDisks2", "org.freedesktop.DBus.ObjectManager", "GetManagedObjects");
bus.call(msg);
在致电bus.connect
之前,一切正常。
有没有更好的方法来确保udisksd正在运行?我宁愿更改Pi上的配置文件而不是只需要额外的代码来唤醒&#34;唤醒&#34;服务。
答案 0 :(得分:2)
取决于您在Pi上运行的分发。如果您使用的是使用systemd的发行版,则可以运行sudo systemctl enable --now udisks2.service
将服务配置为始终启动。
您可能希望扩展代码以在D-Bus上观看org.freedesktop.UDisks2
名称,因为您可能希望在信号消失并重新出现时重新连接该信号。 (我不确切知道Qt D-Bus如何处理这个问题;它是否在信号处理程序注册时或信号发射时将众所周知的名称解析为唯一名称。)