Lua: перевести код Python, который генерирует сообщение, используя определение XML dbus, в Lua - PullRequest
1 голос
/ 08 марта 2019

Я задал это в комментарии к предыдущему вопросу, но я думаю, что лучше перенести его сюда как новый независимый вопрос.

Я пытаюсь выяснить, как перевести этот код Python для передачи сигнала dbus в Lua, используя lgi DBus:

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)

Я подозреваю (совсем не уверен), что это нужно сделать, отправив сообщение на интроспективный интерфейс, что-то похожее на это:

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?

Но я не уверен, и я понятия не имею, как установить тело сообщения с XML, который работает в Python.

Если вы можете привести какой-нибудь пример или указать, где я могу его найти, я был бы признателен за это!

Спасибо!

1 Ответ

1 голос
/ 11 марта 2019

Хех, Google просто привел меня сюда, глядя на https://github.com/pavouk/lgi/issues/220.

Почему-то я чувствую, что ваш пример кода не может работать как есть / не является каким-то автономным кодом Python. Следовательно, я пойду с комментарием в тексте:

испускать / публиковать сигнал, который является случайным целым числом каждую секунду

Код Lua делает это (хорошо, за исключением «случайного целого числа», если вы не считаете 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()
...