Я написал простой скрипт на Python, чтобы зарегистрировать агента и подключения к Connman службы:Connman Подключение к службе: DBus UnknownMethod
#!/usr/bin/python
import gobject
import dbus
import dbus.service
import dbus.mainloop.glib
class Agent(dbus.service.Object):
@dbus.service.method("net.connman.Agent", in_signature='oa{sv}', out_signature='a{sv}')
def RequestInput(self, path, fields):
print(path, fields)
# TODO: fill the requested fields
response = None
return response
def Scan(technology):
path = "/net/connman/technology/" + technology
technology = dbus.Interface(bus.get_object("net.connman", path), "net.connman.Technology")
technology.Scan()
def FindService(ssid):
for path, properties in manager.GetServices():
name = properties["Name"]
security = extract_list(properties["Security"])
if (ssid == name):
return (path, properties)
return (None, None)
def Connect(ssid, passphrase):
Scan("wifi")
path, properties = FindService(ssid)
if (path is None):
print("Service with ssid =", ssid, "not found.")
return
print("path:", path)
service = dbus.Interface(bus.get_object("net.connman", path), "net.connmann.Service")
print("Connecting...");
try:
service.Connect(timeout=10000)
print("Done!")
except dbus.DBusException as error:
print("Failed: ", error._dbus_error_name, error.get_dbus_message())
if __name__ == '__main__':
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
ssid = "mySSID"
passphrase = "myPassphrase"
bus = dbus.SystemBus()
manager = dbus.Interface(bus.get_object('net.connman', "/"), 'net.connman.Manager')
path = "/test/agent"
object = Agent(bus, path)
object.ssid = ssid
try:
manager.RegisterAgent(path)
print("Agent registered!")
except:
print("Cannot register connman agent.")
Connect(ssid, passphrase)
mainloop = gobject.MainLoop()
mainloop.run()
Это выход:
Agent registered!
path: /net/connman/service/wifi_b723ec7500fd_464153545735422d312d43217351_managed_wep
Connecting...
Failed: org.freedesktop.DBus.Error.UnknownMethod
Method "Connect" with signature "" on interface "net.connmann.Service" doesn't exist
Кажется, Агент зарегистрирован, но интерфейс службы не распознает метод «Подключиться». Согласно документации, она должна существовать:
http://git.kernel.org/cgit/network/connman/connman.git/tree/doc/service-api.txt
, а также тест-Connman скрипт вызывает его:
http://git.kernel.org/cgit/network/connman/connman.git/tree/test/test-connman
Каков наилучший способ для отладки такого вопроса?
Я также добавил пару строк, чтобы увидеть методы Доступные на этом пути:
object = dbus.Interface(service, "org.freedesktop.DBus.Introspectable")
print(object.Introspect())
и это выход:
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
<node>
<interface name="org.freedesktop.DBus.Introspectable">
<method name="Introspect">
<arg name="xml" type="s" direction="out" />
</method>
</interface>
<interface name="net.connman.Service">
<method name="GetProperties">
<arg name="properties" type="a{sv}" direction="out" />
<annotation name="org.freedesktop.DBus.Deprecated" value="true" />
</method>
<method name="SetProperty">
<arg name="name" type="s" direction="in" />
<arg name="value" type="v" direction="in" />
</method>
<method name="ClearProperty">
<arg name="name" type="s" direction="in" />
</method>
<method name="Connect" />
<method name="Disconnect" />
<method name="Remove" />
<method name="MoveBefore">
<arg name="service" type="o" direction="in" />
</method>
<method name="MoveAfter">
<arg name="service" type="o" direction="in" />
</method>
<method name="ResetCounters" />
<signal name="PropertyChanged">
<arg name="name" type="s" />
<arg name="value" type="v" />
</signal>
</interface>
</node>
Метод Connect, без подписи есть! Почему он говорит: UnknownMethod?