Eu escrevi o seguinte programa golang para main.go
aprender dbus em Go:
package main
import (
"fmt"
"github.com/godbus/dbus/v5"
"time"
)
// Listener function to listen for D-Bus signals
func runListener() {
// Create a new D-Bus connection for the listener
conn, err := dbus.SessionBus()
if err != nil {
fmt.Println("Listener: Failed to connect to session bus:", err)
return
}
defer conn.Close()
// Request a unique name for the listener
busName := "org.example.Listener"
if _, reqErr := conn.RequestName(busName, dbus.NameFlagDoNotQueue); reqErr != nil {
fmt.Println("Listener: Failed to request name:", reqErr)
return
}
fmt.Println("Listener: Listening for messages on", busName)
// Add a match rule for the specific signal
err = conn.AddMatchSignal(
dbus.WithMatchInterface("org.example.ListenerInterface"), // Match interface
dbus.WithMatchMember("Message"), // Match signal member
)
if err != nil {
fmt.Println("Listener: Failed to add match rule:", err)
return
}
// Create a channel to receive signals
c := make(chan *dbus.Signal, 10)
conn.Signal(c)
// Listen for messages
fmt.Println("Listener: Waiting for D-Bus messages...")
for signal := range c {
fmt.Printf("Listener: Received message: %v\n", signal.Body)
}
}
// Sender function to send a D-Bus signal
func runSender() {
// Wait briefly to ensure the listener is ready
time.Sleep(2 * time.Second)
// Create a new D-Bus connection for the sender
conn, err := dbus.SessionBus()
if err != nil {
fmt.Println("Sender: Failed to connect to session bus:", err)
return
}
defer conn.Close()
// Define the signal details
objectPath := dbus.ObjectPath("/org/example/Listener") // Convert string to ObjectPath
interfaceName := "org.example.ListenerInterface"
signalName := interfaceName + ".Message"
// Emit the signal
fmt.Println("Sender: Sending message to listener...")
err = conn.Emit(objectPath, signalName, "Hello from the sender!")
if err != nil {
fmt.Println("Sender: Failed to send message:", err)
return
}
fmt.Println("Sender: Message sent successfully!")
}
func main() {
// Run the listener and sender as separate goroutines
go runListener()
go runSender()
// Prevent the program from exiting immediately
select {}
}
O problema que estou tendo é que o programa gera com sucesso:
Listener: Listening for messages on org.example.Listener Listener:
Waiting for D-Bus messages... Sender: Sending message to listener...
Sender: Message sent successfully!
Mas observe que não há saída "Listener: Received message"...
Também tentei fazer isso usando dois main.go
arquivos separados em dois diretórios de projeto separados (Listener, Sender), mas não consegui configurar corretamente o GoLand para executar os dois main.go
arquivos ao mesmo tempo, pois recebi um erro do GoLand: package dbus_messenger is not in std (/usr/lib/golang/src/dbus_messenger)
.