Ralat org.freedesktop.DBus.Error.UnknownMethod: Kaedah tidak diketahui/tidak sah 'Beritahu'

PHPz
Lepaskan: 2024-02-06 08:00:17
ke hadapan
1214 orang telah melayarinya

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

Kandungan soalan

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 {}
}
Salin selepas log masuk

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
Salin selepas log masuk

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'
Salin selepas log masuk

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:

  1. Periksa sama ada dbus sedang berjalan
  2. Periksa sama ada pelayan saya sedang berjalan
  3. Saya juga cuba memulakan semula perkhidmatan dbus dan komputer saya
  4. Saya rasa contoh pelayan pemberitahuan (pelayan) tidak dieksport sama sekali, tetapi saya tidak tahu mengapa


Jawapan betul


Ini berkesan. Anda melakukan dua kesilapan:

  1. com.antarctica.notification
  2. func (s *pelayan pemberitahuan)

Anda mesti meminta "org.freedesktop.notifications" sebagai nama dan tidak boleh menggunakan penunjuk dalam fungsi.

  1. org.freedesktop.notifications
  2. func (pelayan pemberitahuan)
  3. (Tak perlu introspeksi pun)
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 {}
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan