Heim  >  Artikel  >  Backend-Entwicklung  >  Fehler org.freedesktop.DBus.Error.UnknownMethod: Unbekannte/ungültige Methode „Notify“

Fehler org.freedesktop.DBus.Error.UnknownMethod: Unbekannte/ungültige Methode „Notify“

PHPz
PHPznach vorne
2024-02-06 08:00:171209Durchsuche

错误 org.freedesktop.DBus.Error.UnknownMethod:未知/无效方法“Notify”

Frageninhalt

Ich versuche, mit Godbus einen Benachrichtigungsserver zu erstellen, aber ich kann mein Serverobjekt nicht korrekt nach Dbus exportieren und Dbus erkennt nur meine Selbstprüfungs-XML. Ich bin https://pecifications.freedesktop.org/notification-spec/notification-spec-latest.html gefolgt, um es zu implementieren. Ich verwende auch _example/server.go im Godbus-Repository, was Ihnen vielleicht im unten bereitgestellten Servercode auffällt. Dies ist der Servercode:

package main

import (
    "fmt"
    "os"

    "github.com/godbus/dbus/v5"
    "github.com/godbus/dbus/v5/introspect"
)

const xml = `
<node>
    <interface name="org.freedesktop.notifications">
        <method name="notify">
            <arg direction="in" type="s"/>
            <arg direction="in" type="u"/>
            <arg direction="in" type="s"/>
            <arg direction="in" type="s"/>
            <arg direction="in" type="s"/>
            <arg direction="in" type="as"/>
            <arg direction="in" type="a{sv}"/>
            <arg direction="in" type="i"/>
            <arg direction="out" type="u"/>
        </method>

        <method name="getcapabilities">
            <arg direction="out" type="as"/>
        </method>

        <method name="getserverinformation">
            <arg direction="out" type="s"/>
            <arg direction="out" type="s"/>
            <arg direction="out" type="s"/>
            <arg direction="out" type="s"/>
        </method>

        <method name="closenotification">
            <arg direction="in" type="u"/>
        </method>

        <signal name="notificationclosed">
            <arg type="u" name="id"/>
            <arg type="u" name="reason"/>
        </signal>
    </interface>` + introspect.introspectdatastring + `</node> `

type notificationserver struct {
}

func (s *notificationserver) notify(appname string, replacesid uint32, appicon string, summary string, body string, actions []string, hints map[string]dbus.variant, expiretimeout int32) (uint32, *dbus.error) {
    fmt.printf("new notification: %s\n", body)
    return 0, nil
}

func (s *notificationserver) getcapabilities() ([]string, *dbus.error) {
    return []string{"action-icons", "actions", "body", "body-hyperlinks", "body-images", "body-markup", "icon-multi", "icon-static", "persistence", "sound"}, nil
}

func (s *notificationserver) getserverinformation() (string, string, string, string, *dbus.error) {
    return "antarctica", "antarctica.com", "1.0", "1.2", nil
}

func (s *notificationserver) closenotification(id uint32) *dbus.error {
    s.notificationclosed(id, 0)
    return nil
}
func (s *notificationserver) notificationclosed(id, reason uint32) {

}

func main() {
    conn, err := dbus.connectsessionbus()
    if err != nil {
        panic(err)
    }
    defer conn.close()

    reply, err := conn.requestname("com.antarctica.notification",
        dbus.nameflagdonotqueue)
    if err != nil {
        panic(err)
    }

    if reply != dbus.requestnamereplyprimaryowner {
        fmt.fprintln(os.stderr, "name already taken")
        os.exit(1)
    }
    server := notificationserver{}
    err = conn.export(server,"/org/freedesktop/notifications","org.freedesktop.notifications")
    if err != nil {
        panic(err)
    }
    conn.export(introspect.introspectable(xml), "/org/freedesktop/notifications", "org.freedesktop.dbus.introspectable")
    fmt.println("listening on com.antarctica.notification / /com/antarctica/notification ...")
    select {}
}

Das Problem besteht nun darin, dass, selbst wenn der Client Zugriff auf die Introspection-XML hat:

$ gdbus introspect --session --dest com.antarctica.notification --object-path /org/freedesktop/notifications --xml

> returns xml

Ich kann die Methode org.freedesktop.notifications, die ich im Servercode geschrieben habe, nicht verwenden. Beispielsweise ist notify unbekannt/ungültig, was für jede Methode gleich ist:

$ dbus-send --session --print-reply=literal --dest=com.antarctica.notification /org/freedesktop/Notifications org.freedesktop.Notifications.Notify

> Error org.freedesktop.DBus.Error.UnknownMethod: Unknown / invalid method 'Notify'

Wenn ich in qdbusviewer versuche, eine Methode auszuführen, heißt es außerdem: „Methode x konnte im Pfad /org/freedesktop/notifications in der Schnittstelle org.freedesktop.notifications nicht gefunden werden“

Was ich versucht habe:

  1. Überprüfen Sie, ob dbus läuft
  2. Überprüfen Sie, ob mein Server läuft
  3. Ich habe auch versucht, den Dbus-Dienst und meinen Computer neu zu starten
  4. Ich glaube, die Notificationserver-Instanz (Server) wird überhaupt nicht exportiert, aber ich weiß nicht warum

Richtige Antwort


Das funktioniert. Du hast zwei Fehler gemacht:

  1. com.antarktica.notification
  2. func (s *Benachrichtigungsserver)

Sie müssen „org.freedesktop.notifications“ als Namen anfordern und dürfen keine Zeiger in Funktionen verwenden.

  1. org.freedesktop.notifications
  2. func (Benachrichtigungsserver)
  3. (Sie müssen auch nicht nach innen schauen)
package main

import (
    "fmt"
    "os"

    "github.com/godbus/dbus/v5"
)

type notificationServer struct{}

func (s notificationServer) Notify(appName string, replacesID uint32, appIcon string, summary string, body string, actions []string, hints map[string]dbus.Variant, expireTimeout int32) (uint32, *dbus.Error) {
    fmt.Printf("New notification: %s\n", body)
    return 0, nil
}

func (s notificationServer) GetCapabilities() ([]string, *dbus.Error) {
    return []string{"action-icons", "actions", "body", "body-hyperlinks", "body-images", "body-markup", "icon-multi", "icon-static", "persistence", "sound"}, nil
}

func (s notificationServer) GetServerInformation() (string, string, string, string, *dbus.Error) {
    return "antarctica", "antarctica.com", "1.0", "1.2", nil
}

func main() {
    conn, err := dbus.ConnectSessionBus()
    if err != nil {
        panic(err)
    }
    defer conn.Close()

    f := notificationServer{}
    conn.Export(f, "/org/freedesktop/Notifications", "org.freedesktop.Notifications")

    reply, err := conn.RequestName("org.freedesktop.Notifications", dbus.NameFlagDoNotQueue)
    if err != nil {
        panic(err)
    }
    if reply != dbus.RequestNameReplyPrimaryOwner {
        fmt.Fprintln(os.Stderr, "name already taken")
        os.Exit(1)
    }
    fmt.Println("Listening...")
    select {}
}

Das obige ist der detaillierte Inhalt vonFehler org.freedesktop.DBus.Error.UnknownMethod: Unbekannte/ungültige Methode „Notify“. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen