Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ralat org.freedesktop.DBus.Error.UnknownMethod: Kaedah tidak diketahui/tidak sah 'Beritahu'

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

PHPz
PHPzke hadapan
2024-02-06 08:00:171209semak imbas

错误 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 {}
}

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:

  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 {}
}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam