ZBLOG

busctl call xyz.openbmc_project.Smbios.Inventory /xyz/openbmc_project/inventory/redfishBios/Chassis0/NetworkAdaptersDevType7_NIC1 org.freedesktop.DBus.Properties GetAll s xyz.openbmc_project.redfishBios.Inventory.NetworkAdapters a{sv} 18 "Associat...

在你提供的代码中,Temp 的值应该是一个整数(50),但是你使用 std::get<int64_t>(data.second) 来获取这个值可能导致了问题。原因有几个方面:

  1. 类型不匹配:从 D-Bus 获取到的 Temp 值是一个 int32_t 或者 uint32_t 类型,而不是 int64_t。如果你的实现中将其存储为小于 64 位的整数,而你用的是 64 位变量来接收它,那么会出现类型不匹配的问题。

  2. Variant 使用不当:如果你使用的是 std::variant 等类似结构,那么你需要确保正确处理所有可能的类型。如果 D-Bus 返回的数据类型不是预期的整型,则会引发异常。

  3. Debugging 输出:建议在尝试提取值之前,打印出数据类型信息,以便确认该值实际存储的是什么类型。例如,可以通过以下方式检查:

for (const auto& data : properties)
{
    std::cout << "data.first : " << data.first << std::endl;
    if (data.first == "CardModel")
    {
        cardModel = std::get<std::string>(data.second);
    } 
    else if (data.first == "Temp")
    {
        // 打印出当前值和数据类型
        std::cout << "Type of Temp: " << data.second.index() << std::endl; // 如果使用std::variant
        if (std::holds_alternative<int32_t>(data.second)) // 假设 Temp 是 int32_t
        {
            temp = static_cast<int64_t>(std::get<int32_t>(data.second));
            std::cout << "temp : " << temp << std::endl;
        }
        else if (std::holds_alternative<uint32_t>(data.second)) // 假设 Temp 也可能是 uint32_t
        {
            temp = static_cast<int64_t>(std::get<uint32_t>(data.second));
            std::cout << "temp : " << temp << std::endl;
        }
        else
        {
            std::cerr << "Unexpected type for Temp!" << std::endl;
        }
    }
}
  1. DBus 返回的数据结构:根据返回的信息,确保你对返回数据进行正确解读,有时它们可能包含额外的信息或不同格式的数据。因此,在解析这些属性时要谨慎并考虑多种可能性。

通过上述方法,你应该能够找出为什么无法正确获取到温度值的原因,并据此进行调整。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=7958

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?