2016-05-15 3 views
1

schrieb ich einen einfachen Python-Skript, einen Agenten zu registrieren und zu einem ConnMan Dienst zu verbinden:ConnMan Verbindung zum Service: 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() 

Dies ist der Ausgang:

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 

Es scheint, die Agent wurde registriert, aber die Service-Schnittstelle erkennt die "Connect" -Methode nicht. Gemäß der Dokumentation sollte vorhanden sein:

http://git.kernel.org/cgit/network/connman/connman.git/tree/doc/service-api.txt

und auch der Test-ConnMan Skript nennt es:

http://git.kernel.org/cgit/network/connman/connman.git/tree/test/test-connman

Was ist der beste Weg, ein solches Problem zu debuggen?

Ich habe auch ein paar Zeilen die availables Methoden auf diesem Weg, um zu sehen:

object = dbus.Interface(service, "org.freedesktop.DBus.Introspectable") 
print(object.Introspect()) 

und dies ist die Ausgabe:

<!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> 

Die Connect-Methode ohne Unterschrift ist da! Warum es sagt: UnknownMethod?

Antwort

0

Es gibt ein Doppel "n" in net.connmann.Service

sein sollte

net.connman.Service

Verwandte Themen