connman Connect to Service: DBus UnknownMethod

2.7k Views Asked by At

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?

1

There are 1 best solutions below

0
On

There is a double "n" in net.connmann.Service

Should be

net.connman.Service