Lua:将使用 XML dbus 定义发出消息的 Python 代码翻译成 Lua
Lua: translate a Python code that emits a message using a XML dbus definition into Lua
我在上一个问题的评论中问过这个问题,但我认为最好将它作为一个新的独立问题移到这里。
我正在尝试弄清楚如何使用 lgi DBus 将此 Python 代码转换为将 dbus 信号发射到 Lua:
class DBUSTestInterface(object):
"""
Server_XML definition.
Emit / Publish a signal that is a random integer every second
type='i' for integer.
"""
dbus = """
<node>
<interface name="com.test.device.aaa">
<signal name="get">
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='i'/>
</signal>
</interface>
</node>
"""
get = signal()
emit = DBUSTestInterface()
bus.publish("com.test.device.get", emit)
我怀疑(完全不确定)它必须向 introspectable 接口发送消息,类似于此:
local object = "/org/freedesktop/DBus"
local interface = "org.freedesktop.DBus.Introspectable"
local method = "Introspect"
local message = Gio.DBusMessage.new_method_call(name, object, interface, method)
message:set_body(GLib.Variant("(aoo)", {{location},session})) -- How do I set the same message as above?
但我不确定,我不知道如何使用 Python 中工作的 XML 设置邮件正文。
如果您能提供一些示例或指出我在哪里可以找到它,我将不胜感激!
谢谢!
呵呵,Google带我看一下https://github.com/pavouk/lgi/issues/220。
我觉得您的代码示例无法按原样工作/不是一些独立的 python 代码。因此,我将在文本中进行评论:
Emit / Publish a signal that is a random integer every second
Lua 执行此操作的代码(嗯,除了 "random integer",除非您认为 42
是随机的):
local lgi = require("lgi")
local Gio, GLib, GObject = lgi.Gio, lgi.GLib, lgi.GObject
local conn
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1, function()
if conn then
conn:emit_signal(nil, "/your/example/has/no/path",
"com.test.device.aaa", "get",
GLib.Variant("(sssssssi)", { "what", "are", "all",
"these", "strings", "for", "?", 42 }))
end
return true
end)
local function on_bus_acquire(con)
conn = con
local function arg(name, signature)
return Gio.DBusArgInfo{ name = name, signature = signature }
end
local interface_info = Gio.DBusInterfaceInfo {
name = "com.test.device.aaa",
signals = {
Gio.DBusSignalInfo{
name = "get",
args = {
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "i")
}
}
}
}
conn:register_object("/your/example/has/no/path", interface_info, nil)
end
Gio.bus_own_name(Gio.BusType.SESSION, "com.test.device.get", Gio.BusNameOwnerFlags.NONE,
GObject.Closure(on_bus_acquire), nil, nil)
GLib.MainLoop.new():run()
我在上一个问题的评论中问过这个问题,但我认为最好将它作为一个新的独立问题移到这里。
我正在尝试弄清楚如何使用 lgi DBus 将此 Python 代码转换为将 dbus 信号发射到 Lua:
class DBUSTestInterface(object):
"""
Server_XML definition.
Emit / Publish a signal that is a random integer every second
type='i' for integer.
"""
dbus = """
<node>
<interface name="com.test.device.aaa">
<signal name="get">
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='s'/>
<arg type='i'/>
</signal>
</interface>
</node>
"""
get = signal()
emit = DBUSTestInterface()
bus.publish("com.test.device.get", emit)
我怀疑(完全不确定)它必须向 introspectable 接口发送消息,类似于此:
local object = "/org/freedesktop/DBus"
local interface = "org.freedesktop.DBus.Introspectable"
local method = "Introspect"
local message = Gio.DBusMessage.new_method_call(name, object, interface, method)
message:set_body(GLib.Variant("(aoo)", {{location},session})) -- How do I set the same message as above?
但我不确定,我不知道如何使用 Python 中工作的 XML 设置邮件正文。
如果您能提供一些示例或指出我在哪里可以找到它,我将不胜感激!
谢谢!
呵呵,Google带我看一下https://github.com/pavouk/lgi/issues/220。
我觉得您的代码示例无法按原样工作/不是一些独立的 python 代码。因此,我将在文本中进行评论:
Emit / Publish a signal that is a random integer every second
Lua 执行此操作的代码(嗯,除了 "random integer",除非您认为 42
是随机的):
local lgi = require("lgi")
local Gio, GLib, GObject = lgi.Gio, lgi.GLib, lgi.GObject
local conn
GLib.timeout_add_seconds(GLib.PRIORITY_DEFAULT, 1, function()
if conn then
conn:emit_signal(nil, "/your/example/has/no/path",
"com.test.device.aaa", "get",
GLib.Variant("(sssssssi)", { "what", "are", "all",
"these", "strings", "for", "?", 42 }))
end
return true
end)
local function on_bus_acquire(con)
conn = con
local function arg(name, signature)
return Gio.DBusArgInfo{ name = name, signature = signature }
end
local interface_info = Gio.DBusInterfaceInfo {
name = "com.test.device.aaa",
signals = {
Gio.DBusSignalInfo{
name = "get",
args = {
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "s"),
arg("no_name?!?", "i")
}
}
}
}
conn:register_object("/your/example/has/no/path", interface_info, nil)
end
Gio.bus_own_name(Gio.BusType.SESSION, "com.test.device.get", Gio.BusNameOwnerFlags.NONE,
GObject.Closure(on_bus_acquire), nil, nil)
GLib.MainLoop.new():run()