D-Bus 接口模块文档
本文档介绍了为Lua提供的DBus接口模块,允许在Lua脚本中创建和管理D-Bus接口。
概述
D-Bus接口模块提供了用于创建和管理D-Bus接口的Lua API,包括其关联的属性、方法和信号。它遵循D-Bus规范标准,适用于接口命名、成员名称和类型签名。
创建接口
new(name)
使用指定名称创建新的D-Bus接口。
参数:
name(字符串):D-Bus接口名称。必须遵循D-Bus命名约定(例如:"org.freedesktop.DBus.Properties")。
返回值:
- 可用于注册属性、方法和信号的接口对象。
示例:
local ldbus = require('ldbus')
local l_interface = ldbus.interface
local my_interface = l_interface.new("com.example.MyInterface")
接口方法
add_property(name, signature, default_value, readonly, flags)
向接口添加属性。
参数:
name(字符串):遵循D-Bus成员命名规则的属性名称(必须以字母/下划线开头,只能包含字母数字字符和下划线)。signature(字符串):属性值的D-Bus类型签名(例如:"s"表示字符串,"i"表示整数)。default_value:属性的默认值。readonly(布尔):属性是否为只读。flags(数字):属性的附加标志。
示例:
my_interface:add_property("Status", "s", "unknown", true, 0) -- 只读字符串属性
my_interface:add_property("Count", "i", 0, false, 0) -- 可写的整数属性
add_method(name, input_signature, output_signature, callback, flags)
向接口添加方法。
参数:
name(字符串):遵循D-Bus成员命名规则的方法名称。input_signature(字符串):输入参数的D-Bus类型签名。output_signature(字符串):输出参数的D-Bus类型签名。callback(函数):调用方法时执行的Lua函数。flags(数字):方法的附加标志。
示例:
local function my_method_impl(param1, param2)
-- 实现代码在这里
return result
end
my_interface:add_method("DoSomething", "ss", "i", my_method_impl, 0)
add_signal(name, signature, flags)
向接口添加信号。
参数:
name(字符串):遵循D-Bus成员命名规则的信号名称。signature(字符串):信号参数的D-Bus类型签名。flags(数字):信号的附加标志。
示例:
my_interface:add_signal("StateChanged", "s", 0)
set_property(name, value)
设置属性的值。
参数:
name(字符串):要设置的属性名称。value:属性的新值。
注意: 尝试设置只读属性会抛出错误。
示例:
my_interface:set_property("Status", "active")
get_property(name)
获取属性的值。
参数:
name(字符串):要获取的属性名称。
返回值:
- 属性的当前值。
示例:
local current_status = my_interface:get_property("Status")
print("当前状态: " .. current_status)
get_name()
获取接口的名称。
返回值:
- 包含接口名称的字符串。
示例:
local interface_name = my_interface:get_name()
print("接口名称: " .. interface_name)
支持的D-Bus签名
该模块支持所有标准的D-Bus类型签名:
| 代码 | 类型 | 描述 |
|---|---|---|
| y | BYTE | 8位无符号整数 |
| b | BOOLEAN | 布尔值 |
| n | INT16 | 16位有符号整数 |
| q | UINT16 | 16位无符号整数 |
| i | INT32 | 32位有符号整数 |
| u | UINT32 | 32位无符号整数 |
| x | INT64 | 64位有符号整数 |
| t | UINT64 | 64位无符号整数 |
| d | DOUBLE | 64位浮点数 |
| s | STRING | UTF-8字符串 |
| o | OBJECT_PATH | 对象路径 |
| g | SIGNATURE | 类型签名 |
| a | ARRAY | 项目数组 |
| ( ) | STRUCT | 结构化数据 |
| { } | DICT_ENTRY | 字典条目 |
| v | VARIANT | 变体类型 |
复杂类型示例:
"as"- 字符串数组"a{sv}"- 映射字符串到变体的字典"(ii)"- 包含两个整数的结构"a(ii)"- 包含两个整数结构的数组
错误处理
当以下情况发生时,模块会抛出Lua错误:
- 使用无效的接口、方法、属性或信号名称
- 提供无效的D-Bus签名
- 尝试设置只读属性
- 尝试访问不存在的属性
完整示例
-- 创建新接口
local ldbus = require('ldbus')
local l_interface = ldbus.interface
local my_interface = l_interface.new("com.example.SampleInterface")
-- 添加属性
my_interface:add_property("Version", "s", "1.0.0", true, 0) -- 只读版本字符串
my_interface:add_property("Temperature", "d", 20.0, false, 0) -- 可写的温度值
-- 添加方法
local function convert_temp(celsius)
local fahrenheit = celsius * 9/5 + 32
return fahrenheit
end
my_interface:add_method("ConvertCelsiusToF", "d", "d", convert_temp, 0)
-- 添加信号
my_interface:add_signal("TemperatureChanged", "d", 0)
-- 使用接口
my_interface:set_property("Temperature", 25.5)
local temp = my_interface:get_property("Temperature")
print("温度: " .. temp)
验证规则
- 接口名称:必须遵循反向域名约定(例如:"com.example.MyInterface")
- 成员名称:必须以字母或下划线开头,后跟字母、数字或下划线
- 签名:必须符合D-Bus类型签名规范
- 长度限制:接口名称≤255个字符,单个组件≤100个字符