当前位置: 首页 > article >正文

openbmc sdbusplus接口使用(持续更新...)

1.说明

本节介绍如何使用sdbusplus,用来对应不同的场景。

可以参考之前的文章: https://blog.csdn.net/wit_yuan/article/details/145192471

建议阅读本篇文章一定要仔细阅读sd-bus specification

2.说明

2.1 简单server服务注册

本节参考: https://gitee.com/wit_yuan/openbmc_testcode/blob/yuan_test_sdbusplus_1/recipe-example/files/test_add_interface.cpp
简单的注册服务,可以只需要使用几个api即可,基本代码如下:

#include <xyz/openbmc_project/net/Calculator/client.hpp>
#include <xyz/openbmc_project/net/Calculator/server.hpp>
#include <sdbusplus/server.hpp>#include <iostream>
#include <string_view>#include <sdbusplus/asio/connection.hpp>
#include <sdbusplus/asio/object_server.hpp>
#include <sdbusplus/asio/property.hpp>#include <sys/sysinfo.h>
#include <systemd/sd-journal.h>static std::string busServiceName = "xyz.openbmc_project.test.MyTestService";
int main()
{std::shared_ptr<sdbusplus::asio::connection> conn;boost::asio::io_context io;conn = std::make_shared<sdbusplus::asio::connection>(io);conn->request_name(busServiceName.c_str());io.run();return 0;
}

简单说一下调用实际的功能:

std::make_shared<sdbusplus::asio::connection>(io)

在文件build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/asio/connection.hpp中有定义:

    connection(boost::asio::io_context& io) :sdbusplus::bus_t(sdbusplus::bus::new_default()), io_(io),socket(io_.get_executor(), get_fd()){read_immediate();}

因此,默认其实调用了函数:

sdbusplus::bus::new_default()

另外:sdbusplus::bus_t(sdbusplus::bus::new_default())实际调用了文件:build/evb-ast2500/workspace/sources/sdbusplus/src/bus.cpp中的函数内容:

bus::bus(busp_t b) :_intf(&sdbus_impl),_bus(_intf->sd_bus_ref(b), details::BusDeleter(&sdbus_impl))
{// Emitting object added causes a message to get the properties// which can trigger a 'transaction' in the server bindings.  If// the bus isn't up far enough, this causes an assert deep in// sd-bus code.  Get the 'unique_name' to ensure the bus is up far// enough to avoid the assert.if (b != nullptr){get_unique_name();}
}

因此:

_intf = &sdbus_impl,
_bus = _intf->sd_bus_ref(b)

在文件build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/sdbus.hpp:中可以看到:

class SdBusImpl : public SdBusInterface
{
int sd_bus_add_object_manager(...)
int sd_bus_add_object_vtable(...)
int sd_bus_add_match(...)
int sd_bus_attach_event( ...)
int sd_bus_call(...)
int sd_bus_call_async(...)
int sd_bus_detach_event(...)
int sd_bus_emit_interfaces_added_strv(...)
...
int sd_bus_emit_object_added(...)
int sd_bus_get_fd(...)
int sd_bus_message_enter_container(...)
sd_bus* sd_bus_message_get_bus(...)
const char* sd_bus_message_get_interface(...)
const char* sd_bus_message_get_path(...)
int sd_bus_message_is_method_call(..)
int sd_bus_message_new_method_call(...)
int sd_bus_message_new_signal(...)
int sd_bus_process(...)
int sd_bus_request_name(...)
void sd_bus_close(...)
int sd_bus_is_open(...)
int sd_bus_wait(...)
}
extern SdBusImpl sdbus_impl;

以及文件:build/evb-ast2500/workspace/sources/sdbusplus/src/sdbus.cpp中定义的:

#include <sdbusplus/sdbus.hpp>namespace sdbusplus
{
SdBusImpl sdbus_impl;
}

包含的均为sd-bus接口的调用封装。

注意函数read_immediate()调用函数:

    void read_immediate(){boost::asio::post(io_, [&] {if (process_discard()){read_immediate();}else{read_wait();}});}

因此,函数调用:

conn->request_name(busServiceName.c_str());

实际执行了文件build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/bus.hpp中的:

    void request_name(const char* service){int r = _intf->sd_bus_request_name(_bus.get(), service,(SD_BUS_NAME_ALLOW_REPLACEMENT | SD_BUS_NAME_REPLACE_EXISTING));if (r < 0){throw exception::SdBusError(-r, "sd_bus_request_name");}}

qemu启动之后,可以看到这个例子只是一个简单的例子,并无实际的意义,因为并不能找到相关的接口功能。执行结果如下:

在这里插入图片描述

2.2 添加接口

添加接口与相关的属性,才具初始的功能。

先分析2行代码:

    sdbusplus::asio::object_server obj_server = sdbusplus::asio::object_server(conn);Iface = obj_server.add_interface("/org/freedesktop" , busServiceName); Iface->initialize();

在文件:build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/asio/object_server.hpp中定义了:

    object_server(const std::shared_ptr<sdbusplus::asio::connection>& conn,const bool skipManager = false) : conn_(conn){if (!skipManager){add_manager("/");}}

因此默认skipManager = false,会调用add_manager("/");

Iface = obj_server.add_interface("/org/freedesktop" , busServiceName);

调用文件:build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/asio/object_server.hpp中的函数:

    std::shared_ptr<dbus_interface>add_interface(const std::string& path, const std::string& name){auto dbusIface = std::make_shared<dbus_interface>(conn_, path, name);interfaces_.emplace_back(dbusIface);return dbusIface;}

只需要注意:interfaces_是被定义在类中的私有变量:

  private:std::shared_ptr<sdbusplus::asio::connection> conn_;std::vector<std::shared_ptr<dbus_interface>> interfaces_;std::vector<server::manager_t> managers_;

另外,dbus_interface有在build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/asio/object_server.hpp中定义了:

    dbus_interface(std::shared_ptr<sdbusplus::asio::connection> conn,const std::string& path, const std::string& name) :conn_(conn), path_(path), name_(name){}

所以,在这里只完成了基本的赋值与将定义的接口放入vector(数组)中。

最后,需要调用:Iface->initialize();,可以看到调用了文件build/evb-ast2500/workspace/sources/sdbusplus/include/sdbusplus/asio/object_server.hpp中的:

    bool initialize(const bool skipPropertyChangedSignal = false){// can only register onceif (is_initialized()){return false;}vtable_.reserve(2 + property_callbacks_.size() +method_callbacks_.size() + signals_.size());vtable_.emplace_back(vtable::start());property_callbacks_.shrink_to_fit();for (auto& element : property_callbacks_){if (element.on_set_message_){vtable_.emplace_back(vtable::property_o(element.name_.c_str(), element.signature_, get_handler,set_handler, reinterpret_cast<size_t>(&element),element.flags_ | SD_BUS_VTABLE_ABSOLUTE_OFFSET));}else{vtable_.emplace_back(vtable::property_o(element.name_.c_str(), element.signature_, get_handler,reinterpret_cast<size_t>(&element),element.flags_ | SD_BUS_VTABLE_ABSOLUTE_OFFSET));}}method_callbacks_.shrink_to_fit();for (auto& element : method_callbacks_){vtable_.emplace_back(vtable::method_o(element.name_.c_str(), element.arg_signature_,element.return_signature_, method_handler,reinterpret_cast<size_t>(&element),element.flags_ | SD_BUS_VTABLE_ABSOLUTE_OFFSET));}signals_.shrink_to_fit();for (const auto& element : signals_){vtable_.emplace_back(vtable::signal(element.name_.c_str(), element.signature_));}vtable_.emplace_back(vtable::end());vtable_.shrink_to_fit();interface_.emplace(static_cast<sdbusplus::bus_t&>(*conn_),path_.c_str(), name_.c_str(),static_cast<const sd_bus_vtable*>(&vtable_[0]),nullptr);conn_->emit_interfaces_added(path_.c_str(),std::vector<std::string>{name_});if (!skipPropertyChangedSignal){for (const auto& element : property_callbacks_){signal_property(element.name_);}}return true;}

另外,分析一下内容:

vtable_.reserve(2 + property_callbacks_.size() +method_callbacks_.size() + signals_.size());

可以看到代码是在vtable是针对propertymethodsignals的执行操作,由于SD_BUS_VTABLE_START(0)SD_BUS_VTABLE_END占用2个空间,故加2。

这一节的代码参考: https://gitee.com/wit_yuan/openbmc_testcode/blob/yuan_add_interface/recipe-example/files/test_add_interface.cpp

需要之前的hello服务器程序运行起来。

在这里插入图片描述
同样,可以看到设置和获取property值的变化:

在这里插入图片描述

相关文章:

openbmc sdbusplus接口使用(持续更新...)

1.说明 本节介绍如何使用sdbusplus&#xff0c;用来对应不同的场景。 可以参考之前的文章: https://blog.csdn.net/wit_yuan/article/details/145192471 建议阅读本篇文章一定要仔细阅读sd-bus specification 2.说明 2.1 简单server服务注册 本节参考: https://gitee.com…...

2.12寒假作业

web&#xff1a;[HDCTF 2023]Welcome To HDCTF 2023 可以直接玩出来 但是这边还是看一下怎么解吧&#xff0c;看一下js代码&#xff0c;在js.game里面找到一个类似brainfuck加密的字符串 解密可以得到答案&#xff0c;但是后面我又去了解了一下let函数let命令、let命令 let命…...

GitHub项目推荐--适合练手的13个C++开源项目

1 C 那些事 这是一个适合初学者从入门到进阶的仓库&#xff0c;解决了面试者与学习者想要深入 C及如何入坑 C的问题。 除此之外&#xff0c;本仓库拓展了更加深入的源码分析&#xff0c;多线程并发等的知识&#xff0c;是一个比较全面的 C 学习从入门到进阶提升的仓库。 项目…...

【识别摄像头野外动物场景行为】

识别野外动物摄像头下的行为及动作&#xff0c;主要依赖于摄像头的拍摄质量、动物的行为特征以及可能的智能图像识别技术。以下是对这一过程的详细分析&#xff1a; 一、摄像头的作用与拍摄质量 监控与记录&#xff1a;野外动物摄像头&#xff0c;如红外相机&#xff0c;被广泛…...

Linux inode 详解

简介 索引节点&#xff08;Index Node&#xff09;是 Linux/类unix 系统文件系统上的一种数据结构&#xff0c;用于存储有关文件或目录的元数据。它包含文件的所有信息&#xff0c;除了文件名和数据。inode 在文件系统如何存储和检索数据方面起着至关重要的作用。 当在 Linux…...

程序员升级进阶之路

熟悉业务、项目代码、工作流程&#xff0c;积极吸取技术资料接需求&#xff0c;画流程图&#xff0c;&#xff08;伪代码&#xff09;&#xff0c;详细设计明确职业发展方向【很重要】求精&#xff1a;写代码前的技术方案设计 写代码并不难&#xff0c;关键是要明确为什么要写…...

linux下c++连接mysql

1、下载mysql客户端使用的库文件 sudo apt install libmysqlclient-dev 头文件一般在 /usr/include/mysql/ 下 库文件一般在 /usr/lib/x86_64-linux-gnu/ 下 2、mysql c api开发者指南 >>>>官方连接 3、API使用实例 #include<mysql/mysql.h> #include&…...

C语言基础入门:1.3编译流程与调试基础

编译流程与调试基础 ——从源代码到可执行文件的魔法解密 一、编译四重奏&#xff1a;代码的变身之旅 C程序的编译过程如同汽车组装流水线&#xff0c;分为四个精密阶段&#xff1a; 预处理&#xff08;Preprocessing&#xff09; gcc -E hello.c -o hello.i # 生成预处理文件…...

AcWing 792. 高精度减法

题目来源&#xff1a; AcWing - 算法基础课 题目内容&#xff1a; 给定两个正整数&#xff08;不含前导 0&#xff09;&#xff0c;计算它们的差&#xff0c;计算结果可能为负数。 输入格式 共两行&#xff0c;每行包含一个整数。 输出格式 共一行&#xff0c;包含所求的…...

Python爬虫实战:获取51job职位信息,并做数据分析

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备 python import requests from bs4 import BeautifulSoup import pandas as pd import re import matplotlib.pyplot as plt 2. 爬虫核心代码(带反爬…...

【2025 Nature】AI 生成材料算法 MatterGen 文章要点

文章目录 1. MatterGen 框架2. 评价基础模型生成能力的指标3. MatterGen 基础生成能力表现4. MatterGen 定向生成能力表现i. 指定晶体化学式ii. 指定标量性质1. 每个性质微调一次。2. 两个性质联合微调 5. 实验合成6. 模型细节 这篇文档简单介绍 MatterGen 论文亮点。 标题&…...

时间序列分析(三)——白噪声检验

此前篇章&#xff1a; 时间序列分析&#xff08;一&#xff09;——基础概念篇 时间序列分析&#xff08;二&#xff09;——平稳性检验 一、相关知识点 白噪声的定义&#xff1a;白噪声序列是一种在统计学和信号处理中常见的随机过程&#xff0c;由一系列相互独立、具有相同…...

STM32-知识

一、Cortex-M系列双指针 Cortex-M系列的MSP与PSP有一些重要的区别&#xff0c;双指针是为了保证OS的安全性和稳健性。本质上&#xff0c;区别于用户程序使用PSP&#xff0c;操作系统和异常事件单独使用一个MSP指针的目的&#xff0c;是为了保证栈数据不会被用户程序意外访问或…...

将Mac上Python程序的虚拟环境搬到Windows

1. 导出Mac上Python虚拟环境的依赖 cd py && source venv/bin/activate && pip freeze > requirements.txt 2. 在Windows上创建一个新的虚拟环境 python -m venv venv 3. 激活虚拟环境 venv\Scripts\activate 4. 安装依赖 pip install -r requiremen…...

[前端] axios网络请求二次封装

一、场景描述 为什么要对axios网络请求进行二次封装? 解决代码的复用&#xff0c;提高可维护性。 —这个有两个方案&#xff1a;一个是二次封装一个是实例化。&#xff08;设置一些公共的参数&#xff0c;然后进行请求&#xff09; 为什么可以解决代码的复用&#xff1a; 这是…...

对前端的技术进行分层

前端相比较后端而言&#xff0c;由于其发展历史和浏览器的标准不一&#xff0c;导致其看上去简单&#xff0c;但是深入起来又很复杂&#xff0c;在最开始学习的时候&#xff0c;我们往往是了解一下三剑客和vue、react的api就开始上手工作了&#xff0c;但是到后面会发现&#x…...

【学术投稿-2025年计算机视觉研究进展与应用国际学术会议 (ACVRA 2025)】CSS样式解析:行内、内部与外部样式的区别与优先级分析

简介 2025年计算机视觉研究进展与应用&#xff08;ACVRA 2025&#xff09;将于2025年2月28-3月2日在中国广州召开&#xff0c;会议将汇聚世界各地的顶尖学者、研究人员和行业专家&#xff0c;聚焦计算机视觉领域的最新研究动态与应用成就。本次会议将探讨前沿技术&#xff0c;…...

【Linux】【网络】IO多路复用 select、poll、epoll

【Linux】【网络】IO多路复用 select、poll、epoll IO 多路复用 进程或线程同时监控多个文件描述符&#xff0c;查看描述符上是否有事件发生&#xff0c;从而提高资源利用率和系统吞吐量。 1. select int select(int maxfd, fd_set *readfds, fd_set *writefds, fd_set *exc…...

讲解下MySql的外连接查询在SpringBoot中的使用情况

在Spring Boot中使用MySQL的外连接查询时&#xff0c;通常通过JPA、MyBatis或JDBC等持久层框架来实现。外连接查询主要用于从多个表中获取数据&#xff0c;即使某些表中没有匹配的记录。外连接分为左外连接&#xff08;LEFT JOIN&#xff09;、右外连接&#xff08;RIGHT JOIN&…...

OpenGL-基础知识(更新中)

本文基于The Cherno在Youtube上的OpenGL系列视频总结出的笔记&#xff0c;等这个系列视频学习完后&#xff0c;将更加系统详细的学习《计算机图形学编程&#xff08;使用OpenGL和C 第二版&#xff09;》这本书。个人认为看cherno的视频上手速度更快&#xff0c;而且他对基本概念…...

逆设计之下,数字纳米光子器件将走向何方?

数字纳米光子器件逆设计是纳米光子学领域中一种创新且极具潜力的设计方法&#xff0c;以下为你详细介绍&#xff1a; 基本概念 纳米光子器件&#xff1a;是指尺寸在纳米量级的光子器件&#xff0c;利用光子&#xff08;光的粒子&#xff09;来传输、处理和存储信息。与传统电…...

麒麟信安系统隔核后iperf网络测试影响说明

1、背景介绍 采用麒麟信安系统&#xff0c;在飞腾平台&#xff08;X86平台类似&#xff09;上进行了系统核隔离&#xff0c;修改了grub.cfg配置文件中的启动项增加isolcpus2-63 操作&#xff0c;隔核后发现40G网络iperf测试存在影响。 测试命令 taskset -c 16-23 iperf -s -…...

WPF进阶 | WPF 资源管理与本地化:多语言支持与资源复用

WPF进阶 | WPF 资源管理与本地化&#xff1a;多语言支持与资源复用 前言一、WPF 资源管理基础1.1 什么是 WPF 资源1.2 资源的定义与存储位置1.3 资源的引用方式 二、资源字典的深入应用2.1 创建资源字典2.2 在应用程序中合并资源字典2.3 资源字典的层级结构与合并顺序 三、WPF …...

数据结构与算法-动态规划-区间dp(石子合并,环形石子合并,凸多边形的划分,加分二叉树,棋盘分割)

概念 区间动态规划&#xff08;Interval Dynamic Programming&#xff09;是动态规划的一个分支&#xff0c;它在处理一些与区间相关的最优解问题上非常有效。以下从基本概念、解题步骤、经典例题、优缺点等方面为你详细介绍&#xff1a; 基本概念&#xff1a;区间 DP 的核心…...

32单片机学习记录4之串口通信

32单片机学习记录4之串口通信 前置 STM32的GPIO口有通用模式&#xff0c;复用模式&#xff0c;模拟模式三种&#xff0c;加上输入输出就是有6中对应的模式。 我学习了通用模式&#xff0c;会使用GPIO口使用一些简单外设&#xff0c;如LED&#xff0c;独立按键&#xff0c;红外…...

开源、免费项目管理工具比较:2025最新整理30款

好用的开源、免费版项目管理系统有&#xff1a;1.Redmine&#xff1b;2. Taiga&#xff1b;3. OpenProject&#xff1b; 4.ProjectLibre&#xff1b; 5.GanttProject&#xff1b; 6.Tuleap&#xff1b; 7.Trac&#xff1b;8. Phabricator&#xff1b; 9.Notion&#xff1b; 10.…...

Android10 音频参数导出合并

A10 设备录音时底噪过大&#xff0c;让音频同事校准了下&#xff0c;然后把校准好的参数需要导出来&#xff0c;集成到项目中&#xff0c;然后出包&#xff0c;导出方式在此记录 设备安装debug系统版本调试好后&#xff0c; adb root adb remount adb shell 进入设备目录 导…...

在 Azure 上部署 DeepSeek 并集成 Open WebUI

DeepSeek 是杭州深度求索人工智能基础技术研究有限公司发布的开源大模型&#xff0c;最近是持续火爆&#xff0c;使得官方服务经常不可用。网上各种本地部署和私有部署的文章已经很多&#xff0c;这里我们提供一个全部基于 Azure 的私有部署方案。 使用 Azure AI Foundry 部署…...

Springboot整合支付宝支付

支付宝支付功能 步骤一&#xff1a;沙箱配置支付宝沙箱配置 步骤二&#xff1a;使用内网穿透步骤三&#xff1a;开始对接SDK配置文件支付 步骤一&#xff1a;沙箱配置 支付宝沙箱配置 需要有支付宝沙箱&#xff1a;提供一个虚拟的支付环境&#xff0c;用于测验调试&#xff0…...

deepseek+kimi一键生成PPT

1、deepseek生成大纲内容 访问deepseek官方网站&#xff1a;https://www.deepseek.com/ 将你想要编写的PPT内容输入到对话框&#xff0c;点击【蓝色】发送按钮&#xff0c;让deepseek生成内容大纲&#xff0c;并以markdown形式输出。 等待deepseek生成内容完毕后&#xff0c…...