Heim > Artikel > Backend-Entwicklung > Fehler org.freedesktop.DBus.Error.UnknownMethod: Unbekannte/ungültige Methode „Notify“
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:
Das funktioniert. Du hast zwei Fehler gemacht:
Sie müssen „org.freedesktop.notifications“ als Namen anfordern und dürfen keine Zeiger in Funktionen verwenden.
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!