Rumah > Artikel > pembangunan bahagian belakang > Ralat org.freedesktop.DBus.Error.UnknownMethod: Kaedah tidak diketahui/tidak sah 'Beritahu'
Saya cuba mencipta pelayan pemberitahuan menggunakan godbus, tetapi saya tidak dapat mengeksport objek pelayan saya ke dbus dengan betul dan dbus hanya mengenali xml introspeksi saya. Saya mengikuti https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html untuk melaksanakannya. Saya juga menggunakan _example/server.go dalam repositori godbus, yang mungkin anda perhatikan dalam kod pelayan yang disediakan di bawah. Ini adalah kod pelayan:
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 {} }
Masalahnya sekarang ialah walaupun pelanggan mempunyai akses kepada xml introspeksi:
$ gdbus introspect --session --dest com.antarctica.notification --object-path /org/freedesktop/notifications --xml > returns xml
Saya tidak boleh menggunakan kaedah org.freedesktop.notifications yang saya tulis dalam kod pelayan. Contohnya, pemberitahuan tidak diketahui/tidak sah, yang sama untuk setiap kaedah:
$ 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'
Juga dalam qdbusviewer apabila saya cuba melaksanakan sebarang kaedah ia berkata "Tidak dapat mencari kaedah x di laluan /org/freedesktop/pemberitahuan dalam antara muka org.freedesktop.notifications"
Apa yang saya cuba:
Ini berkesan. Anda melakukan dua kesilapan:
Anda mesti meminta "org.freedesktop.notifications" sebagai nama dan tidak boleh menggunakan penunjuk dalam fungsi.
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 {} }
Atas ialah kandungan terperinci Ralat org.freedesktop.DBus.Error.UnknownMethod: Kaedah tidak diketahui/tidak sah 'Beritahu'. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!