首页/新闻资讯/正文详情

openubmc 扩展对外接口-新增ipmi命令

发布时间:2026/9/26 19:31:45 来源:云帆数科 栏目:资讯中心
openubmc 扩展对外接口-新增ipmi命令
新增IPMI命令 ​IPMI(智能平台管理接口)Intelligent Platform Management Interface 的缩写是常用的服务器带外管理协议之一。IPMI模型定义 ​openUBMC中提供了一套描述IPMI模型的方式也属于MDS模型的一部分因此仅需在MDS中定义IPMI命令便可自动生成IPMI命令的封装解析帮助函数代码。详细的IPMI模型定义请参考《MDS》也是在 my_app 组件下增加cd /home/workspace/my_app打开mds/ipmi.json(如果没有该文件请新建)粘贴下面的代码{ package: MyAppIpmiCmds, cmds: { GetSecretNumber: { netfn: 0x30, cmd: 0x90, priority: OEM, role: Operator, privilege: [BasicSetting], req: [ {data: SubCommand, baseType: U8, len: 1B, value: 0x88}, {data: ManufactureId, baseType: U32, len: 3B, value: 0x0007db}, {data: Action, baseType: U8, len: 1B, value: 0x00} ], rsp: [ {data: CompletionCode, baseType: U8, len: 1B}, {data: SecretNumber, baseType: U32, len: 3B} ] }, SetSecretNumber: { netfn: 0x30, cmd: 0x90, priority: OEM, role: Operator, privilege: [BasicSetting], req: [ {data: SubCommand, baseType: U8, len: 1B, value: 0x88}, {data: ManufactureId, baseType: U32, len: 3B, value: 0x0007db}, {data: Action, baseType: U8, len: 1B, value: 0x01}, {data: Data, baseType: U32, len: 3B} ], rsp: [ {data: CompletionCode, baseType: U8, len: 1B} ] } } }这里我们创建了两个IPMI命令都是NetFn 0x30, CMD 0x900x30 0x90 0x88 0xdb 0x07 0x00 0x00此命令用于查询SecretNumber0x30 0x90 0x88 0xdb 0x07 0x00 0x01此命令用于设置SecretNumber定义完后我们需要使用自动生成代码进行代码生成。bingo gen代码编写 ​通过自动生成代码我们获得了IPMI命令解析、封装和路由的能力但我们仍需编写IPMI命令的业务部分即将数据返回出去或者将传入的数据设置在内存中。打开my_app_app.lua首先要在头部加载生成的IPMI文件local class require mc.class -- lua开发框架提供的增强类型系统 local c_service require my_app.service -- 自动生成代码生成的组件基类 -- 新增ipmi相关文件 local ipmi_struct require my_app.ipmi.ipmi local ipmi_msg require my_app.ipmi.ipmi_message local ipmi require ipmi然后在app:init()中注册对应IPMI的回调函数function app:init() -- 组件的初始化函数 app.super.init(self) -- 先调用基类的初始化函数 self.my_mds_model self:CreateMyMDSModel(1, function(object) -- 创建一个mds对象实例 object.ObjectName MyMDSModel_1 -- 在回调函数中进行对象的属性赋值 object.WelcomeMessage Hello OpenUBMC! object.SecretNumber 330 end) self:register_ipmi() end function app:register_ipmi() self:register_ipmi_cmd(ipmi_struct.GetSecretNumber, function(req, ctx, ...) return ipmi_msg.GetSecretNumberRsp.new(ipmi.types.Cc.Success, self.my_mds_model.SecretNumber) end) self:register_ipmi_cmd(ipmi_struct.SetSecretNumber, function(req, ctx, ...) if req.Data 630 then return ipmi_msg.SetSecretNumberRsp.new(ipmi.types.Cc.InvalidFieldRequest) end self.my_mds_model.SecretNumber req.Data return ipmi_msg.SetSecretNumberRsp.new(ipmi.types.Cc.Success) end) end完整 my_app_app.lualocal class require mc.class -- lua开发框架提供的增强类型系统 local c_service require my_app.service -- 自动生成代码生成的组件基类 -- 新增ipmi相关文件 local ipmi_struct require my_app.ipmi.ipmi local ipmi_msg require my_app.ipmi.ipmi_message local ipmi require ipmi local app class(c_service) -- 创建一个组件类型 function app:ctor() -- 组件的构造函数 end function app:init() -- 组件的初始化函数 app.super.init(self) -- 先调用基类的初始化函数 self.my_mds_model self:CreateMyMDSModel(1, function(object) -- 创建一个mds对象实例名字为1 object.ObjectName MyMDSModel_1 -- 在回调函数中进行对象的属性赋值 object.WelcomeMessage Hello OpenUBMC! object.SecretNumber 330 end) self.register_ipmi() -- 注册对应IPMI的回调函数 end function app:register_ipmi() self:register_ipmi_cmd(ipmi_struct.GetSecretNumber, function(req, ctx, ...) return ipmi_msg.GetSecretNumberRsp.new(ipmi.types.Cc.Success, self.my_mds_model.SecretNumber) end) self:register_ipmi_cmd(ipmi_struct.SetSecretNumber, function(req, ctx, ...) if req.Data 630 then return ipmi_msg.SetSecretNumberRsp.new(ipmi.types.Cc.InvalidFieldRequest) end self.my_mds_model.SecretNumber req.Data return ipmi_msg.SetSecretNumberRsp.new(ipmi.types.Cc.Success) end) end return app当查询IPMI命令来的时候我们返回MyMDSModel中存储的SecretNumber当设置IPMI命令来的时候我们先判断数值是否有效如果有效则修改对应的内存数据并返回成功。组件构建 ​代码写完后我们需要测试一下我们写的代码。首先先进行组件构建。因为我们对组件的功能进行了修改因此我们可以通过递增组件的版本用于区分。首先打开mds/service.json修改version字段从0.0.1修改至0.0.2bingo build --stagestable构建完成后我们可以通过日志发现我们构建了一个构建标签为 my_app/0.0.2openubmc/stable 的版本。我们之前的 my_app/0.0.1openubmc/stable 版本仍存在且不受影响。如果需要使用之前的版本仍可以通过依赖 my_app/0.0.1openubmc/stable 标签进行使用。整包构建 ​之前的版本我们使用的是my_app/0.0.1版本现在我们需要将版本改至my_app/0.0.2然后再进行整包构建。bingo build构建完成后便可在manifest/output中查看构建包。整包测试 ​整包升级后我们再次查看一下my_app的资源source /etc/profile busctl --user tree bmc.kepler.my_app└─/bmc |─/bmc/demo | └─/bmc/demo/MyMDSModel | └─/bmc/demo/MyMDSModel/1 |─/bmc/kepler |─/bmc/kepler/IpmiCmds | └─/bmc/kepler/IpmiCmds/30 | └─/bmc/kepler/IpmiCmds/30/90 | |─/bmc/kepler/IpmiCmds/30/90/GetSecretNumber | └─/bmc/kepler/IpmiCmds/30/90/SetSecretNumber └─/bmc/kepler/my_app └─/bmc/kepler/my_app/MicroComponent这里多了一些IPMI的资源证明我们成功的将IPMI注册到了我们组件上面SDK在启动阶段会通过遍历这些资源更新系统整体IPMI路由表。通过ipmitool我们可以快速测试ipmi命令是否可以访问。 ./ipmitool.exe -H ip -I lanplus -p 623 -U TestUser -P OpenUBMC123 -C 17 raw 0x30 0x90 0x88 0xdb 0x07 0x00 0x00 00 30 03命令返回330正是我们在代码中定义的SecretNumber再次通过设置命令将SecretNumber设置成630。ipmitool需要输入十六进制也就是0x000276# SetSecretNumber ./ipmitool.exe -H ip -I lanplus -p 623 -U TestUser -P OpenUBMC123 -C 17 raw 0x30 0x90 0x88 0xdb 0x07 0x00 0x01 0x76 0x02 0x00 # 当命令成功时成功码不会显示返回显示为空行 # GetSecretNumber ./ipmitool.exe -H ip -I lanplus -p 623 -U TestUser -P OpenUBMC123 -C 17 raw 0x30 0x90 0x88 0xdb 0x07 0x00 0x00 76 02 00设置成功并再次下发查询命令得到630与我们设置的数值一致。

相关推荐

openubmc 新增硬件资源对象
openubmc 新增硬件资源对象

新增硬件资源对象 ​ CSR中的对象定义来源于MDS模型,通过实例化MDS类定义,我们便可以很方便的在对应的设备配置中,将所需要的硬件管理数据配置齐全,然后在组件中对资源对象进行业务逻辑编写。 MDS对象定义 ​ 首先我们需要在my_ap… · 2026/9/26 19:31:39

openubmc 新增一个 IPMI Sensor
openubmc 新增一个 IPMI Sensor

新增一个IPMI Sensor ​ 一个常见的场景便是需要将硬件上的某一个器件的读值,通过IPMI协议中定义的门限传感器呈现给用户。在本章节中,我们将配置一个LM75温度器件,同时配置一个对应的IPMI门限传感器,并呈现至对外接口。 CSR配置 … · 2026/9/26 19:31:39

从代码问答到任务执行:AI Agent编排、状态与告警的工程实践
从代码问答到任务执行:AI Agent编排、状态与告警的工程实践

1. 从"会聊"到"会干活":我为什么重新设计一个代码问答工具1.1 纯问答模式的三个死穴在决定动手做羲和(XiheAgent)之前,我其实已经用了大半年的代码问答工具。日常查接口、问实现思路、让模型帮忙解释一段复杂… · 2026/9/26 19:31:39

Atlas 300V 24G跑YOLO实战指南:环境配置、模型转换与性能调优
Atlas 300V 24G跑YOLO实战指南:环境配置、模型转换与性能调优

“atlas 300v 24g 是运算加速卡吗?”这句搜索词每隔几天就会出现在我的后台,凡是搜这句话的人,下一步九成都会接上“部署yolo”。原因也很直白:大显存、价格比同显存的训练卡便宜不少、看起来插上就能跑AI模型,确实像个… · 2026/9/26 20:50:13

黑苹果OpenCore 0.6.3 EFI制作全攻略:从零定制config.plist
黑苹果OpenCore 0.6.3 EFI制作全攻略:从零定制config.plist

玩黑苹果的人都知道,真正决定一台机器能不能顺利进系统的,不是那个安装镜像,而是 EFI 分区里的那一整套文件。OpenCore 0.6.3 是 2020 年底开始被大规模采用的引导器版本,用这套引导器配合按机器硬件定制出来的 EFI 目录&#xff… · 2026/9/26 20:50:13

WinHex中文设置与数据恢复实战:语言包安装和报错排查
WinHex中文设置与数据恢复实战:语言包安装和报错排查

很多第一次接触 WinHex 的朋友,多半是被同事或教程推荐来做数据恢复、磁盘镜像或底层二进制分析。打开软件的一瞬间,满屏英文菜单确实让人头大——File、Edit、Search、Tools,这些词本身不难,但组合起来找某个功能就费劲了。尤其数… · 2026/9/26 20:50:07

ax是什么?深入解析Agent eXecution智能体基座原理与K8s集成实践
ax是什么?深入解析Agent eXecution智能体基座原理与K8s集成实践

1. 项目概述:从“ax”这个神秘缩写切入,搞懂它到底是什么、能干什么、为什么值得花时间深挖最近在多个技术社区和开源项目讨论区里,“ax”这个词高频出现,但很少有人讲清楚它到底指什么。它既不是某个知名商业产品的代号&#xff… · 2026/9/26 20:50:00

IDEA推代码到Gitee码云全流程:SSH密钥配置与分支冲突解决指南
IDEA推代码到Gitee码云全流程:SSH密钥配置与分支冲突解决指南

先说个我最近常遇到的场景:本地项目在 IDEA 里编译运行一点问题没有,结果到了要提交交付的时候,团队的人说“把代码传到码云仓库”,不少同学就卡在第一步。只记了一句git push,后面跟着就是认证失败、分支对不上、远程… · 2026/9/26 20:50:00

WAF规则层注入绕过全解析:原理、手法与加固
WAF规则层注入绕过全解析:原理、手法与加固

WAF这东西,圈里人对它的态度一直很分裂。有人把它当万能保险箱,规则一开就高枕无忧;有人觉得它就是个摆设,随便一个变形的注入就能打穿。我做了几年安全和运维相关的工作,大大小小的WAF也见了不少,说实话&a… · 2026/9/26 20:50:00

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码