代码之家  ›  专栏  ›  技术社区  ›  Xaqron

golang dbus服务器示例

  •  0
  • Xaqron  · 技术社区  · 4 年前

    戈兰尼 dbus module example 但目前尚不清楚服务器是如何接收消息并做出响应的。请举一个乒乓球的例子:

    package main
    
    import (
        "fmt"
        "os"
    
        "github.com/godbus/dbus"
        "github.com/godbus/dbus/introspect"
    )
    
    const intro = `
    <node>
        <interface name="com.github.guelfey.Demo">
            <method name="Foo">
                <arg direction="out" type="s"/>
            </method>
        </interface>` + introspect.IntrospectDataString + `</node> `
    
    type foo string
    
    func (f foo) Foo() (string, *dbus.Error) {
        fmt.Println(f)
        return string(f), nil
    }
    
    func main() {
        conn, err := dbus.ConnectSessionBus()
        if err != nil {
            panic(err)
        }
        defer conn.Close()
    
        f := foo("Bar!")
        conn.Export(f, "/com/github/guelfey/Demo", "com.github.guelfey.Demo")
        conn.Export(introspect.Introspectable(intro), "/com/github/guelfey/Demo",
            "org.freedesktop.DBus.Introspectable")
    
        reply, err := conn.RequestName("com.github.guelfey.Demo",
            dbus.NameFlagDoNotQueue)
        if err != nil {
            panic(err)
        }
        if reply != dbus.RequestNameReplyPrimaryOwner {
            fmt.Fprintln(os.Stderr, "name already taken")
            os.Exit(1)
        }
        fmt.Println("Listening on com.github.guelfey.Demo / /com/github/guelfey/Demo ...")
        select {}
    }
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   Hymns For Disco Jack    4 年前

    https://pkg.go.dev/github.com/godbus/dbus#Conn.Export

    func (conn *Conn) Export(v interface{}, path ObjectPath, iface string) error
    

    如果接收到给定路径和接口上的方法调用,则如果参数匹配且最后返回值的类型为*Error,则使用v作为接收器调用具有相同名称的导出方法。如果这个*错误不是nil,它将作为错误发送回调用者。否则,将发送一个方法应答,并将其他返回值作为其主体。

    程序通过 f foo conn.Export .

    具有与所述模式匹配的方法:

    func (f foo) Foo() (string, *dbus.Error)
    

    string(f) . ( "Bar!"

    空select语句 select {} 最后是一个我从未见过的聪明的把戏。它只是一个永远阻挡的语句。你可以阅读更多关于它的文章 this question . 它在这里只是用来阻止 main

    考虑到这个空选择是一个“聪明的把戏”,最好用一个简单的注释来解释:

    // Blocks forever
    select {}
    

    Export 方法很神奇。它接受一个名称模糊的空接口值,并根据一些可能使用反射的内部进程来确定如何处理它。除非您阅读了函数的文档,否则很难猜测它会做什么。