尽管存在方法,但在对象路径中找不到 D-Bus 方法

Posted

技术标签:

【中文标题】尽管存在方法,但在对象路径中找不到 D-Bus 方法【英文标题】:D-Bus method not found at object path despite the fact that method exist 【发布时间】:2016-08-21 11:46:08 【问题描述】:

我用这个 com.example.appname.desktop 文件实现了一个应用程序,如下所示:

$ cat /usr/local/share/applications/com.example.appname.desktop 
[Desktop Entry]
Version=1.0
Terminal=false
Type=Application
Name=appname
Exec=/opt/app/appname %u
DBusActivatable=true
Categories=Network;
MimeType=x-scheme-handler/itmm;
NoDisplay=false

$ cat /usr/share/dbus-1/services/com.example.appname.service 
[D-BUS Service]
Name=com.example.appname
Exec=/opt/app/appname

自省 XML 如下所示:

    $ qdbus com.example.appname /com/example/appname  org.freedesktop.DBus.Introspectable.Introspect
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN"
"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
  <interface name="org.freedesktop.Application">
    <method name="ActivateAction">
      <arg name="action_name" type="s" direction="in"/>
      <arg name="parameter" type="av" direction="in"/>
      <arg name="platform_data" type="asv" direction="in"/>
      <annotation name="org.qtproject.QtDBus.QtTypeName.In2" value="QVariantMap"/>
    </method>
    <method name="Activate">
      <arg name="platform_data" type="asv" direction="in"/>
      <annotation name="org.qtproject.QtDBus.QtTypeName.In0" value="QVariantMap"/>
    </method>
    <method name="Open">
      <arg name="uris" type="as" direction="in"/>
      <arg name="platform_data" type="asv" direction="in"/>
      <annotation name="org.qtproject.QtDBus.QtTypeName.In1" value="QVariantMap"/>
    </method>
  </interface>
  <interface name="org.freedesktop.DBus.Properties">
    <method name="Get">
      <arg name="interface_name" type="s" direction="in"/>
      <arg name="property_name" type="s" direction="in"/>
      <arg name="value" type="v" direction="out"/>
    </method>
  ----<snipped>-----

但是当我尝试启动该方法时,它给了我一个错误:

$ gapplication launch com.example.appname                                                                                                               
error sending Activate message to application: GDBus.Error:org.freedesktop.DBus.Error.UnknownMethod: No such method 'Activate' in interface 'org.freedesktop.Application' at object path '/com/example/appname' (signature 'asv')

是“annotation name=..” XML 标签(参见 introspection XML)找不到这个方法的原因吗? 通过浏览器浏览到itmm://192.168.1.1/query?version=1.0 使用命令行参数启动应用程序,但它不是通过 D-Bus 服务启动的,这就是我的要求。有没有办法通过 firefox 或 google chrome 浏览器进行调试?

【问题讨论】:

【参考方案1】:

我使用 QT 的 D-Bus 绑定来实现 D-Bus 服务。我的问题是

    我的实现 D-Bus 接口的类没有继承 QDBusAbstractAdaptor 。 要导出的方法未标记为public slots

我原来的类如下所示:

class DBusService : public Application

    QOBJECT
    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application") 
    public:
    void Activate(QMap<QString, QVariant> platform_data)
       
       Q_UNUSED(platform_data);
        

    void Open(QStringList uris, QMap<QString, QVariant> platform_data)
       
       Q_UNUSED(platform_data);
       if( ! uris.size() ) 
          return;
       
       QUrl url(uris[0]);
       //use url
    

以下作品:

class DBusService : public QDBusAbstractAdaptor  //<----- Inherit from this class

    QOBJECT
    Q_CLASSINFO("D-Bus Interface", "org.freedesktop.Application") 

    public slots:  // <------ mark public slots
    void Activate(QMap<QString, QVariant> platform_data)
       
       Q_UNUSED(platform_data);
        

    void Open(QStringList uris, QMap<QString, QVariant> platform_data)
       
       Q_UNUSED(platform_data);
       if( ! uris.size() ) 
          return;
       
       QUrl url(uris[0]);
       qApp->MyCustomMethod(url);
    

D-Bus 调试工具

这些工具帮助我调试 D-Bus 问题。 dbus-monitor - 嗅探总线上的流量

gapplication - 让您调试DBusActivatable 服务。

【讨论】:

以上是关于尽管存在方法,但在对象路径中找不到 D-Bus 方法的主要内容,如果未能解决你的问题,请参考以下文章

SBT 在本地 maven 存储库中找不到文件,尽管它在那里

在 web-app 中找不到 Spring ContextLoaderListener 但在系统类路径中找到

适用于 blob 的 Azure Java SDK - 已请求加载默认 HttpClient 提供程序,但在类路径中找不到该提供程序

在提供的路径中找不到应用程序包...“:CFBundleIdentifier”,不存在

从 net.connman.Manager 的 GetService 方法中动态提取 D-Bus 参数和对象路径

断开发送方投射设备后,如何让我的 android 电视应用程序继续运行?