I wrote a simple Python script to register an Agent and to connect to a connman Service:
#!/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()
This is the output:
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
It seems the Agent was registered but the Service interface doesn't recognize the "Connect" method. According to the documentation it should exist:
http://git.kernel.org/cgit/network/connman/connman.git/tree/doc/service-api.txt
and also the test-connman script calls it:
http://git.kernel.org/cgit/network/connman/connman.git/tree/test/test-connman
What is the best way to debug such an issue?
I also added a couple of lines to see the availables methods on that path:
object = dbus.Interface(service, "org.freedesktop.DBus.Introspectable")
print(object.Introspect())
and this is the output:
<!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>
The Connect method with no signature is there! Why it says: UnknownMethod?
There is a double "n" in net.connmann.Service
Should be
net.connman.Service