
我正在尝试使用 godbus 创建一个通知服务器,但我无法正确地将我的服务器对象导出到 dbus,并且 dbus 只能识别我的内省 xml。我按照 https://specifications.freedesktop.org/notification-spec/notification-spec-latest.html 来实现它。我还在 godbus 存储库中使用了 _example/server.go,您可能会在下面提供的服务器代码中注意到。 这是服务器代码:
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 {}
}现在的问题是,即使客户端可以访问内省 xml:
$ gdbus introspect --session --dest com.antarctica.notification --object-path /org/freedesktop/notifications --xml > returns xml
我无法使用我在服务器代码中编写的 org.freedesktop.notifications 方法。例如,notify 未知/无效,这对于每种方法都是相同的:
$ 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'
也在 qdbusviewer 中,当我尝试执行任何方法时,它显示“无法在接口 org.freedesktop.notifications 中的路径 /org/freedesktop/notifications 上找到方法 x”
我尝试过的:
这有效。你犯了两个错误:
您必须请求“org.freedesktop.notifications”作为名称,并且不能在函数中使用指针。
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 {}
}以上就是错误 org.freedesktop.DBus.Error.UnknownMethod:未知/无效方法“Notify”的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号