根据你提供的代码,接收信号部分的匹配条件中有一个小错误。在你的匹配字符串中,你将接口名写成了 xyz/openbmc_project.State.BMC
,而在发送信号时,使用的是 "xyz.openbmc_project.State.BMC"
(两个地方的格式不一致)。这可能导致接收端无法匹配到发送的信号。
请检查和更新以下几点:
- 匹配条件中的接口名: 确保你的接口名是正确的。具体来说,确保你在接收端和发送端都使用相同的接口名称。如果你的发送信号代码是这样的:
auto signal = this->bus.new_signal(
"/xyz/openbmc_project/state",
"xyz.openbmc_project.State.BMC",
"bmcReady");
那么在接收端,你应该保持这个形式:
match = std::make_unique<sdbusplus::bus::match_t>(
static_cast<sdbusplus::bus_t&>(*conn),
"path='/xyz/openbmc_project/state',interface='xyz.openbmc_project.State.BMC',type='signal',"
"member='bmcReady'",
[&powerRestore](sdbusplus::message_t& m) {
std::cout << "-----------begin to run----------" << std::endl;
if (m.is_method_error()) {
std::cerr << "callback method error" << std::endl;
return;
}
powerRestore.run();
}
);
检查DBus连接: 确保
conn
是有效且已连接的 DBus 连接对象。事件循环: 确保程序没有在发出信号后立即退出。监听需要一个持续运行的事件循环。
日志输出: 你可以考虑在回调函数外部添加一些调试信息,以确认是否成功创建了
match
对象,并确保它保持有效状态。测试简化版本: 你可以尝试简化匹配表达式,只用路径或只用接口进行测试,这样可以更容易定位问题。例如,可以先仅按路径匹配:
match = std::make_unique<sdbusplus::bus::match_t>(
static_cast<sdbusplus::bus_t&>(*conn),
"path='/xyz/openbmc_project/state'",
[&powerRestore](sdbusplus::message_t& m) {
std::cout << "Received message on path" << std::endl;
// ...
}
);
如果经过这些检查仍然不能正常工作,请提供更多上下文,例如如何初始化 DBus 连接,以及主线程或事件循环的实现,以便我能够提供进一步的帮助。
内容由零声教学AI助手提供,问题来源于学员提问