如何正确接收DBus消息?Go语言示例无法接收信号求助
问题1:DBus信号无法被监听到的修复方案
你的代码中,监听器的匹配规则缺少对象路径的过滤条件,导致发送的信号无法被正确匹配;同时发送信号时的signalName写法存在冗余,以下是具体修改:
监听器(runListener)修改AddMatchSignal逻辑
添加对象路径匹配规则,确保只接收指定路径下的目标信号:
err = conn.AddMatchSignal( dbus.WithMatchInterface("org.example.ListenerInterface"), dbus.WithMatchMember("Message"), dbus.WithMatchObjectPath("/org/example/Listener"), // 新增对象路径匹配 )
发送者(runSender)修改signalName定义
Emit方法的第二个参数只需传入信号成员名,无需拼接接口名:
// 直接使用成员名,接口关联由匹配规则处理 signalName := "Message"
修改后重新运行,监听器就能正常接收到Hello from the sender!的消息。
问题2:GoLand中运行两个独立项目的报错解决
报错package dbus_messenger is not in std (/usr/lib/golang/src/dbus_messenger)是因为项目未正确初始化Go模块,或GoLand模块配置错误,按以下步骤修复:
为每个项目初始化Go模块
打开终端进入每个项目的根目录,分别执行:# 监听器项目,模块名可自定义 go mod init dbus_listener go mod tidy # 发送者项目,模块名可自定义 go mod init dbus_sender go mod tidygo mod tidy会自动拉取github.com/godbus/dbus/v5依赖。配置GoLand模块
- 打开
File > Project Structure > Modules - 点击
+选择New Module,分别为两个项目创建Go模块,指定各自的根目录和模块名 - 确保每个模块的
Go SDK指向正确的本地Go安装路径
- 打开
创建独立运行配置
为每个项目的main.go创建单独的Run Configuration,运行时分别启动两个配置即可。
内容的提问来源于stack exchange,提问作者the_endian
相关产品推荐
相关产品推荐

