lua lgi подписаться на сигнал DBus - PullRequest
0 голосов
/ 01 марта 2019

Я впервые использую LUA и пытаюсь подписать функцию обратного вызова, которая будет выполняться при получении сигнала DBus.Я нашел несколько примеров того, как посылать сигналы DBus, используя lgi, но я не нашел ничего о том, как прослушать сигнал.Есть ли какой-нибудь пример по этому поводу?в документации lgi я его не нашел.

Спасибо

[EDIT]

На всякий случай это кому-то полезно, мне удалось подписаться на сигнал используяdbus_proxy (https://github.com/stefano-m/lua-dbus_proxy). Этот пример кода подписывается на сигнал, а затем выдает его, чтобы узнать, вызывается ли обратный вызов:

local lgi = require('lgi')
local GLib = lgi.GLib 
local p = require('dbus_proxy')
local Bus = p.Bus
local Proxy = p.Proxy   

local proxy = Proxy:new(
  {
    bus = Bus.SESSION,
    name = "org.freedesktop.DBus",
    path= "/org/freedesktop/DBus",
    interface = "org.freedesktop.DBus"
  }
)

local called = false
local received_proxy
local received_params
local function callback(proxy_obj, ...)
  print('Hi!')
  called = true
  received_proxy = proxy_obj
  received_params = {...}
end
local signal_name = "NameOwnerChanged"
local sender_name = nil -- any sender
proxy:connect_signal(callback, signal_name, sender_name)

local bus_name = "com.example.Test2"
local DBUS_NAME_FLAG_REPLACE_EXISTING = 2
proxy:RequestName(bus_name, DBUS_NAME_FLAG_REPLACE_EXISTING)

main_loop = GLib.MainLoop()
main_loop:run()

Я буду продолжать его изучать

Также,Я пытаюсь выяснить, как преобразовать этот код 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)

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

Спасибо!

1 Ответ

0 голосов
/ 02 марта 2019

Вот пример кода, он подписывается на сигналы bluez PropertiesChanged для всех путей объектов на системной шине.Вы можете изменить тип шины, сигнал, имя интерфейса и т. Д. В соответствии с вашими требованиями и попробовать его.

local lgi = require 'lgi'
local GLib, Gio = lgi.GLib, lgi.Gio
local main_loop = GLib.MainLoop()

--Get a system bus
local bus = Gio.bus_get_sync(Gio.BusType.SYSTEM)

--Create a user callback function that needs to operate when signal is received
function onDBusSignalCallback(conn, sender, object_path, interface_name, signal_name, user_data)
        local str = string.format("SIGNAL - object_path:%s, interface_name:%s, signal_name:%s", object_path, interface_name, signal_name)
        print(str)
end


--Subscribe to any signal.
local sub_id = bus:signal_subscribe('org.bluez', 'org.freedesktop.DBus.Properties',
                'PropertiesChanged', nil, nil, Gio.DBusSignalFlags.NONE, onDBusSignalCallback)
if sub_id then
        print("Subscription id", sub_id)
end

main_loop:run()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...