如何在自定义组件中调用别的服务的方法?

问题描述

如题,比如想在自定义的组件my_app中调用bmc.kepler.sensor
服务中的GetSensorList的方法,该如何配置json文件?

/bmc/kepler/Chassis/1/Sensors对象中有这个方法,我想在my_app中调用

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2506]

期望结果

可以在json配置完后在lua中使用

尝试过的解决方案

看了rackmount中的方法,觉得不太适用,因为并不是想通过redfish或cli等接口调用的,所以也不存在GET等请求方法

答案内容由AI生成,仅供参考:

如何在自定义组件中调用其他服务的方法

根据您提供的上下文信息,您希望在自定义组件 my_app 中调用 bmc.kepler.sensor 服务中的 GetSensorList 方法。以下是完整的配置和使用方法。

1. 修改 service.json 配置文件

首先需要在 my_app 组件的 mds/service.json 文件中声明对目标服务的依赖。

{
  "dependencies": {
    "required": [
      {
        "interface": "bmc.kepler.Chassis.Sensors",
        "path": "/bmc/kepler/Chassis/1/Sensors",
        "description": "依赖 sensor 服务的传感器管理接口"
      }
    ]
  }
}

2. 生成客户端代码

当配置完成后,运行 bingo gen 命令生成客户端代码:

bingo gen

这个命令会根据 service.json 的配置自动生成 client.lua 文件,其中包含访问其他组件资源的函数。

3. 在 Lua 中调用其他服务的方法

方法一:使用自动生成的客户端方法

my_app 的 Lua 代码中,可以通过生成的客户端接口调用方法:

-- 获取客户端实例
local client = require('my_app.client')

function app:callSensorService()
    -- 调用 GetSensorList 方法
    local err, sensor_list = self.bus:pcall(
        "bmc.kepler.sensor",
        "/bmc/kepler/Chassis/1/Sensors",
        "bmc.kepler.Chassis.Sensors",
        "GetSensorList",
        "a{ss}",
        {}
    )
    
    if err then
        log:error("调用 GetSensorList 失败: " .. tostring(err))
        return nil
    end
    
    return sensor_list
end

方法二:直接使用 D-Bus 调用

也可以直接使用 D-Bus 接口调用:

function app:getSensorList()
    local bus = self.bus
    
    -- 直接调用 GetSensorList 方法
    local result = bus:call(
        "bmc.kepler.sensor",                    -- 服务名
        "/bmc/kepler/Chassis/1/Sensors",       -- 对象路径
        "bmc.kepler.Chassis.Sensors",          -- 接口名
        "GetSensorList"                        -- 方法名
    )
    
    return result
end

4. 验证接口可用性

可以使用以下命令验证接口是否正确配置:

# 查看服务提供的接口
busctl --user introspect bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors

# 直接调用方法测试
busctl --user call bmc.kepler.sensor /bmc/kepler/Chassis/1/Sensors bmc.kepler.Chassis.Sensors GetSensorList a{ss} 0

5. 关键注意事项

  1. 依赖声明必须准确:在 service.json 中声明的接口名称和路径必须与实际服务完全一致。

  2. 组件生命周期管理:确保 sensor 组件在 my_app 之前启动,可通过配置启动顺序来保证。

  3. 错误处理:建议添加完善的错误处理机制,因为目标服务可能尚未就绪。

  4. 上下文传递:如需传递调用上下文,可以将 ctx 参数从调用方传入。

-- 如果需要传递上下文
local err, result = self.bus:pcall(
    "bmc.kepler.sensor",
    "/bmc/kepler/Chassis/1/Sensors",
    "bmc.kepler.Chassis.Sensors",
    "GetSensorList",
    "a{ss}",
    context.new()  -- 或传入调用方的 ctx
)

按照以上步骤配置后,您就可以在自定义组件中成功调用其他服务的方法了。

修改了service.json后bingo gen会报错

python3 /home/workspace/my_app/temp/lua_codegen/script/gen_intf_rpc_json.py -i /home/workspace/my_app/mds/service.json -o /home/workspace/my_app/temp/lua_codegen/temp/my_app/client.json -d /home/workspace/my_app/temp/lua_codegen/../../temp/opt/bmc/apps/mdb_interface/ -s /home/workspace/my_app/mds/service.json -c
Traceback (most recent call last):
File “/home/workspace/my_app/temp/lua_codegen/script/gen_intf_rpc_json.py”, line 568, in
main(sys.argv[1:])
File “/home/workspace/my_app/temp/lua_codegen/script/gen_intf_rpc_json.py”, line 557, in main
generate_client(m_input, output, mdb_path, service_json_path, path_level)
File “/home/workspace/my_app/temp/lua_codegen/script/gen_intf_rpc_json.py”, line 483, in generate_client
fill_client_intf(service, imports, mdb_path, required, required[PATH])
File “/home/workspace/my_app/temp/lua_codegen/script/gen_intf_rpc_json.py”, line 441, in fill_client_intf
class_name, path_json = utils.get_path_by_interface(mdb_path, required[“interface”], path)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/home/workspace/my_app/temp/lua_codegen/script/mds_util.py”, line 46, in get_path_by_interface
for obj_file in os.scandir(real_path):
^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: ‘/home/workspace/my_app/temp/lua_codegen/../../temp/opt/bmc/apps/mdb_interface/path/mdb/bmc/kepler/Chassis/1/Sensors’
make[3]: *** [Makefile:240: /home/workspace/my_app/temp/lua_codegen/temp/my_app/client.json] Error 1
make[3]: Leaving directory ‘/home/workspace/my_app/temp/lua_codegen/templates/apps’
make[2]: *** [Makefile:12: apps] Error 2
make[2]: Leaving directory ‘/home/workspace/my_app/temp/lua_codegen/templates’
make[1]: *** [Makefile:68: gen] Error 2
make[1]: Leaving directory ‘/home/workspace/my_app/temp/lua_codegen’
make: *** [Makefile:18: gen] Error 2
ERROR: Traceback (most recent call last):
File “/usr/local/lib/python3.12/dist-packages/bmcgo/cli/cli.py”, line 355, in run
return method(command_args)
^^^^^^^^^^^^^^^^^^^^
File “/usr/local/lib/python3.12/dist-packages/bmcgo/cli/cli.py”, line 159, in gen
gen.run()
File “/usr/local/lib/python3.12/dist-packages/bmcgo/component/gen.py”, line 110, in run
self.generate_lua_run(parser, base_version)
File “/usr/local/lib/python3.12/dist-packages/bmcgo/component/gen.py”, line 122, in generate_lua_run
codegen.gen(args)
File “/usr/local/lib/python3.12/dist-packages/bmcgo/codegen/lua/codegen.py”, line 164, in gen
self.generate_code_run(args)
File “/usr/local/lib/python3.12/dist-packages/bmcgo/codegen/lua/codegen.py”, line 145, in generate_code_run
subprocess.run(cmd, env=dict(os.environ, LUA_FORMAT=lua_format, LUA_CODEGEN_VERSION=str(self.version),
File “/usr/lib/python3.12/subprocess.py”, line 571, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command ‘[’/usr/bin/make’, ‘-j12’, ‘PROJECT_NAME=my_app’, ‘TPL_DIR=/home/workspace/my_app/temp/lua_codegen’, ‘VERSION=3’, ‘gen’]’ returned non-zero exit status 2.
ERROR: Command ‘[’/usr/bin/make’, ‘-j12’, ‘PROJECT_NAME=my_app’, ‘TPL_DIR=/home/workspace/my_app/temp/lua_codegen’, ‘VERSION=3’, ‘gen’]’ returned non-zero exit status 2.
ERROR: 请查看日志信息

参考下别的组件配置requires字段,看报错是你这个配置和你调用方法的接口定义路径不符合

感谢指导,把path改成*就不会报错了

在my_app_app.lua中添加了这句代码后,组件无法加载了,串口会报自检错误

1970-01-01 06:08:40.703214 maca ERROR: init.lua(184): [my_app]StartupCheck failed, error: org.freedesktop.DBus.Error.ServiceUnknown: The name bmc.kepler.my_app was not provided by any .service files, check count: 1

那行加个pcall,打印下看看

感谢指导,问题已解决!